diff options
author | Karl Berry <karl@freefriends.org> | 2011-04-27 18:16:27 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-04-27 18:16:27 +0000 |
commit | bc57a75463ee492cf7eedeb31291cb0b07681cd8 (patch) | |
tree | 3ce231cb3ca0a50cbed012275ad59bb383d935e6 /Build/source/utils/vlna | |
parent | e6fdf875e91bf1013e861b2ef46db6b43dda1a61 (diff) |
import vlna-1.5 from ftp://math.feld.cvut.cz/pub/olsak/vlna
git-svn-id: svn://tug.org/texlive/trunk@22221 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/vlna')
-rw-r--r-- | Build/source/utils/vlna/ChangeLog | 4 | ||||
-rw-r--r-- | Build/source/utils/vlna/Makefile.am | 4 | ||||
-rw-r--r-- | Build/source/utils/vlna/Makefile.in | 2 | ||||
-rw-r--r-- | Build/source/utils/vlna/README | 11 | ||||
-rwxr-xr-x | Build/source/utils/vlna/configure | 20 | ||||
-rw-r--r-- | Build/source/utils/vlna/configure.ac | 4 | ||||
-rw-r--r-- | Build/source/utils/vlna/vlna-cz.man | 131 | ||||
-rw-r--r-- | Build/source/utils/vlna/vlna.c | 389 | ||||
-rw-r--r-- | Build/source/utils/vlna/vlna.man | 212 | ||||
-rw-r--r-- | Build/source/utils/vlna/vlna.txt | 12 | ||||
-rw-r--r-- | Build/source/utils/vlna/vlna.w | 125 |
11 files changed, 619 insertions, 295 deletions
diff --git a/Build/source/utils/vlna/ChangeLog b/Build/source/utils/vlna/ChangeLog index 5c803b83b27..90598edeca0 100644 --- a/Build/source/utils/vlna/ChangeLog +++ b/Build/source/utils/vlna/ChangeLog @@ -1,3 +1,7 @@ +2011-04-27 Karl Berry <karl@tug.org> + + * Import 1.5 from ftp://math.feld.cvut.cz/pub/olsak/vlna. + 2009-08-22 Peter Breitenlohner <peb@mppmu.mpg.de> Avoid maximal compiler warnings. diff --git a/Build/source/utils/vlna/Makefile.am b/Build/source/utils/vlna/Makefile.am index b836ac31ddb..3511292221a 100644 --- a/Build/source/utils/vlna/Makefile.am +++ b/Build/source/utils/vlna/Makefile.am @@ -1,6 +1,6 @@ ## Makefile.am for the TeX Live subdirectory utils/vlna/ ## -## Copyright (C) 2008, 2009 Peter Breitenlohner <tex-live@tug.org> +## Copyright (C) 2008-2011 Peter Breitenlohner <tex-live@tug.org> ## You may freely use, modify and/or distribute this file. ## ACLOCAL_AMFLAGS = -I ../../m4 @@ -15,7 +15,7 @@ CSMAC = csmac.tex CWEB_TEX = vlna.tex vlna.idx vlna.scn CWEB_DVI = vlna.dvi -DOCS = README README.en vlna.txt +DOCS = README README.en vlna.txt vlna-cz.man EXTRA_DIST = $(CWEB_SRC) $(CSMAC) $(CWEB_TEX) $(CWEB_DVI) $(DOCS) diff --git a/Build/source/utils/vlna/Makefile.in b/Build/source/utils/vlna/Makefile.in index 6407a545cac..094cd4a38cd 100644 --- a/Build/source/utils/vlna/Makefile.in +++ b/Build/source/utils/vlna/Makefile.in @@ -200,7 +200,7 @@ CWEB_SRC = vlna.w CSMAC = csmac.tex CWEB_TEX = vlna.tex vlna.idx vlna.scn CWEB_DVI = vlna.dvi -DOCS = README README.en vlna.txt +DOCS = README README.en vlna.txt vlna-cz.man EXTRA_DIST = $(CWEB_SRC) $(CSMAC) $(CWEB_TEX) $(CWEB_DVI) $(DOCS) CLEANFILES = vlna.log vlna.toc all: all-am diff --git a/Build/source/utils/vlna/README b/Build/source/utils/vlna/README index fe8833775b7..5c4e09d1f02 100644 --- a/Build/source/utils/vlna/README +++ b/Build/source/utils/vlna/README @@ -1,5 +1,5 @@ -VLNA v1.2 +VLNA v1.3 ========= Program vlna přidává vlnky (místo původních mezer) za neslabičné předložky @@ -59,8 +59,15 @@ Děkuji panu Rudolfu Čejkovi za vytvoření Makefile a manuálové stranky k programu. Rovněž mu děkuji za odstranění drobných chyb programu, které se vyskytly ve verzi 1.0. -28. 2. 1995 Petr Olšák +Děkuji pánům Peteru Breitenlohnerovi a Zdeňku Wagnerovi za úpravu +nástojů k sestavení programu a za další dokumentaci, což pomohlo zařadit +program do TexLive. +18. 7. 2008 Petr Olšák + + +verze 1.3 (18. 7. 2008): + viz Changelog verze 1.2 (20. 5. 2002): oprava chyby "v<space><cr>lese" -> "v~~lese" a přidání patternu pro "\uv{v lese}" -> "\uv{v~lese}". diff --git a/Build/source/utils/vlna/configure b/Build/source/utils/vlna/configure index 483302afb37..ffa6816acd3 100755 --- a/Build/source/utils/vlna/configure +++ b/Build/source/utils/vlna/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.68 for vlna for TeX Live 1.3. +# Generated by GNU Autoconf 2.68 for vlna for TeX Live 1.5. # # Report bugs to <tex-live@tug.org>. # @@ -559,8 +559,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='vlna for TeX Live' PACKAGE_TARNAME='vlna-for-tex-live' -PACKAGE_VERSION='1.3' -PACKAGE_STRING='vlna for TeX Live 1.3' +PACKAGE_VERSION='1.5' +PACKAGE_STRING='vlna for TeX Live 1.5' PACKAGE_BUGREPORT='tex-live@tug.org' PACKAGE_URL='' @@ -1212,7 +1212,7 @@ 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 <<_ACEOF -\`configure' configures vlna for TeX Live 1.3 to adapt to many kinds of systems. +\`configure' configures vlna for TeX Live 1.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1279,7 +1279,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of vlna for TeX Live 1.3:";; + short | recursive ) echo "Configuration of vlna for TeX Live 1.5:";; esac cat <<\_ACEOF @@ -1370,7 +1370,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -vlna for TeX Live configure 1.3 +vlna for TeX Live configure 1.5 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. @@ -1425,7 +1425,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by vlna for TeX Live $as_me 1.3, which was +It was created by vlna for TeX Live $as_me 1.5, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ @@ -2244,7 +2244,7 @@ fi # Define the identity of the package. PACKAGE='vlna-for-tex-live' - VERSION='1.3' + VERSION='1.5' # Some tools Automake needs. @@ -4078,7 +4078,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by vlna for TeX Live $as_me 1.3, which was +This file was extended by vlna for TeX Live $as_me 1.5, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4135,7 +4135,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -vlna for TeX Live config.status 1.3 +vlna for TeX Live config.status 1.5 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" diff --git a/Build/source/utils/vlna/configure.ac b/Build/source/utils/vlna/configure.ac index 16837a25174..9d177c53ca1 100644 --- a/Build/source/utils/vlna/configure.ac +++ b/Build/source/utils/vlna/configure.ac @@ -1,12 +1,12 @@ dnl Process this file with autoconf to produce a configure script. dnl -dnl Copyright (C) 2009 Peter Breitenlohner <tex-live@tug.org> +dnl Copyright (C) 2009-2011 Peter Breitenlohner <tex-live@tug.org> dnl dnl This file is free software; the copyright holder dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl -AC_INIT([vlna for TeX Live], [1.3], [tex-live@tug.org]) +AC_INIT([vlna for TeX Live], [1.5], [tex-live@tug.org]) AC_PREREQ([2.65]) AC_CONFIG_SRCDIR([vlna.w]) AC_CONFIG_AUX_DIR([../../build-aux]) diff --git a/Build/source/utils/vlna/vlna-cz.man b/Build/source/utils/vlna/vlna-cz.man new file mode 100644 index 00000000000..334b683572b --- /dev/null +++ b/Build/source/utils/vlna/vlna-cz.man @@ -0,0 +1,131 @@ +.\" $Id$ +.TH VLNA 1 "4. unora 1998" +.nh +.SH NAZEV +vlna \- pridani vlnek za neslabicne predlozky v TeXu +.SH POUZITI +.B vlna +[\fIvolby\fP] +[\fIsoubory\fP] +.SH POPIS +Program +.B vlna +pridava vlnky (misto puvodnich mezer) za neslabicne predlozky +ve vstupnich souborech pro TeX, coz zabrani zlomu radku v nezadoucich mistech. +.PP +Veskere aktivity programu je mozne vypnout sekvenci \fB%~-\fP a zapnout +sekvenci \fB%~+\fP (mezi uvedenymi znaky muze byt libovolne mnozstvi mezer). +.PP +Pred predlozkou se muze nachazet libovolne mnozstvi oteviracich zavorek, +pred kterymi se musi nachazet mezera nebo zacatek radku. Pred +oteviraci svorkou muze byt take misto mezery TeXova +\(lq\\sekvence\(rq (od verze 1.2). +Napr. za \(lq([{(V\(rq na pocatku radku bude vlnka pridana. +Stejne tak se text \(lq\\uv{V lese}\(rq promeni na +\(lq\\uv{V~lese}\(rq. +.PP +Program kontroluje konzistenci matematickych prostredi (neni-li uveden +parametr \fB\-m\fP). +Vstup do \fIdisplay\fP rezimu (\fB$$\fP) uvnitr \fItext\fP rezimu (\fB$\fP) +(napr. \fB$\fP...\fB$$\fP...\fB$\fP) znamena varovani a prechod do +\fIdisplay\fP. +Podobne prazdny radek uvnitr \fItext\fP nebo \fIdisplay\fP rezimu znamena +vypis varovani a prechod do nematematickeho (standardniho) rezimu. +Uvnitr rezimu \fIdisplay\fP se ignoruji vyskyty samostatneho znaku \fB$\fP, +jelikoz byva vetsinou soucasti konstrukce \fB\\hbox\fP. +.PP +Program kontroluje konzistenci verbatim rezimu na konci souboru. +Nebyl-li ukoncen, vypise se varovani. +Kontrola se neprovadi, pokud je pouzita volba \fB\-n\fP nebo \fB\-w\fP. +.PP +Program nedoplnuje vlnky za samostatna pismena, ktera jako predlozky vypadaji, +ale nasleduji bezprostredne za sekvencemi \fB\\TeX\fP nebo \fB\\LaTeX\fP. +Napr. do textu \(lq\fBVlastnosti \\TeX u jsou\fP\(rq nebude zadna vlnka +doplnena. +.SH VOLBY +Volby jsou nepovinne a mohou byt uvedeny v libovolnem poradi, ale nemohou +byt spojovany. +.TP +.B \-f +Filtr. Jmena souboru jsou interpretovana takto: +.RS +.TP 4 +.B vlna \-f \fIsoubor1 soubor2\fP +Vstup je \fIsoubor1\fP, vystup \fIsoubor2\fP. +.TP 4 +.B vlna \-f \fIsoubor1\fP +Vstup je \fIsoubor1\fP, vystup \fIstdout\fP. +.TP 4 +.B vlna \-f +Vstup je \fIstdin\fP, vystup \fIstdout\fP. +.TP 4 +\fBvlna\fP \fIsoubor1\fP [\fIsoubor2\fP [\fIsoubor3\fP ...]] +Neni-li uveden parametr \fB\-f\fP, kazdy soubor je zpracovavan samostatne. +.RE +.TP +.B \-s +Tichy rezim. Program potlaci vypis uvodni zpravy, varovnych zprav a +statistik o zmenach v souborech +(bez uvedeni parametru jsou zpravy vypisovany na \fIstderr\fP). +V tichem rezimu se vypise jen chyba, ktera predcasne ukonci +cinnost programu. +.TP +.B \-r +Nevytvaret (mazat) zalohy. +Parametr \fB\-r\fP nema vliv, pokud je uveden spolu s \fB\-f\fP. +V opacnem pripade se ke kazdemu souboru vytvari zaloha s vlnkou na konci jmena +a parametr \fB\-r\fP zpusobi, ze na konci zpracovani jsou tyto zalohy mazany. +.TP +.B \-v \fIznaky\fP +Znaky povazovane za neslabicne predlozky, za ktere ma byt pridavana +vlnka. Implicitni hodnota je \fB\-v\ KkSsVvZzOoUuAI\fP. (Mezi +\fB\-v\fP a skupinou znaku musi byt mezera.) +.TP +.B \-x \fIkod\fP +vymezuje string (kod je hexadecimalni zapis stringu), +ktery bude vkladan misto implicitni vlnky na vyhledana mista. +Priklad \fB\-x C2A0\fP vymezuje dvouznakovy string: misto kazde vlnky budou +vlozeny dva byty, prvni s kodem C2 a druhy s kodem A0. Podle unicodove tabulky +tento priklad tedy zpusobi nahrazovani znakem NO-BREAK SPACE pri kodovani UTF8. +Jine priklady: \fB\-x 00A0\fP nahrazovani znakem NO-BREAK SPACE pri +kodovani UTF16, \fB\-x 41484F4A\fP nahrazovani textem AHOJ. +Mezi \fB\-x\fP a kodem musi byt mezera. +.TP +.B \-m +Ignorovani prechodu do matematickych prostredi +(\fB$\fP...\fB$\fP a \fB$$\fP...\fB$$\fP). +Parametr \fB\-m\fP zpusobi vlnkovani i v matematickych prostredich, ktera +se implicitne vynechavaji. +.TP +.B \-n +Ignorovani verbatim rezimu (\fB\\verb\fP\fI<znak>\fP...\fI<znak>\fP, +\fB\\begtt\fP...\fB\\endtt\fP). +Parametr \fB\-n\fP zpusobi vlnkovani i ve verbatim rezimu, ktery se +implicitne vynechava. +.TP +.B \-l +LaTeX. Pro rozpoznani matematickeho rezimu jsou pridana prostredi +\fB\\begin{display}\fP...\fB\\end{display}\fP a +\fB\\begin{equation}\fP...\fB\\end{equation}\fP. +Pro rozpoznani verbatim rezimu je pridano LaTeXove prostredi +\fB\\begin{verbatim}\fP...\fB\\end{verbatim}\fP. +.TP +.B \-w +Web. Pro rozpoznani verbatim rezimu jsou pridany sekvence +\fB@<\fP, \fB@d\fP...\fB@*\fP, \fB@\fP\fImezera\fP nebo \fB@>|\fP. +Ve zdrojovem kodu se tedy nevlnkuje program, ale jen komentare. +.SH PRIKLADY +.TP +.B vlna \-m \-n \-s \-r \fIsoubor\fP +Volani priblizne odpovida volani puvodniho programu \fBvlnka\fP. +(Navic se neprovadi vlnkovani za sekvencemi \fB\\TeX\fP a \fB\\LaTeX\fP.) +.TP +.B vlna *.tex +Vlnkovani vsech souboru s priponou \fBtex\fP. +(Pouze na UNIXu.) +.TP +.B vlna \-f soubor > /dev/null +Test konzistence matematickeho a verbatim rezimu bez provedeni zmen. +(Pouze na UNIXu.) +.SH AUTOR +Petr Olsak <olsak@math.feld.cvut.cz>. Manualovou stranku a Makefile vytvoril Rulolf Cejka diff --git a/Build/source/utils/vlna/vlna.c b/Build/source/utils/vlna/vlna.c index 76998053f81..ab95587c8d1 100644 --- a/Build/source/utils/vlna/vlna.c +++ b/Build/source/utils/vlna/vlna.c @@ -1,4 +1,4 @@ -#define BANNER "This is program vlna, version 1.2, (c) 1995, 2002 Petr Olsak\n" \ +#define BANNER "This is program vlna, version 1.5, (c) 1995, 2002, 2009, 2010 Petr Olsak\n" \ #define OK 0 #define WARNING 1 @@ -21,33 +21,39 @@ #define DISPLAYMODE 2 #define VERBMODE 3 /*1:*/ -#line 19 "vlna.w" +#line 19 "./vlna.w" /*3:*/ -#line 39 "vlna.w" +#line 39 "./vlna.w" #include <stdio.h> #include <string.h> #include <stdlib.h> /*:3*/ -#line 20 "vlna.w" +#line 20 "./vlna.w" /*4:*/ -#line 56 "vlna.w" +#line 56 "./vlna.w" char*prog_name; int status; /*:4*//*7:*/ -#line 131 "vlna.w" +#line 136 "./vlna.w" int isfilter= 0,silent= 0,rmbackup= 0,nomath= 0,noverb= 0,web= 0,latex= 0; char charsetdefault[]= "KkSsVvZzOoUuAI"; char*charset= charsetdefault; -/*:7*//*15:*/ -#line 289 "vlna.w" +/*:7*//*8:*/ +#line 146 "./vlna.w" + +unsigned char tiestr[MAXLEN]; +int tiestrlen; + +/*:8*//*17:*/ +#line 327 "./vlna.w" typedef struct PATITEM{ char*str; @@ -60,8 +66,8 @@ void(*proc)(void); struct PATTERN*next; }PATTERN; -/*:15*//*16:*/ -#line 341 "vlna.w" +/*:17*//*18:*/ +#line 379 "./vlna.w" PATITEM*lapi[MAXPATT]; PATTERN*lapt[MAXPATT]; @@ -71,21 +77,27 @@ char c; char buff[MAXBUFF]; int ind; -/*:16*//*20:*/ -#line 411 "vlna.w" +/*:18*//*19:*/ +#line 398 "./vlna.w" + +char buffnz[8]; +int inz; + +/*:19*//*23:*/ +#line 463 "./vlna.w" char strings[512]; int i; -/*:20*//*25:*/ -#line 496 "vlna.w" +/*:23*//*28:*/ +#line 548 "./vlna.w" char*filename; long int numline,numchanges; int mode; -/*:25*//*33:*/ -#line 626 "vlna.w" +/*:28*//*36:*/ +#line 686 "./vlna.w" char tblanks[]= " ~\t"; char blanks[]= " \t"; @@ -100,11 +112,11 @@ char openbrace[]= "{"; char letters[]= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; PATTERN*vlnkalist,*mathlist,*parcheck,*verblist; -/*:33*/ -#line 21 "vlna.w" +/*:36*/ +#line 21 "./vlna.w" /*6:*/ -#line 108 "vlna.w" +#line 112 "./vlna.w" static void printusage(void) { @@ -117,6 +129,7 @@ fprintf(stderr, " -s : silent: no messages to stderr\n" " -r : rmbackup: if nofilter, removes temporary files\n" " -v charset : set of lettres to add tie, default: KkSsVvZzOoUuAI\n" +" -x code : code for tie symbol, default: 7E, example -x C2A0\n" " -m : nomath: ignores math modes\n" " -n : noverb: ignores verbatim modes\n" " -l : LaTeX mode\n" @@ -124,15 +137,36 @@ fprintf(stderr, } /*:6*//*10:*/ -#line 166 "vlna.w" +#line 174 "./vlna.w" + +unsigned char hexnum(char c){ +if(c>='0'&&c<='9')return c-'0'; +if(c>='A'&&c<='F')return c-'A'+10; +if(c>='a'&&c<='f')return c-'a'+10; +printusage(),exit(BAD_OPTIONS); +} +void settiestr(char*s){ +int i,j,c; +i= strlen(s); +if((i> 2*MAXLEN)||i%2==1)printusage(),exit(BAD_OPTIONS); +tiestrlen= i/2; +j= 0; +for(i= 0;i<tiestrlen;i++){ +tiestr[i]= hexnum(s[j++])<<4; +tiestr[i]+= hexnum(s[j++]); +} +} + +/*:10*//*12:*/ +#line 204 "./vlna.w" static void ioerr(char*f) { fprintf(stderr,"%s: cannot open file %s\n",prog_name,f); } -/*:10*//*17:*/ -#line 354 "vlna.w" +/*:12*//*20:*/ +#line 406 "./vlna.w" static void*myalloc(int size) { @@ -146,8 +180,8 @@ exit(BAD_PROGRAM); return p; } -/*:17*//*18:*/ -#line 371 "vlna.w" +/*:20*//*21:*/ +#line 423 "./vlna.w" static PATTERN*setpattern(void(*proc)(void)) { @@ -162,8 +196,8 @@ lastpi= NULL; return pp; } -/*:18*//*19:*/ -#line 389 "vlna.w" +/*:21*//*22:*/ +#line 441 "./vlna.w" static void setpi(char*str,int flag) { @@ -176,8 +210,8 @@ else lastpi->next= p; lastpi= p; } -/*:19*//*22:*/ -#line 422 "vlna.w" +/*:22*//*25:*/ +#line 474 "./vlna.w" static PATTERN*normalpattern(void(*proc)(void),const char*str) { @@ -198,8 +232,8 @@ j++; return pp; } -/*:22*//*23:*/ -#line 458 "vlna.w" +/*:25*//*26:*/ +#line 510 "./vlna.w" static int match(PATITEM*p) { @@ -211,8 +245,8 @@ case ANY:return 0; case ONE:if(p->next==NULL)return FOUND; return 1; case ONE_NOT:return NOFOUND; -case ANY_NOT:/*24:*/ -#line 476 "vlna.w" +case ANY_NOT:/*27:*/ +#line 528 "./vlna.w" switch(m= match(p->next)){ case NOFOUND:return NOFOUND; @@ -220,61 +254,70 @@ case FOUND:return FOUND; default:return 1+m; } -/*:24*/ -#line 469 "vlna.w" +/*:27*/ +#line 521 "./vlna.w" ; } return 0; } -/*:23*//*36:*/ -#line 659 "vlna.w" +/*:26*//*39:*/ +#line 727 "./vlna.w" static void vlnkain(void) { -char p; +int i; +char p,z; ind--; p= buff[ind--]; -while(strchr(blanks,buff[ind])!=NULL)ind--; -ind++; -buff[ind++]= '~'; +z= buff[ind]; +while(!buff[ind]||(strchr(blanks,buff[ind])!=NULL))ind--; +if(!buff[++ind]&&tiestr[0])ind++; +for(i= 0;i<tiestrlen;i++)buff[ind++]= tiestr[i]; +i= tiestrlen; +if(!tiestr[0])i--; +if(!z&&(i%2))buff[ind++]= 0; buff[ind++]= p; numchanges++; } -/*:36*//*38:*/ -#line 698 "vlna.w" +/*:39*//*41:*/ +#line 771 "./vlna.w" static void vlnkacr(void) { -char p; +char p,z; int i,j; ind--; p= buff[ind--]; -while(strchr(blankscr,buff[ind])!=NULL)ind--; +z= buff[ind]; +while(!buff[ind]||(strchr(blankscr,buff[ind])!=NULL))ind--; i= ind; while(i>=0&&(strchr(blankscr,buff[i])==NULL))i--; j= i; -while(i>=0&&(strchr(blanks,buff[i])!=NULL))i--; +while(i>=0&&(!buff[ind]||(strchr(blanks,buff[i])!=NULL)))i--; if(i>=0&&buff[i]=='\n')j= -1; if(j>=0)buff[j]= '\n'; else numline--; -ind++; -buff[ind++]= '~'; +if(!buff[++ind]&&tiestr[0])ind++; +for(i= 0;i<tiestrlen;i++)buff[ind++]= tiestr[i]; +i= tiestrlen; +if(!tiestr[0])i--; +if(!z&&(i%2))buff[ind++]= 0; buff[ind++]= p; numchanges++; } -/*:38*//*41:*/ -#line 764 "vlna.w" +/*:41*//*44:*/ +#line 841 "./vlna.w" static void tielock(void) { c= 1; } -/*:41*//*42:*/ -#line 773 "vlna.w" +/*:44*//*45:*/ +#line 850 "./vlna.w" static void printwarning(void) { @@ -285,8 +328,8 @@ filename,numline-(c=='\n'?1:0)); status= WARNING; } -/*:42*//*44:*/ -#line 798 "vlna.w" +/*:45*//*47:*/ +#line 875 "./vlna.w" static void mathin(void) { @@ -301,12 +344,12 @@ mode= TEXTMODE; normallist= listpatt= vlnkalist; } -/*:44*//*45:*/ -#line 816 "vlna.w" +/*:47*//*48:*/ +#line 893 "./vlna.w" static void onedollar(void) { -if(buff[ind-3]=='\\'||(buff[ind-3]=='$'&&buff[ind-4]!='\\'))return; +if(buffnz[inz-3]=='\\'||(buffnz[inz-3]=='$'&&buffnz[inz-4]!='\\'))return; if(mode==DISPLAYMODE)printwarning(); else{ if(mode==TEXTMODE)mathin(); @@ -314,8 +357,8 @@ else mathout(); } } -/*:45*//*47:*/ -#line 835 "vlna.w" +/*:48*//*50:*/ +#line 912 "./vlna.w" static void checkmode(void) { @@ -326,8 +369,8 @@ normallist= listpatt= vlnkalist; } } -/*:47*//*49:*/ -#line 861 "vlna.w" +/*:50*//*52:*/ +#line 938 "./vlna.w" static void displayin(void) { @@ -341,13 +384,13 @@ mode= TEXTMODE;normallist= listpatt= vlnkalist; } static void twodollars(void) { -if(buff[ind-3]=='\\')return; +if(buffnz[inz-3]=='\\')return; if(mode==DISPLAYMODE)displayout(); else displayin(); } -/*:49*//*51:*/ -#line 910 "vlna.w" +/*:52*//*54:*/ +#line 987 "./vlna.w" int prevmode; PATTERN*prevlist,*verboutlist[4]; @@ -363,8 +406,8 @@ listpatt->next= NULL; mode= VERBMODE; } -/*:51*//*52:*/ -#line 931 "vlna.w" +/*:54*//*55:*/ +#line 1008 "./vlna.w" static void verbin(void) { @@ -376,7 +419,7 @@ case't':i= 1;break; case'm':i= 2;break; case'<':; case'd':i= 3; -if(buff[ind-3]=='@')return; +if(buffnz[inz-3]=='@')return; break; } listpatt= normallist= verboutlist[i]; @@ -385,13 +428,13 @@ if(c!='<'&&c!='d')listpatt->next= NULL; mode= VERBMODE; } -/*:52*//*53:*/ -#line 951 "vlna.w" +/*:55*//*56:*/ +#line 1028 "./vlna.w" static void verbout(void) { if(mode!=VERBMODE)return; -if(web&&buff[ind-2]=='@'&&buff[ind-3]=='@')return; +if(web&&buffnz[inz-2]=='@'&&buffnz[inz-3]=='@')return; mode= prevmode; normallist->next= prevlist; switch(mode){ @@ -401,8 +444,8 @@ case TEXTMODE:normallist= listpatt= vlnkalist;break; } } -/*:53*//*55:*/ -#line 973 "vlna.w" +/*:56*//*58:*/ +#line 1050 "./vlna.w" static void tieoff(void) { @@ -413,11 +456,11 @@ static void tieon(void) normallist= vlnkalist; } -/*:55*/ -#line 22 "vlna.w" +/*:58*/ +#line 22 "./vlna.w" -/*26:*/ -#line 505 "vlna.w" +/*29:*/ +#line 557 "./vlna.w" static void tie(FILE*input,FILE*output) { @@ -427,35 +470,48 @@ int ic; PATTERN*pp; PATITEM*pi; -/*27:*/ -#line 535 "vlna.w" +/*30:*/ +#line 593 "./vlna.w" for(k= 0;k<MAXPATT;k++)lapi[k]= NULL; c= '\n'; -buff[0]= mode= ap= 0;ind= 1; +buff[0]= 1;mode= ap= 0;ind= 1; +for(inz= 0;inz<4;inz++)buffnz[inz]= 0; +inz= 4; numline= 1;numchanges= 0; mode= TEXTMODE; -/*:27*//*35:*/ -#line 656 "vlna.w" +/*:30*//*38:*/ +#line 716 "./vlna.w" listpatt= normallist= vlnkalist; -/*:35*/ -#line 514 "vlna.w" +/*:38*/ +#line 566 "./vlna.w" ; while(!feof(input)){ -/*30:*/ -#line 580 "vlna.w" +if(ap==0&&ind> BUFI&&c!='\\')/*31:*/ +#line 611 "./vlna.w" + +{ +fwrite(&buff[1],ind-1,1,output); +ind= 1; +} + +/*:31*/ +#line 569 "./vlna.w" +; +/*33:*/ +#line 640 "./vlna.w" pp= listpatt; -while(pp!=NULL){ +if(c)while(pp!=NULL){ switch(m= match(pp->patt)){ case FOUND:(*pp->proc)(); case NOFOUND:break; -default:/*31:*/ -#line 595 "vlna.w" +default:/*34:*/ +#line 655 "./vlna.w" pi= pp->patt; while(m--)pi= pi->next; @@ -474,27 +530,15 @@ exit(BAD_PROGRAM); lapt[k]= pp;lapi[k]= pi;ap++; } -/*:31*/ -#line 586 "vlna.w" +/*:34*/ +#line 646 "./vlna.w" ; } pp= pp->next; } -/*:30*/ -#line 517 "vlna.w" -; -if(ap==0&&ind> BUFI&&c!='\\')/*28:*/ -#line 550 "vlna.w" - -{ -buff[ind]= 0; -fputs(&buff[1],output); -ind= 1; -} - -/*:28*/ -#line 518 "vlna.w" +/*:33*/ +#line 570 "./vlna.w" ; if(ind>=MAXBUFF){ fprintf(stderr,"Operating buffer overflow, is anything wrong?\n"); @@ -503,10 +547,16 @@ exit(BAD_PROGRAM); if((ic= getc(input))==EOF) break; buff[ind++]= c= ic; +if(c==0)continue; +if(inz>=8){ +for(inz= 0;inz<4;inz++)buffnz[inz]= buffnz[inz+4]; +inz= 4; +} +buffnz[inz++]= c; if(c=='\n')numline++,listpatt= normallist; -if(c=='%'&&mode!=VERBMODE&&buff[ind-2]!='\\')listpatt= commentlist; -/*29:*/ -#line 563 "vlna.w" +if(c=='%'&&mode!=VERBMODE&&buffnz[inz-2]!='\\')listpatt= commentlist; +/*32:*/ +#line 623 "./vlna.w" n= ap;k= 0; while(n){ @@ -520,56 +570,57 @@ default:while(m--)lapi[k]= lapi[k]->next; k++;n--; } -/*:29*/ -#line 528 "vlna.w" +/*:32*/ +#line 586 "./vlna.w" ; } -/*28:*/ -#line 550 "vlna.w" +/*31:*/ +#line 611 "./vlna.w" { -buff[ind]= 0; -fputs(&buff[1],output); +fwrite(&buff[1],ind-1,1,output); ind= 1; } -/*:28*/ -#line 530 "vlna.w" +/*:31*/ +#line 588 "./vlna.w" ; if(!web)checkmode(); -if(!silent)/*32:*/ -#line 614 "vlna.w" +if(!silent)/*35:*/ +#line 674 "./vlna.w" fprintf(stderr,"~~~ file: %s\t lines: %ld, changes: %ld\n", filename,numline,numchanges); -/*:32*/ -#line 532 "vlna.w" +/*:35*/ +#line 590 "./vlna.w" ; } -/*:26*/ -#line 23 "vlna.w" +/*:29*/ +#line 23 "./vlna.w" /*5:*/ -#line 61 "vlna.w" +#line 61 "./vlna.w" int main(int argc,char**argv) { -/*9:*/ -#line 159 "vlna.w" +/*11:*/ +#line 197 "./vlna.w" FILE*infile,*outfile; char backup[MAXLEN]; int j; -/*:9*/ -#line 64 "vlna.w" +/*:11*/ +#line 64 "./vlna.w" ; prog_name= argv[0];status= OK; -/*8:*/ -#line 136 "vlna.w" +/*9:*/ +#line 150 "./vlna.w" +tiestr[0]= '~'; +tiestrlen= 1; while(argc> 1&&argv[1][0]=='-'){ if(argv[1][2]!=0)printusage(),exit(BAD_OPTIONS); switch(argv[1][1]){ @@ -578,6 +629,8 @@ case's':silent= 1;break; case'r':rmbackup= 1;break; case'v':if(argc<2)printusage(),exit(BAD_OPTIONS); argv++;argc--;charset= argv[1];break; +case'x':if(argc<2)printusage(),exit(BAD_OPTIONS); +argv++;argc--;settiestr(argv[1]);break; case'm':nomath= 1;break; case'n':noverb= 1;break; case'l':latex= 1;break; @@ -588,19 +641,19 @@ default:printusage(),exit(BAD_OPTIONS); argc--;argv++; } -/*:8*/ -#line 66 "vlna.w" +/*:9*/ +#line 66 "./vlna.w" ; if(!silent)fprintf(stderr,BANNER); -/*21:*/ -#line 416 "vlna.w" +/*24:*/ +#line 468 "./vlna.w" for(i= 0;i<256;i++){ strings[2*i]= (char)i;strings[2*i+1]= 0; } -/*:21*//*34:*/ -#line 646 "vlna.w" +/*:24*//*37:*/ +#line 706 "./vlna.w" vlnkalist= setpattern(vlnkain); setpi(tblankscr,ONE); @@ -611,8 +664,8 @@ setpi(blanks,ONE); setpi(blanks,ANY); setpi(nochar,ONE_NOT); -/*:34*//*37:*/ -#line 674 "vlna.w" +/*:37*//*40:*/ +#line 747 "./vlna.w" setpattern(vlnkacr); setpi(tblankscr,ONE); @@ -624,8 +677,8 @@ setpi(cr,ONE); setpi(blanks,ANY); setpi(nochar,ONE_NOT); -/*:37*//*39:*/ -#line 720 "vlna.w" +/*:40*//*42:*/ +#line 797 "./vlna.w" setpattern(vlnkain); setpi(tblankscr,ONE); @@ -654,16 +707,16 @@ setpi(nochar,ONE_NOT); -/*:39*//*40:*/ -#line 753 "vlna.w" +/*:42*//*43:*/ +#line 830 "./vlna.w" normalpattern(tielock,"\\TeX"); setpi(blankscr,ONE); normalpattern(tielock,"\\LaTeX"); setpi(blankscr,ONE); -/*:40*//*43:*/ -#line 787 "vlna.w" +/*:43*//*46:*/ +#line 864 "./vlna.w" if(!nomath){ mathlist= setpattern(onedollar); @@ -675,16 +728,16 @@ normalpattern(mathout,"\\end.{math}"); } } -/*:43*//*46:*/ -#line 829 "vlna.w" +/*:46*//*49:*/ +#line 906 "./vlna.w" parcheck= setpattern(checkmode); setpi(cr,ONE); setpi(blanks,ANY); setpi(cr,ONE); -/*:46*//*48:*/ -#line 850 "vlna.w" +/*:49*//*51:*/ +#line 927 "./vlna.w" if(!nomath){ normalpattern(twodollars,"$$"); @@ -696,8 +749,8 @@ normalpattern(displayout,"\\end.{equation"); } } -/*:48*//*50:*/ -#line 882 "vlna.w" +/*:51*//*53:*/ +#line 959 "./vlna.w" if(!noverb){ verblist= normalpattern(verbinchar,"\\verb"); @@ -723,21 +776,21 @@ normalpattern(verbout,"@>|"); } -/*:50*//*54:*/ -#line 968 "vlna.w" +/*:53*//*57:*/ +#line 1045 "./vlna.w" lastpt= 0; commentlist= normalpattern(tieoff,"%.~.-"); normalpattern(tieon,"%.~.+"); -/*:54*/ -#line 68 "vlna.w" +/*:57*/ +#line 68 "./vlna.w" ; -/*11:*/ -#line 173 "vlna.w" +/*13:*/ +#line 211 "./vlna.w" -if(isfilter)/*12:*/ -#line 185 "vlna.w" +if(isfilter)/*14:*/ +#line 223 "./vlna.w" { if(argc> 3)printusage(),exit(BAD_OPTIONS); @@ -753,18 +806,18 @@ if(outfile!=stdout)fclose(outfile); if(infile!=stdin)fclose(infile); } -/*:12*/ -#line 174 "vlna.w" +/*:14*/ +#line 212 "./vlna.w" -else/*13:*/ -#line 208 "vlna.w" +else/*15:*/ +#line 246 "./vlna.w" { if(argc==1)printusage(),exit(BAD_OPTIONS); while(argc> 1){ argc--;argv++; -/*14:*/ -#line 239 "vlna.w" +/*16:*/ +#line 277 "./vlna.w" infile= NULL; j= strlen(argv[0])-1; @@ -780,8 +833,8 @@ j= rename(argv[0],backup); if(j==0)infile= fopen(backup,"r"); } -/*:14*/ -#line 213 "vlna.w" +/*:16*/ +#line 251 "./vlna.w" ; if(infile==NULL){ ioerr(argv[0]);continue; @@ -800,18 +853,18 @@ if(rmbackup)remove(backup); } } -/*:13*/ -#line 175 "vlna.w" +/*:15*/ +#line 213 "./vlna.w" -/*:11*/ -#line 69 "vlna.w" +/*:13*/ +#line 69 "./vlna.w" ; return status; } /*:5*/ -#line 24 "vlna.w" +#line 24 "./vlna.w" /*:1*/ diff --git a/Build/source/utils/vlna/vlna.man b/Build/source/utils/vlna/vlna.man index c132823f40c..691b3cb7128 100644 --- a/Build/source/utils/vlna/vlna.man +++ b/Build/source/utils/vlna/vlna.man @@ -1,121 +1,163 @@ .\" $Id$ -.TH VLNA 1 "4. unora 1998" +.TH VLNA 1 "March 30 2009" .nh -.SH NAZEV -vlna \- pridani vlnek za neslabicne predlozky v TeXu -.SH POUZITI +.SH NAME +vlna \- adds tilde after each non-syllabic preposition +.SH USAGE .B vlna -[\fIvolby\fP] -[\fIsoubory\fP] -.SH POPIS -Program +[\fIoptions\fP] +[\fIfilenames\fP] +.SH PREFACE +There exists a special Czech and Slovak typographical rule: you cannot +leave the non-syllabic preposition on the end of one line and continue +writting text on next line. For example, +you cannot write down the text "v lese" (in a forest) like +"v<new-line>lese". The program vlna adds the asciitilde +between such preposition and the next word and removes the space(s) in +this place. It means, the program converts "v lese" to "v~lese". You +can use this program as a preporcessor before TeXing. Moreower, you +can set another sequence to store instead asciitilte (see the +\fB\-x\fP option). +.SH DESCRIPTION +The program .B vlna -pridava vlnky (misto puvodnich mezer) za neslabicne predlozky -ve vstupnich souborech pro TeX, coz zabrani zlomu radku v nezadoucich mistech. +processes one or more files, searches the non-syllabic prepositions +followed by space(s) in these files and converts this/these space(s) +to asciitilde for each such occurrence. .PP -Veskere aktivity programu je mozne vypnout sekvenci \fB%~-\fP a zapnout -sekvenci \fB%~+\fP (mezi uvedenymi znaky muze byt libovolne mnozstvi mezer). +In the processed file, the activity of the program can be blocked by +\fB%~-\fP sequence and the activity can be restored again by the +\fB%~+\fP sequence. These sequences can include spaces, it means that +\fB% ~-\fP is a correct sequence too. .PP -Pred predlozkou se muze nachazet libovolne mnozstvi oteviracich zavorek, -pred kterymi se musi nachazet mezera nebo zacatek radku. Pred -oteviraci svorkou muze byt take misto mezery TeXova -\(lq\\sekvence\(rq (od verze 1.2). -Napr. za \(lq([{(V\(rq na pocatku radku bude vlnka pridana. -Stejne tak se text \(lq\\uv{V lese}\(rq promeni na -\(lq\\uv{V~lese}\(rq. +The rule to recognize a preposition follows: +The arbitrary number of opening parentheses can be written before the +preposition and before these (optional) parentheses must be the space, +tabelator or new-line. The preposition itself is one-letter word, the letters +have to be from this set: {KkSsVvZzOoUuAI}. See the \fB\-v\fP option if you +want to change this set of letters. From version 1.2, the TeX sequence +can be written before preposition and before the brace. Example: +"<new-line>([V lese" is converted to "<new-line>([V~lese". +Another example: "\\uv{V lese}" is converted to "\\uv{V~lese}". .PP -Program kontroluje konzistenci matematickych prostredi (neni-li uveden -parametr \fB\-m\fP). -Vstup do \fIdisplay\fP rezimu (\fB$$\fP) uvnitr \fItext\fP rezimu (\fB$\fP) -(napr. \fB$\fP...\fB$$\fP...\fB$\fP) znamena varovani a prechod do -\fIdisplay\fP. -Podobne prazdny radek uvnitr \fItext\fP nebo \fIdisplay\fP rezimu znamena -vypis varovani a prechod do nematematickeho (standardniho) rezimu. -Uvnitr rezimu \fIdisplay\fP se ignoruji vyskyty samostatneho znaku \fB$\fP, -jelikoz byva vetsinou soucasti konstrukce \fB\\hbox\fP. +One or more blank-spaces have to be included after preposition +before next word. The blank-space means space or tabelator. +One <new-line> can be here too. +All these characters are removed and replaced by asciitilde (or by +another string, see \fB\-x\fP option). If <new-line> is deleted, another +<new-line> is created before preposition (and before optional parentheses) +in order to the number of lines is kept unchanged. +Example: "... V<new-line><tabelator>lese" is converted to +"...<new-line>V~lese". .PP -Program kontroluje konzistenci verbatim rezimu na konci souboru. -Nebyl-li ukoncen, vypise se varovani. -Kontrola se neprovadi, pokud je pouzita volba \fB\-n\fP nebo \fB\-w\fP. +The program checks the consintence of TeX's math environments +(if \fB\-m\fP option isn't used). For example the "$...$$...$" sequence +(it means the display mode switch inside the text-math mode) +generates a warning. Empty line inside display mode generates +a warning too and the program processes next text like +in normal (non-math) mode. The existence of the "$" inside display mode +are accepted because the constructions like +$$..\\hbox{..$..$}..$$ are allowed and common. .PP -Program nedoplnuje vlnky za samostatna pismena, ktera jako predlozky vypadaji, -ale nasleduji bezprostredne za sekvencemi \fB\\TeX\fP nebo \fB\\LaTeX\fP. -Napr. do textu \(lq\fBVlastnosti \\TeX u jsou\fP\(rq nebude zadna vlnka -doplnena. -.SH VOLBY -Volby jsou nepovinne a mohou byt uvedeny v libovolnem poradi, ale nemohou -byt spojovany. +The consistence of verbatim mode is checked on the end of the file. +If the file ends but the verbatim mode does not end the warning is printed. +This behavior can be switched off by \fB\-n\fP or \fB\-w\fP options. +.PP +The program suppresses the tilde changing after letters like prepositions +but they are not prepositions because the \fB\\TeX\fP or \fB\\LaTeX\fP +sequence precedes. Example: "vlastnosti \\TeX u jsou" is not converted to +"vlastnosti \\TeX u~jsou", because this text is printed (after TeX +processing) like "vlastnosti TeXu jsou". The letter "u" is a suffix here, +no preposition. +.SH OPTIONS +The options are optional and can be written in arbitrarty order separated +by space. .TP .B \-f -Filtr. Jmena souboru jsou interpretovana takto: +Filter. The [\fIfilenames\fP] are treated as follows: .RS .TP 4 -.B vlna \-f \fIsoubor1 soubor2\fP -Vstup je \fIsoubor1\fP, vystup \fIsoubor2\fP. +.B vlna \-f \fIfilename1 filename2\fP +Input is \fIfilename1\fP, output is \fIfilename2\fP. .TP 4 -.B vlna \-f \fIsoubor1\fP -Vstup je \fIsoubor1\fP, vystup \fIstdout\fP. +.B vlna \-f \fIfilename1\fP +Input is \fIfilename1\fP, output is \fIstdout\fP. .TP 4 .B vlna \-f -Vstup je \fIstdin\fP, vystup \fIstdout\fP. +Input is \fIstdin\fP, output is \fIstdout\fP. .TP 4 -\fBvlna\fP \fIsoubor1\fP [\fIsoubor2\fP [\fIsoubor3\fP ...]] -Neni-li uveden parametr \fB\-f\fP, kazdy soubor je zpracovavan samostatne. +\fBvlna\fP \fIfilename1\fP [\fIfilename2\fP [\fIfilename3\fP ...]] +If the \fB\-f\fP option is omitted then each file is processed +independently and it is re-written. .RE .TP .B \-s -Tichy rezim. Program potlaci vypis uvodni zpravy, varovnych zprav a -statistik o zmenach v souborech -(bez uvedeni parametru jsou zpravy vypisovany na \fIstderr\fP). -V tichem rezimu se vypise jen chyba, ktera predcasne ukonci -cinnost programu. +The silent mode. No messages, warnings, statistics are printed. +Only errors which terminates the program untimely are printed. +If this parameter is omitted then banner, warnings and statistics +are printed to \fIstderr\fP. .TP .B \-r -Nevytvaret (mazat) zalohy. -Parametr \fB\-r\fP nema vliv, pokud je uveden spolu s \fB\-f\fP. -V opacnem pripade se ke kazdemu souboru vytvari zaloha s vlnkou na konci jmena -a parametr \fB\-r\fP zpusobi, ze na konci zpracovani jsou tyto zalohy mazany. +Do not create the backups. The option \fB\-r\fP is irrelevant if +the \fB\-f\fP option is used. If the \fB\-f\fP and \fB\-r\fP options +aren't used then each re-written file is stored with its original contents +to a backup file (the name of backup file is the same as filename, only +the tilde is used instead of the last character). +.TP +.B \-v \fIcharacters\fP +The set of characters treated as non-syllabic prepositions is declared +by this option. Default: \fB\-v\ KkSsVvZzOoUuAI\fP. +The space between \fB\-v\fP and \fIcharacters\fP is required. .TP -.B \-v \fIznaky\fP -Znaky povazovane za neslabicne predlozky, za ktere ma byt pridavana -vlnka. Implicitni hodnota je \fB\-v\ KkSsVvZzOoUuAI\fP. (Mezi -\fB\-v\fP a skupinou znaku musi byt mezera.) +.B \-x \fIcode\fP +The \fIcode\fP is a string written in hexadecimal notation +(even hexa digits is required). This string will be saved after prepositions +instead asciitilde which is default. +The example: \fB\-x C2A0\fP two bytes are stored after each +non-syllabic preposition, first byte has C2 code and second byte +has A0 code. This example means that +NO-BREAK SPACE in UTF8 encoding will be used after prepositions. +Another example: \fB\-x 00A0\fP the NO-BREAK SPACE in UTF16 encoding. +Another example: \fB\-x 48454C4C4F\fP the string HELLO will be used. +The space between \fB\-x\fP and \fIcode\fP is required. .TP .B \-m -Ignorovani prechodu do matematickych prostredi -(\fB$\fP...\fB$\fP a \fB$$\fP...\fB$$\fP). -Parametr \fB\-m\fP zpusobi vlnkovani i v matematickych prostredich, ktera -se implicitne vynechavaji. +The math-modes (\fB$\fP...\fB$\fP and \fB$$\fP...\fB$$\fP) are ignored. +It means that non-syllabic prepositions is searched in math-mode too. +Default (without \fB\-m\fP option): no changes in math modes are done +because (for example) "v" is variable in math-mode, no preposition. .TP .B \-n -Ignorovani verbatim rezimu (\fB\\verb\fP\fI<znak>\fP...\fI<znak>\fP, -\fB\\begtt\fP...\fB\\endtt\fP). -Parametr \fB\-n\fP zpusobi vlnkovani i ve verbatim rezimu, ktery se -implicitne vynechava. +The verbatim mode (\fB\\verb\fP\fI<char>\fP...\fI<char>\fP, +\fB\\begtt\fP...\fB\\endtt\fP) is ignored, it means the program can +do a changes in verbatim environment. +Default (without \fB\-n\fP option): no changes in verbatim mode are done. .TP .B \-l -LaTeX. Pro rozpoznani matematickeho rezimu jsou pridana prostredi -\fB\\begin{display}\fP...\fB\\end{display}\fP a -\fB\\begin{equation}\fP...\fB\\end{equation}\fP. -Pro rozpoznani verbatim rezimu je pridano LaTeXove prostredi +The LaTeX mode. The following environments are treated as display mode: +\fB\\begin{display}\fP...\fB\\end{display}\fP and +\fB\\begin{equation}\fP...\fB\\end{equation}\fP and the following +environment is treated as verbatim mode: \fB\\begin{verbatim}\fP...\fB\\end{verbatim}\fP. .TP .B \-w -Web. Pro rozpoznani verbatim rezimu jsou pridany sekvence -\fB@<\fP, \fB@d\fP...\fB@*\fP, \fB@\fP\fImezera\fP nebo \fB@>|\fP. -Ve zdrojovem kodu se tedy nevlnkuje program, ale jen komentare. -.SH PRIKLADY +The web mode (Knuth's web, no www:-). The following sequences are +treated as verbatim: +\fB@<\fP, \fB@d\fP...\fB@*\fP, \fB@\fP\fIspace\fP or \fB@>|\fP. +It means program code is unchanged in *.w or *.web files, only +web-comments are processed. +.SH EXAMPLES .TP -.B vlna \-m \-n \-s \-r \fIsoubor\fP -Volani priblizne odpovida volani puvodniho programu \fBvlna\fP. -(Navic se neprovadi vlnkovani za sekvencemi \fB\\TeX\fP a \fB\\LaTeX\fP.) +.B vlna \-m \-n \-s \-r \fIfile\fP +The program has a behavior similar to the old \fBvlnka\fP program. .TP .B vlna *.tex -Vlnkovani vsech souboru s priponou \fBtex\fP. -(Pouze na UNIXu.) +All files with .tex suffix in current directory will be processed +(and possibly changed). (The "*" is UNIX-shell feautre). .TP -.B vlna \-f soubor > /dev/null -Test konzistence matematickeho a verbatim rezimu bez provedeni zmen. -(Pouze na UNIXu.) -.SH AUTOR -Petr Olsak <olsak@math.feld.cvut.cz>. Manualovou stranku a Makefile vytvoril Rulolf Cejka +.B vlna \-f file > /dev/null +Only the consistence checking of math and verbatim modes is processed. +No changes are done. +.SH AUTHORS +Petr Olsak <olsak@math.feld.cvut.cz>. +Man page (Czech original) and Makefile is created by Rulolf Cejka diff --git a/Build/source/utils/vlna/vlna.txt b/Build/source/utils/vlna/vlna.txt index 2e50fab9e73..0546f828207 100644 --- a/Build/source/utils/vlna/vlna.txt +++ b/Build/source/utils/vlna/vlna.txt @@ -1,7 +1,7 @@ Program VLNA ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - verze 1.2 Petr Olšák + verze 1.4 Petr Olšák Program vlna přidává vlnky (místo původních mezer) za neslabičné předložky ve vstupních souborech pro TeX. To zabrání zlomu řádku v nežádoucím místě. @@ -45,6 +45,16 @@ PŘEPÍNAČE: -v znaky : Definice znaků, které budeme považovat za neslabičné předložky, tj. k ovlnkování. Implicitní hodnota -v KkSsVvZzOoUuAI je použitím tohoto parametru přepsána. Mezi -v a skupinou znaků musí být mezera. +-x kód : Vyhledané místo se implicitně nahrazuje vlnkou. Místo toho jej + můžete nechat nahrazovat libovolným stringem. Kód za parametrem + -x je hexadecimálně vyjádřený string, nula je ve stringu + povoleným znakem. Takže -x C2A0 vymezuje dvouznakový string: + místo každé vlnky budou vloženy dva byty, první s kódem C2 a + druhý s kódem A0. Podle unicodové tabulky tento pžíklad tedy + způsobí nahrazování znakem NO-BREAK SPACE při kódování UTF8. + Jine příklady: -x 00A0 nahrazování znakem NO-BREAK SPACE při + kódování UTF16, -x 41484F4A nahrazování textem AHOJ. Mezi -x a + kódem musí být mezera. -m : Ignoruje přechody do matematického režimu ($...$ a $$...$$) a vlnkuje i v těchto prostředích. Imlicitně v matematických prostředích nevlnkuje. -n : Ignoruje přechody do verbatim režimu (\verb<zn>...<zn>, \begtt...\endtt) diff --git a/Build/source/utils/vlna/vlna.w b/Build/source/utils/vlna/vlna.w index da84b8711b6..6d1ff5c2536 100644 --- a/Build/source/utils/vlna/vlna.w +++ b/Build/source/utils/vlna/vlna.w @@ -32,7 +32,7 @@ v~kódu programu, cestinou v~/* komentářích */ a češtinou jinde. Tu cestinu si vynutil fakt, že DOS-ovská varianta \.{tangle} a \.{weave} se nesnáší s~akcentovanými písmeny v~/* komentářích */. A~nyní už slíbený (vícejazyčný) |BANNER|. -@d BANNER "This is program vlna, version 1.2, (c) 1995, 2002 Petr Olsak\n" +@d BANNER "This is program vlna, version 1.5, (c) 1995, 2002, 2009, 2010 Petr Olsak\n" @ V programu jsou použity knihovní funkce, jejíchž prototypy jsou definovány ve třech standardních hlavičkových souborech. @@ -89,6 +89,10 @@ souborů. interpretovány jako neslabičné předložky. Např. \.{-v KkSsVvZzOoUuAI}. Pokud není parametr uveden, je použita skupina uvedená v tomto příkladě. +* \.{-x} \dots\ parametr vymezuje pomocí hexadecimálního zápisu string, + který program vkládá na vyhledaná místa. Implicitně vkládá vlnku. + Například \.{-x C2A0} způsobí, že program bude vkládat místo vlnky dva byty, + první s kódem \.{C2} a druhý s kódem \.{A0}. * \.{-m} \dots\ program neprovádí kontrolu math/text módů, tj. vlnkuje i uvnitř matematického módu \TeX{}u. (Implicite tam nevlnkuje). * \.{-n} \dots\ prorgram neprovádí kontrolu verbatim módu, tj. vlnkuje i @@ -101,7 +105,7 @@ souborů. vlnkuje dokumentační část každé sekce, ale nikoli kód. \enditems -Definujeme funkci |printusage|, které tiskne (při chybě) stručný přehled +Definujeme funkci |printusage|, která tiskne (při chybě) stručný přehled možných parametrů. Nepodařilo se mi zjistit, jak se ve WEBu napíše kulturně dlouhý string obsahující \.{\char92n} s formátovacími požadavky. Byl jsem nucen to takto nehezky zapsat. @@ -117,6 +121,7 @@ static void printusage (void) " -s : silent: no messages to stderr\n" " -r : rmbackup: if nofilter, removes temporary files\n" " -v charset : set of lettres to add tie, default: KkSsVvZzOoUuAI\n" + " -x code : code for tie symbol, default: 7E, example -x C2A0\n" " -m : nomath: ignores math modes\n" " -n : noverb: ignores verbatim modes\n" " -l : LaTeX mode\n" @@ -133,7 +138,18 @@ int isfilter=0, silent=0, rmbackup=0, nomath=0, noverb=0, web=0, latex=0; char charsetdefault[]="KkSsVvZzOoUuAI"; char *charset=charsetdefault; +@ String |tiestr| obsahuje string, kterým se má nahradit vyhledané +místo. Pokud není použit parametr \.{-u}, je tento string jadnoznakový +a obsahuje vlnku. Jinak obsahuje string konvertovaný z parametru \.{-u}. +String má délku |tiestrlen| bez ohledu na to, zda obsahuje nebo +neobsahuje nulové znaky (C-čková konvence pro stringy není použita). +@<Globální deklarace@>= +unsigned char tiestr[MAXLEN]; +int tiestrlen; + @ @<Načtení parametrů ...@>= +tiestr[0] = '~'; +tiestrlen = 1; while (argc>1 && argv[1][0] == '-') { if (argv[1][2] != 0) printusage (), exit (BAD_OPTIONS); switch(argv[1][1]) { @@ -142,6 +158,8 @@ while (argc>1 && argv[1][0] == '-') { case 'r': rmbackup = 1; break; case 'v': if (argc<2) printusage (), exit (BAD_OPTIONS); argv++; argc--; charset = argv[1]; break; + case 'x': if (argc<2) printusage (), exit (BAD_OPTIONS); + argv++; argc--; settiestr(argv[1]); break; case 'm': nomath = 1; break; case 'n': noverb = 1; break; case 'l': latex = 1; break; @@ -152,6 +170,26 @@ while (argc>1 && argv[1][0] == '-') { argc--; argv++; } +@ Vyřešíme konverzi kódu zapsaného za parametrem \.{-x} na string |tiestr|. +@<Pomocné funkce@>= +unsigned char hexnum(char c) { + if (c >= '0' && c <= '9') return c - '0'; + if (c >= 'A' && c <= 'F') return c - 'A' + 10; + if (c >= 'a' && c <= 'f') return c - 'a' + 10; + printusage (), exit (BAD_OPTIONS); +} +void settiestr(char *s) { + int i, j, c; + i = strlen(s); + if ((i > 2*MAXLEN) || i%2 == 1) printusage (), exit (BAD_OPTIONS); + tiestrlen = i/2; + j = 0; + for (i=0; i<tiestrlen; i++) { + tiestr[i] = hexnum(s[j++]) << 4; + tiestr[i] += hexnum(s[j++]); + } +} + @* Zpracování souborů. Parametr |MAXLEN| definuje maximální možnou délku jména souboru, který vytvoříme jako přechodný, nebo zálohový. Dále deklarujeme proměnné typu \uv{stream}. @@ -347,6 +385,20 @@ char c; /* zrovna nacetny znak */ char buff[MAXBUFF]; /* prechodny buffer */ int ind; /* aktualni pozice prechodneho bufferu */ +@ Dne 30. 4. 2009 jsem přidal možnost čtení vstupu, který obsahuje nulové byty. +Takové nuly se přepisují do výstupu, ale program si jich nevšímá při +procházení patternů. Tím je možno program použít na soubory kódované +v UTF16, ačkoli patterny obsahují jen jednobytové ASCII znaky. +Buffer |buff| může obsahovat i nulové byty, které je třeba přepsat do výstupu. +Na druhé straně buffer |buffnz| obsahuje jen nenulové byty, na které se +někdy ptáme při pohledu dozadu. Nejdelší pohled dozadu je o čtyři byty. +Udělám tedy |buffnz| osmibytový, začnu jej plnit od |buffnz|[4] +a kdykoli je buffer zcela zaplněn, přesunu horní čtyři byty na spodní a dále +pokračuji v plnění bufferu od pozice |buffnz|[4]. +@<Globální deklarace@>= +char buffnz[8]; +int inz; + @ Nyní definujeme pomocné funkce |setpattern|, |setpi| a |normalpattern|. Tyto funkce alokují paměť pomocí standardní funkce |malloc|. Abychom mohli ohlídat případnou chybu při alokaci, budeme allokovat paměť zprostředkovaně @@ -514,8 +566,8 @@ static void tie (FILE *input, FILE *output) @<Inicializace proměnných při startu funkce |tie|@>; while (!feof(input)) { - @<Otevři nové patterny@>; if (ap == 0 && ind > BUFI && c !='\\') @<Vyprázdni buffer@>; + @<Otevři nové patterny@>; /* 1. 2. 2010: prohozene poradi */ if (ind >= MAXBUFF) { fprintf (stderr, "Operating buffer overflow, is anything wrong?\n"); exit (BAD_PROGRAM); @@ -523,8 +575,14 @@ static void tie (FILE *input, FILE *output) if ((ic = getc(input)) == EOF) /* opravil Cejka Rudolf */ break; buff[ind++] = c = ic; + if (c == 0) continue; /* 30. 4. 2009 */ + if (inz>=8) { + for (inz=0; inz<4; inz++) buffnz[inz] = buffnz[inz+4]; + inz=4; + } + buffnz[inz++] = c; if (c == '\n') numline++, listpatt = normallist; - if (c == '%' && mode!=VERBMODE && buff[ind-2] != '\\') listpatt = commentlist; + if (c == '%' && mode!=VERBMODE && buffnz[inz-2] != '\\') listpatt = commentlist; @<Projdi otevřené patterny@>; } @<Vyprázdni buffer@>; @@ -535,7 +593,9 @@ static void tie (FILE *input, FILE *output) @ @<Inicializace proměnných při ...@>= for (k=0; k<MAXPATT; k++) lapi[k] = NULL; c = '\n'; -buff[0] = mode = ap = 0; ind = 1; +buff[0] = 1; mode = ap = 0; ind = 1; +for(inz=0; inz<4; inz++) buffnz[inz] = 0; +inz = 4; numline = 1; numchanges = 0; mode = TEXTMODE; @@ -546,11 +606,11 @@ zda tam není symbol \uv{\.{\char92}} (například na výskyt sekvence \.{\char92\char37} je třeba reagovat jinak, než na výskyt obyčejného procenta). Kdybychm zazačali od |buff[0]|, v některých situacích bychom se ptali, zda |buff[-1]=='\\'|, tj. sahali bychom na neošetřené -místo v paměti. +místo v paměti. Od 30. 4. 2009 tento problém pominul, protože se ptáme dozadu pouze +v~|buffnz|, ale vlastnost dříve implementovanou v |buff| jsem ponechal beze změny. @<Vyprázdni buffer@>= { - buff[ind] = 0; - fputs (&buff[1], output); + fwrite (&buff[1], ind-1, 1, output); ind = 1; } @@ -579,7 +639,7 @@ typu |FOUND| nebo |NOFOUND|. V takových případech ani nezanášíme ukazatel na pozici do pole |lapi|. @<Otevři nové patterny@>= pp = listpatt; -while (pp != NULL) { +if (c) while (pp != NULL) { switch (m = match (pp->patt)) { case FOUND: (*pp->proc)(); /* spustit proceduru */ case NOFOUND: break; @@ -656,15 +716,28 @@ setpi (nochar, ONE_NOT); @ @<Inicializace proměnných při ...@>= listpatt = normallist = vlnkalist; -@ @<Pomocné funkce@>= +@ Vložení vlnky znamená vykonat následující práci: Zapamatovat si znak za skupinou mezer +(do proměnné |p|). Pokud před tímto znakem předchází nulový byte, použijeme ho později, proto +si jej uložíme do proměnné |z|. Dále se posuneme v bufferu vlevo přes všechny mezery, tabelátory +(přesněji |blanks|) a přeskakujeme přitom všechny nulové byty. Index |ind| se zastaví +na předložce. Posuneme jej doprava za předložku (++|ind|) a pokud tam je nulový byte a první znak +|tiestr| není nulový, posuneme se až za tento nulový byte. Dále vložíme string |tiestr|, +neboli vlnku. Nakonec připojíme zapamatovaný znak |p|, ovšem pokud před ním byla nula, +vložíme ji ještě před znak |p|. +@<Pomocné funkce@>= static void vlnkain(void) { - char p; + int i; + char p, z; ind--; p = buff[ind--]; - while (strchr(blanks, buff[ind]) !=NULL) ind--; - ind++; - buff[ind++] = '~'; + z = buff[ind]; + while (!buff[ind] || (strchr(blanks, buff[ind]) !=NULL)) ind--; + if (!buff[++ind] && tiestr[0]) ind++; + for (i=0; i<tiestrlen; i++) buff[ind++] = tiestr[i]; + i = tiestrlen; /* nulu pred p vlozime, pokud je z==0 a */ + if (!tiestr[0]) i--; /* pocet vlozenych znaku z tiestr */ + if (!z && (i%2)) buff[ind++] = 0; /* je sudy */ buff[ind++] = p; numchanges++; } @@ -698,20 +771,24 @@ nebudeme vytvářet nové. Na výstupu bude soubor o jeden řádek kratší. @<Pomocné funkce@>= static void vlnkacr(void) { - char p; + char p, z; int i, j; ind--; p = buff[ind--]; - while (strchr(blankscr, buff[ind]) !=NULL) ind--; + z = buff[ind]; + while (!buff[ind] || (strchr(blankscr, buff[ind]) !=NULL)) ind--; i = ind; /* misto predlozky, kterou chceme vazat */ while (i >= 0 && (strchr(blankscr, buff[i]) == NULL)) i--; j = i; - while (i >= 0 && (strchr(blanks, buff[i]) != NULL)) i--; + while (i >= 0 && (!buff[ind] || (strchr(blanks, buff[i]) != NULL))) i--; if (i >= 0 && buff[i] == '\n') j = -1; if (j >= 0) buff[j] = '\n'; else numline--; - ind++; - buff[ind++] = '~'; + if (!buff[++ind] && tiestr[0]) ind++; + for (i=0; i<tiestrlen; i++) buff[ind++] = tiestr[i]; + i = tiestrlen; + if (!tiestr[0]) i--; + if (!z && (i%2)) buff[ind++] = 0; buff[ind++] = p; numchanges++; } @@ -757,7 +834,7 @@ normalpattern (tielock, "\\LaTeX"); setpi (blankscr, ONE); @ Procedura |tielock| obsahuje nečistý trik. Při provádění procedury je -právě načten znak z |blankscr| a je uložen do buff. Testy na otevírání +právě načten znak z |blankscr| a je uložen do |buff|. Testy na otevírání nových patternů pro tento znak teprve budou následovat a testují se na hodnotu proměnné |c|. Stačí tedy změnit hodnotu |c| a vlnkovací patterny se neotevřou. @@ -816,7 +893,7 @@ display módu. V takovém případě také nic neděláme. @<Pomocné funkce@>= static void onedollar (void) { - if (buff[ind-3]=='\\' || (buff[ind-3]=='$' && buff[ind-4]!='\\')) return; + if (buffnz[inz-3]=='\\' || (buffnz[inz-3]=='$' && buffnz[inz-4]!='\\')) return; if (mode==DISPLAYMODE) printwarning (); else { if (mode==TEXTMODE) mathin(); @@ -871,7 +948,7 @@ static void displayout (void) } static void twodollars (void) { - if (buff[ind-3]=='\\') return; + if (buffnz[inz-3]=='\\') return; if (mode==DISPLAYMODE) displayout (); else displayin (); } @@ -939,7 +1016,7 @@ static void verbin (void) case 'm': i = 2; break; case '<': ; case 'd': i = 3; - if (buff[ind-3]=='@@') return; /* dvojity @@ ignorovat */ + if (buffnz[inz-3]=='@@') return; /* dvojity @@ ignorovat */ break; } listpatt = normallist = verboutlist[i]; @@ -952,7 +1029,7 @@ static void verbin (void) static void verbout (void) { if (mode!=VERBMODE) return; - if (web && buff[ind-2] == '@@' && buff[ind-3] == '@@') return; + if (web && buffnz[inz-2] == '@@' && buffnz[inz-3] == '@@') return; mode = prevmode; normallist->next = prevlist; switch (mode) { |