summaryrefslogtreecommitdiff
path: root/Build/source/utils/vlna/vlna.tex
diff options
context:
space:
mode:
authorPeter Breitenlohner <peb@mppmu.mpg.de>2011-05-02 13:25:05 +0000
committerPeter Breitenlohner <peb@mppmu.mpg.de>2011-05-02 13:25:05 +0000
commit1a77a01bd7f271c1f3fb9ea3f31b583efb4352fd (patch)
treefcd51e0491ffa0a6f020dc5738cac836d03139fe /Build/source/utils/vlna/vlna.tex
parent2ba98f9a00f1b34455b12ef44c361154b48000c6 (diff)
update generated files
git-svn-id: svn://tug.org/texlive/trunk@22283 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/vlna/vlna.tex')
-rw-r--r--Build/source/utils/vlna/vlna.tex391
1 files changed, 257 insertions, 134 deletions
diff --git a/Build/source/utils/vlna/vlna.tex b/Build/source/utils/vlna/vlna.tex
index b28f72cfa88..ee18bfffdef 100644
--- a/Build/source/utils/vlna/vlna.tex
+++ b/Build/source/utils/vlna/vlna.tex
@@ -21,7 +21,7 @@ Program sestává z těchto hlavních celků:
\Y\B\X3:Hlavičkové soubory k načtení\X\6
\X4:Globální deklarace\X\6
\X6:Pomocné funkce\X\6
-\X26:Vlnkovací funkce \PB{\\{tie}}\X\6
+\X29:Vlnkovací funkce \PB{\\{tie}}\X\6
\X5:Hlavní program\X\par
\fi
@@ -35,8 +35,8 @@ 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ý) \PB{\.{BANNER}}.
\Y\B\4\D$\.{BANNER}$ \5
-\.{"This\ is\ program\ vln}\)\.{a,\ version\ 1.2,\ (c)\ }\)\.{1995,\ 2002\ Petr%
-\ Olsa}\)\.{k\\n"}\par
+\.{"This\ is\ program\ vln}\)\.{a,\ version\ 1.5,\ (c)\ }\)\.{1995,\ 2002,\
+2009,\ 20}\)\.{10\ Petr\ Olsak\\n"}\par
\fi
\M{3}V programu jsou použity knihovní funkce, jejíchž prototypy jsou
@@ -68,7 +68,7 @@ nultého parametru příkazové řádky.
\Y\B\4\X4:Globální deklarace\X${}\E{}$\6
\&{char} ${}{*}\\{prog\_name};{}$\6
\&{int} \\{status};\par
-\As7, 15, 16, 20, 25\ETs33.
+\As7, 8, 17, 18, 19, 23, 28\ETs36.
\U1.\fi
\M{5}Základní rozvržení funkce \PB{\\{main}}.
@@ -76,14 +76,14 @@ nultého parametru příkazové řádky.
\&{int} \\{main}(\&{int} \\{argc}${},\39{}$\&{char} ${}{*}{*}\\{argv}){}$\1\1\2%
\2\6
${}\{{}$\1\6
-\X9:Lokální proměnné funkce \PB{\\{main}}\X;\6
+\X11:Lokální proměnné funkce \PB{\\{main}}\X;\6
${}\\{prog\_name}\K\\{argv}[\T{0}];{}$\6
${}\\{status}\K\.{OK};{}$\6
-\X8:Načtení parametrů příkazového řádku\X;\6
+\X9:Načtení parametrů příkazového řádku\X;\6
\&{if} ${}(\R\\{silent}){}$\1\5
${}\\{fprintf}(\\{stderr},\39\.{BANNER});{}$\2\6
-\X21:Inicializace datových struktur\X;\6
-\X11:Zpracování souborů\X;\6
+\X24:Inicializace datových struktur\X;\6
+\X13:Zpracování souborů\X;\6
\&{return} \\{status};\6
\4${}\}{}$\2\par
\U1.\fi
@@ -93,7 +93,7 @@ Program čte z~příkazového řádku postupně (nepovinné) parametry,
které začínají znakem \uv{\.{-}}. Pak následují jména vstupních a výstupních
souborů.
\begitems
-* \.{-f} \dots\ program pracuje jako filtr (viz sekce \PB{$\X11:Zpracování
+* \.{-f} \dots\ program pracuje jako filtr (viz sekce \PB{$\X13:Zpracování
souborů\X$}). Není-li tento parametr použit, program pracuje v tzv.
standardním režimu, kdy jednotlivé soubory jsou vstupní i výstupní.
* \.{-s} \dots\ program nevypíše \PB{\.{BANNER}}, ani sumarizaci, ani varování,
@@ -107,6 +107,10 @@ tento parametr vliv.
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
@@ -119,7 +123,7 @@ používanými v dokumentech WEB (např. tento dokument). Důsledek: program
vlnkuje dokumentační část každé sekce, ale nikoli kód.
\enditems
-Definujeme funkci \PB{\\{printusage}}, které tiskne (při chybě) stručný přehled
+Definujeme funkci \PB{\\{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.
@@ -136,12 +140,13 @@ file1\ \ \ \ \ \ \ ..}\)\.{.\ file1->stdout\\n"}\.{"\ \ \ \ \ \ \ \ \ \ \ \ \ \
messages\ to\ stde}\)\.{rr\\n"}\.{"\ \ \ \ \ \ -r\ :\ \ rmbacku}\)\.{p:\ if\
nofilter,\ remo}\)\.{ves\ temporary\ files\\}\)\.{n"}\.{"\ \ \ \ \ \ -v\
charset\ :\ }\)\.{\ set\ of\ lettres\ to\ a}\)\.{dd\ tie,\ default:\ KkS}\)%
-\.{sVvZzOoUuAI\\n"}\.{"\ \ \ \ \ \ -m\ :\ \ nomath:}\)\.{\ ignores\ math\ modes%
-\\}\)\.{n"}\.{"\ \ \ \ \ \ -n\ :\ \ noverb:}\)\.{\ ignores\ verbatim\ mo}\)%
-\.{des\\n"}\.{"\ \ \ \ \ \ -l\ :\ \ LaTeX\ m}\)\.{ode\\n"}\.{"\ \ \ \ \ \ -w\ :%
-\ \ web\ mod}\)\.{e\\n"});{}$\6
+\.{sVvZzOoUuAI\\n"}\.{"\ \ \ \ \ \ -x\ code\ :\ cod}\)\.{e\ for\ tie\ symbol,\
+de}\)\.{fault:\ 7E,\ example\ -}\)\.{x\ C2A0\\n"}\.{"\ \ \ \ \ \ -m\ :\ \
+nomath:}\)\.{\ ignores\ math\ modes\\}\)\.{n"}\.{"\ \ \ \ \ \ -n\ :\ \ noverb:}%
+\)\.{\ ignores\ verbatim\ mo}\)\.{des\\n"}\.{"\ \ \ \ \ \ -l\ :\ \ LaTeX\ m}\)%
+\.{ode\\n"}\.{"\ \ \ \ \ \ -w\ :\ \ web\ mod}\)\.{e\\n"});{}$\6
\4${}\}{}$\2\par
-\As10, 17, 18, 19, 22, 23, 36, 38, 41, 42, 44, 45, 47, 49, 51, 52, 53\ETs55.
+\As10, 12, 20, 21, 22, 25, 26, 39, 41, 44, 45, 47, 48, 50, 52, 54, 55, 56\ETs58.
\U1.\fi
\M{7}Proměnné \PB{\\{isfilter}}, \PB{\\{silent}}, \PB{\\{rmbackup}}, \PB{%
@@ -159,7 +164,19 @@ použití parametru \.{-v}) na text uvedený v příkazovém řádku.
\&{char} ${}{*}\\{charset}\K\\{charsetdefault}{}$;\par
\fi
-\M{8}\B\X8:Načtení parametrů příkazového řádku\X${}\E{}$\6
+\M{8}String \PB{\\{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 \PB{\\{tiestrlen}} bez ohledu na to, zda obsahuje nebo
+neobsahuje nulové znaky (C-čková konvence pro stringy není použita).
+\Y\B\4\X4:Globální deklarace\X${}\mathrel+\E{}$\6
+\&{unsigned} \&{char} \\{tiestr}[\.{MAXLEN}];\6
+\&{int} \\{tiestrlen};\par
+\fi
+
+\M{9}\B\X9:Načtení parametrů příkazového řádku\X${}\E{}$\6
+$\\{tiestr}[\T{0}]\K\.{'\~'};{}$\6
+${}\\{tiestrlen}\K\T{1};{}$\6
\&{while} ${}(\\{argc}>\T{1}\W\\{argv}[\T{1}][\T{0}]\E\.{'-'}){}$\5
${}\{{}$\1\6
\&{if} ${}(\\{argv}[\T{1}][\T{2}]\I\T{0}){}$\1\5
@@ -182,6 +199,13 @@ ${}\\{argv}\PP;{}$\6
${}\\{argc}\MM;{}$\6
${}\\{charset}\K\\{argv}[\T{1}];{}$\6
\&{break};\6
+\4\&{case} \.{'x'}:\6
+\&{if} ${}(\\{argc}<\T{2}){}$\1\5
+${}\\{printusage}(\,),\39\\{exit}(\.{BAD\_OPTIONS});{}$\2\6
+${}\\{argv}\PP;{}$\6
+${}\\{argc}\MM;{}$\6
+\\{settiestr}(\\{argv}[\T{1}]);\6
+\&{break};\6
\4\&{case} \.{'m'}:\5
${}\\{nomath}\K\T{1};{}$\6
\&{break};\6
@@ -203,18 +227,48 @@ ${}\\{argv}\PP;{}$\6
\4${}\}{}$\2\par
\U5.\fi
-\N{1}{9}Zpracování souborů. Parametr \PB{\.{MAXLEN}} definuje maximální možnou
+\M{10}Vyřešíme konverzi kódu zapsaného za parametrem \.{-x} na string \PB{%
+\\{tiestr}}.
+\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\&{unsigned} \&{char} \\{hexnum}(\&{char} \|c)\1\1\2\2\6
+${}\{{}$\1\6
+\&{if} ${}(\|c\G\.{'0'}\W\|c\Z\.{'9'}){}$\1\5
+\&{return} \|c${}-\.{'0'};{}$\2\6
+\&{if} ${}(\|c\G\.{'A'}\W\|c\Z\.{'F'}){}$\1\5
+\&{return} \|c${}-\.{'A'}+\T{10};{}$\2\6
+\&{if} ${}(\|c\G\.{'a'}\W\|c\Z\.{'f'}){}$\1\5
+\&{return} \|c${}-\.{'a'}+\T{10};{}$\2\6
+${}\\{printusage}(\,),\39\\{exit}(\.{BAD\_OPTIONS});{}$\6
+\4${}\}{}$\2\7
+\&{void} \\{settiestr}(\&{char} ${}{*}\|s){}$\1\1\2\2\6
+${}\{{}$\1\6
+\&{int} \|i${},{}$ \|j${},{}$ \|c;\7
+${}\|i\K\\{strlen}(\|s);{}$\6
+\&{if} ${}((\|i>\T{2}*\.{MAXLEN})\V\|i\MOD\T{2}\E\T{1}){}$\1\5
+${}\\{printusage}(\,),\39\\{exit}(\.{BAD\_OPTIONS});{}$\2\6
+${}\\{tiestrlen}\K\|i/\T{2};{}$\6
+${}\|j\K\T{0};{}$\6
+\&{for} ${}(\|i\K\T{0};{}$ ${}\|i<\\{tiestrlen};{}$ ${}\|i\PP){}$\5
+${}\{{}$\1\6
+${}\\{tiestr}[\|i]\K\\{hexnum}(\|s[\|j\PP])\LL\T{4};{}$\6
+${}\\{tiestr}[\|i]\MRL{+{\K}}\\{hexnum}(\|s[\|j\PP]);{}$\6
+\4${}\}{}$\2\6
+\4${}\}{}$\2\par
+\fi
+
+\N{1}{11}Zpracování souborů. Parametr \PB{\.{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}.
\Y\B\4\D$\.{MAXLEN}$ \5
\T{120}\par
-\Y\B\4\X9:Lokální proměnné funkce \PB{\\{main}}\X${}\E{}$\6
+\Y\B\4\X11:Lokální proměnné funkce \PB{\\{main}}\X${}\E{}$\6
\&{FILE} ${}{*}\\{infile},{}$ ${}{*}\\{outfile};{}$\6
\&{char} \\{backup}[\.{MAXLEN}];\6
\&{int} \|j;\par
\U5.\fi
-\M{10}Definujeme funkci pro výpis chybového hlášení při neúspěšném otevření
+\M{12}Definujeme funkci pro výpis chybového hlášení při neúspěšném otevření
souboru.
\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{ioerr}(\&{char} ${}{*}\|f){}$\1\1\2\2\6
@@ -224,14 +278,14 @@ ${}\\{fprintf}(\\{stderr},\39\.{"\%s:\ cannot\ open\ fil}\)\.{e\ \%s\\n"},\39%
\4${}\}{}$\2\par
\fi
-\M{11}Způsob zpracování souborů rozlišíme podle režimu daným přepínačem \.{-f}.
-\Y\B\4\X11:Zpracování souborů\X${}\E{}$\6
-\&{if} (\\{isfilter}) \X12:Zpracování v režimu filter\X\6
-\&{else} \X13:Zpracování všech souborů příkazové řádky\X\par
+\M{13}Způsob zpracování souborů rozlišíme podle režimu daným přepínačem \.{-f}.
+\Y\B\4\X13:Zpracování souborů\X${}\E{}$\6
+\&{if} (\\{isfilter}) \X14:Zpracování v režimu filter\X\6
+\&{else} \X15:Zpracování všech souborů příkazové řádky\X\par
\Q6.
\U5.\fi
-\M{12}V režimu \PB{$\\{isfilter}\E\T{1}$} je další zpracování závislé na počtu
+\M{14}V režimu \PB{$\\{isfilter}\E\T{1}$} je další zpracování závislé na počtu
souborů v
příkazové řádce:
\begitems
@@ -240,7 +294,7 @@ příkazové řádce:
* dva soubory -- první je vstupní, druhý výstupní,
* více souborů -- program skončí s chybou.
\enditems
-\Y\B\4\X12:Zpracování v režimu filter\X${}\E{}$\6
+\Y\B\4\X14:Zpracování v režimu filter\X${}\E{}$\6
${}\{{}$\1\6
\&{if} ${}(\\{argc}>\T{3}){}$\1\5
${}\\{printusage}(\,),\39\\{exit}(\.{BAD\_OPTIONS});{}$\2\6
@@ -264,9 +318,9 @@ ${}\\{tie}(\\{infile},\39\\{outfile});{}$\6
\&{if} ${}(\\{infile}\I\\{stdin}){}$\1\5
\\{fclose}(\\{infile});\2\6
\4${}\}{}$\2\par
-\U11.\fi
+\U13.\fi
-\M{13}V~režimu \PB{$\\{isfilter}\E\T{0}$} jsou jednotlivé soubory v~příkazovém
+\M{15}V~režimu \PB{$\\{isfilter}\E\T{0}$} jsou jednotlivé soubory v~příkazovém
řádku
interpretovány jako vstupní i výstupní. Více souborů v~příkazovém řádku má
stejný efekt, jako opakované volání programu na jednotlivé soubory.
@@ -275,7 +329,7 @@ všech souborů s~příponou~\.{tex}. Toto neplatí v~DOSu, protože interpretace
masky je v~\UNIX/u starostí shellu a nikoli programu samotného. Náš program
masku nebude interpretovat. Je-li v~tomto režimu nulový počet souborů,
program se ukončí s~chybou.
-\Y\B\4\X13:Zpracování všech souborů příkazové řádky\X${}\E{}$\6
+\Y\B\4\X15:Zpracování všech souborů příkazové řádky\X${}\E{}$\6
${}\{{}$\1\6
\&{if} ${}(\\{argc}\E\T{1}){}$\1\5
${}\\{printusage}(\,),\39\\{exit}(\.{BAD\_OPTIONS});{}$\2\6
@@ -283,7 +337,7 @@ ${}\\{printusage}(\,),\39\\{exit}(\.{BAD\_OPTIONS});{}$\2\6
${}\{{}$\1\6
${}\\{argc}\MM;{}$\6
${}\\{argv}\PP;{}$\6
-\X14:Přejmenuj vstup \PB{\\{argv}[\T{0}]} na \PB{\\{backup}} a otevři jej jako %
+\X16:Přejmenuj vstup \PB{\\{argv}[\T{0}]} na \PB{\\{backup}} a otevři jej jako %
\PB{\\{infile}}\X;\6
\&{if} ${}(\\{infile}\E\NULL){}$\5
${}\{{}$\1\6
@@ -305,9 +359,9 @@ ${}\\{fclose}(\\{outfile}),\39\\{fclose}(\\{infile});{}$\6
\\{remove}(\\{backup});\2\6
\4${}\}{}$\2\6
\4${}\}{}$\2\par
-\U11.\fi
+\U13.\fi
-\M{14}Při \PB{$\\{isfilter}\E\T{0}$} program přejmenuje každý zpracovávaný
+\M{16}Při \PB{$\\{isfilter}\E\T{0}$} program přejmenuje každý zpracovávaný
soubor tak, že
změní poslední písmeno názvu souboru na znak \.{\char126}. Tento
přejmenovaný soubor bude otevřen jako vstupní a výstupem bude původní
@@ -317,7 +371,7 @@ záloha.
Proč vlnku nepřidáváme na konec názvu souboru, ale měníme ji za poslední
znak souboru? Protože chceme, aby program fungoval i v tak nemožných
systémech, jako je DOS.
-\Y\B\4\X14:Přejmenuj vstup \PB{\\{argv}[\T{0}]} na \PB{\\{backup}} a otevři jej
+\Y\B\4\X16:Přejmenuj vstup \PB{\\{argv}[\T{0}]} na \PB{\\{backup}} a otevři jej
jako \PB{\\{infile}}\X${}\E{}$\6
$\\{infile}\K\NULL;{}$\6
${}\|j\K\\{strlen}(\\{argv}[\T{0}])-\T{1};{}$\6
@@ -336,9 +390,9 @@ ${}\|j\K\\{rename}(\\{argv}[\T{0}],\39\\{backup});{}$\6
\&{if} ${}(\|j\E\T{0}){}$\1\5
${}\\{infile}\K\\{fopen}(\\{backup},\39\.{"r"});{}$\2\6
\4${}\}{}$\2\par
-\U13.\fi
+\U15.\fi
-\N{1}{15}Patterny. Abychom mohli účelně definovat chování programu
+\N{1}{17}Patterny. Abychom mohli účelně definovat chování programu
v~různých situacích, zavedeme datovou strukturu \PB{\.{PATTERN}}. Zhruba
řečeno, budeme sledovat vstup znak po znaku a pokud bude část vstupu
souhlasit s~definovaným patternem, provedeme námi požadovanou
@@ -392,7 +446,7 @@ patternu }\2\6
${}\}{}$ \&{PATTERN};\par
\fi
-\M{16}Deklarujeme některé globální proměnné pro práci s~patterny. \PB{\\{lapi}}
+\M{18}Deklarujeme některé globální proměnné pro práci s~patterny. \PB{\\{lapi}}
je pole
obsahující ukazatele na aktuální pozice v~otevřených patternech. Říkáme,
že \uv{pattern je otevřen}, pokud zkoumaný řetězec s~ním {\it začíná\/}
@@ -453,7 +507,24 @@ patterny }\6
\&{int} \\{ind};\C{ aktualni pozice prechodneho bufferu }\par
\fi
-\M{17}Nyní definujeme pomocné funkce \PB{\\{setpattern}}, \PB{\\{setpi}} a \PB{%
+\M{19}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 \PB{\\{buff}} může obsahovat i nulové byty, které je třeba přepsat do
+výstupu.
+Na druhé straně buffer \PB{\\{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 \PB{\\{buffnz}} osmibytový, začnu jej plnit od \PB{\\{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 \PB{\\{buffnz}}[4].
+\Y\B\4\X4:Globální deklarace\X${}\mathrel+\E{}$\6
+\&{char} \\{buffnz}[\T{8}];\6
+\&{int} \\{inz};\par
+\fi
+
+\M{20}Nyní definujeme pomocné funkce \PB{\\{setpattern}}, \PB{\\{setpi}} a \PB{%
\\{normalpattern}}.
Tyto funkce alokují paměť pomocí standardní funkce \PB{\\{malloc}}. Abychom
mohli
@@ -474,7 +545,7 @@ ${}\\{fprintf}(\\{stderr},\39\.{"\%s,\ no\ memory,\ mall}\)\.{oc\ failed\\n"},%
\4${}\}{}$\2\par
\fi
-\M{18}Funkce \PB{\\{setpattern}} alokuje paměťové místo struktury \PB{%
+\M{21}Funkce \PB{\\{setpattern}} alokuje paměťové místo struktury \PB{%
\&{PATTERN}} a napojí
ji pomocí proměnné \PB{\\{lastpt}} na už alokovaný řetěz patternů.
Vrátí ukazatel na nově alokované místo. Jednotlivé pozice patternu se musí
@@ -496,7 +567,7 @@ ${}\\{lastpi}\K\NULL;{}$\6
\4${}\}{}$\2\par
\fi
-\M{19}Funkce \PB{\\{setpi}} alokuje paměťové místo pro jednu pozici patternu.
+\M{22}Funkce \PB{\\{setpi}} alokuje paměťové místo pro jednu pozici patternu.
Provede
zřetězení tak, aby první pozice řetězu pozic byla zaznamenána v položce
\PB{\\{patt}} ve struktuře \PB{\&{PATTERN}} a další byly provázány položkou %
@@ -519,7 +590,7 @@ ${}\\{lastpi}\K\|p;{}$\6
\4${}\}{}$\2\par
\fi
-\M{20}Připravme si půdu pro funkci \PB{\\{normalpattern}}. Tato funkce alokuje
+\M{23}Připravme si půdu pro funkci \PB{\\{normalpattern}}. Tato funkce alokuje
strukturu pro jeden pattern včetně pozic patternu na základě vstupního
stringu. Každá pozice patternu obsahuje v~množině znaků jediný znak a má
\PB{$\\{flag}\K\.{ONE}$}. Znaky ve vstupním stringu odpovídají po řadě
@@ -535,17 +606,17 @@ Nejdříve deklarujeme pole všech možných jednopísmenných stringů.
\&{int} \|i;\par
\fi
-\M{21}Inicializujeme toto pole (znak, nula, znak, nula, atd...).
-\Y\B\4\X21:Inicializace datových struktur\X${}\E{}$\6
+\M{24}Inicializujeme toto pole (znak, nula, znak, nula, atd...).
+\Y\B\4\X24:Inicializace datových struktur\X${}\E{}$\6
\&{for} ${}(\|i\K\T{0};{}$ ${}\|i<\T{256};{}$ ${}\|i\PP){}$\5
${}\{{}$\1\6
${}\\{strings}[\T{2}*\|i]\K{}$(\&{char}) \|i;\6
${}\\{strings}[\T{2}*\|i+\T{1}]\K\T{0};{}$\6
\4${}\}{}$\2\par
-\As34, 37, 39, 40, 43, 46, 48, 50\ETs54.
+\As37, 40, 42, 43, 46, 49, 51, 53\ETs57.
\U5.\fi
-\M{22}Definujme funkci \PB{\\{normalpattern}}.
+\M{25}Definujme funkci \PB{\\{normalpattern}}.
\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{PATTERN} ${}{*}\\{normalpattern}(\&{void}({*}\\{proc})(\&{void}),%
\39{}$\&{const} \&{char} ${}{*}\\{str}){}$\1\1\2\2\6
@@ -572,7 +643,7 @@ ${}\|j\PP;{}$\6
\4${}\}{}$\2\par
\fi
-\M{23}Funkce \PB{\\{match}}. Definujeme funkci, která na základě hodnoty znaku %
+\M{26}Funkce \PB{\\{match}}. Definujeme funkci, která na základě hodnoty znaku %
\PB{\|c}
(proměnná \PB{\|c} je definována jako globální), a pozice patternu \PB{\|p}
(parametr
@@ -615,16 +686,16 @@ ${}\{{}$\1\6
\4\&{case} \.{ONE\_NOT}:\5
\&{return} \.{NOFOUND};\C{ Nesouhlas }\6
\4\&{case} \.{ANY\_NOT}:\5
-\X24:Vrať hodnotu podle následující pozice patternu\X;\6
+\X27:Vrať hodnotu podle následující pozice patternu\X;\6
\4${}\}{}$\2\6
\&{return} \T{0};\C{ Tady bychom nikdy nemeli byt, return pro potlaceni
varovani }\6
\4${}\}{}$\2\par
\fi
-\M{24}O kolik pozic je třeba se posunout a s jakým výsledkem zjistíme
+\M{27}O kolik pozic je třeba se posunout a s jakým výsledkem zjistíme
rekurzivním voláním funkce \PB{\\{match}}.
-\Y\B\4\X24:Vrať hodnotu podle následující pozice patternu\X${}\E{}$\6
+\Y\B\4\X27:Vrať hodnotu podle následující pozice patternu\X${}\E{}$\6
\&{switch} ${}(\|m\K\\{match}(\|p\MG\\{next})){}$\5
${}\{{}$\1\6
\4\&{case} \.{NOFOUND}:\5
@@ -634,9 +705,9 @@ ${}\{{}$\1\6
\4\&{default}:\5
\&{return} \T{1}${}+\|m;{}$\6
\4${}\}{}$\2\par
-\U23.\fi
+\U26.\fi
-\N{1}{25}Vlnkovací funkce.
+\N{1}{28}Vlnkovací funkce.
Nejprve připravíme globální deklarace pro \uv{vlnkovací} funkci \PB{\\{tie}}.
Funkce \PB{\\{tie}} \uv{ovlnkuje} vstupní soubor \PB{\\{infile}} a vytvoří
soubor
@@ -664,12 +735,12 @@ statistiku }\6
\&{int} \\{mode};\par
\fi
-\M{26}Nyní definujeme vlnkovací funkci \PB{\\{tie}}. Veškerá činnost se opírá o
+\M{29}Nyní definujeme vlnkovací funkci \PB{\\{tie}}. Veškerá činnost se opírá o
strukturu patternů. Výhodné je (z důvodu rychlosti) \uv{natvrdo} zde
implementovat jen přepínání mezi stavem čtení z oblasti komentáře
(\PB{$\\{listpatt}\E\\{commentlist}$}) a mimo komentář (\PB{$\\{listpatt}\E%
\\{normallist}$});
-\Y\B\4\X26:Vlnkovací funkce \PB{\\{tie}}\X${}\E{}$\6
+\Y\B\4\X29:Vlnkovací funkce \PB{\\{tie}}\X${}\E{}$\6
\&{static} \&{void} \\{tie}(\&{FILE} ${}{*}\\{input},\39{}$\&{FILE} ${}{*}%
\\{output}){}$\1\1\2\2\6
${}\{{}$\1\6
@@ -678,12 +749,12 @@ ${}\{{}$\1\6
\&{int} \\{ic};\6
\&{PATTERN} ${}{*}\\{pp};{}$\6
\&{PATITEM} ${}{*}\\{pi};{}$\7
-\X27:Inicializace proměnných při startu funkce \PB{\\{tie}}\X;\6
+\X30:Inicializace proměnných při startu funkce \PB{\\{tie}}\X;\6
\&{while} ${}(\R\\{feof}(\\{input})){}$\5
${}\{{}$\1\6
-\X30:Otevři nové patterny\X;\6
\&{if} ${}(\\{ap}\E\T{0}\W\\{ind}>\.{BUFI}\W\|c\I\.{'\\\\'}){}$\1\5
-\X28:Vyprázdni buffer\X;\2\6
+\X31:Vyprázdni buffer\X;\2\6
+\X33:Otevři nové patterny\X;\C{ 1. 2. 2010: prohozene poradi }\6
\&{if} ${}(\\{ind}\G\.{MAXBUFF}){}$\5
${}\{{}$\1\6
${}\\{fprintf}(\\{stderr},\39\.{"Operating\ buffer\ ov}\)\.{erflow,\ is\
@@ -694,34 +765,47 @@ anything\ }\)\.{wrong?\\n"});{}$\6
\1\6
\&{break};\2\6
${}\\{buff}[\\{ind}\PP]\K\|c\K\\{ic};{}$\6
+\&{if} ${}(\|c\E\T{0}){}$\1\5
+\&{continue};\C{ 30. 4. 2009 }\2\6
+\&{if} ${}(\\{inz}\G\T{8}){}$\5
+${}\{{}$\1\6
+\&{for} ${}(\\{inz}\K\T{0};{}$ ${}\\{inz}<\T{4};{}$ ${}\\{inz}\PP){}$\1\5
+${}\\{buffnz}[\\{inz}]\K\\{buffnz}[\\{inz}+\T{4}];{}$\2\6
+${}\\{inz}\K\T{4};{}$\6
+\4${}\}{}$\2\6
+${}\\{buffnz}[\\{inz}\PP]\K\|c;{}$\6
\&{if} ${}(\|c\E\.{'\\n'}){}$\1\5
${}\\{numline}\PP,\39\\{listpatt}\K\\{normallist};{}$\2\6
-\&{if} ${}(\|c\E\.{'\%'}\W\\{mode}\I\.{VERBMODE}\W\\{buff}[\\{ind}-\T{2}]\I\.{'%
-\\\\'}){}$\1\5
+\&{if} ${}(\|c\E\.{'\%'}\W\\{mode}\I\.{VERBMODE}\W\\{buffnz}[\\{inz}-\T{2}]\I%
+\.{'\\\\'}){}$\1\5
${}\\{listpatt}\K\\{commentlist};{}$\2\6
-\X29:Projdi otevřené patterny\X;\6
+\X32:Projdi otevřené patterny\X;\6
\4${}\}{}$\2\6
-\X28:Vyprázdni buffer\X;\6
+\X31:Vyprázdni buffer\X;\6
\&{if} ${}(\R\\{web}){}$\1\5
\\{checkmode}(\,);\C{ zaverecna kontrola modu }\2\6
\&{if} ${}(\R\\{silent}){}$\1\5
-\X32:Tiskni závěrečnou zprávu\X;\2\6
+\X35:Tiskni závěrečnou zprávu\X;\2\6
\4${}\}{}$\2\par
\U1.\fi
-\M{27}\B\X27:Inicializace proměnných při startu funkce \PB{\\{tie}}\X${}\E{}$\6
+\M{30}\B\X30:Inicializace proměnných při startu funkce \PB{\\{tie}}\X${}\E{}$\6
\&{for} ${}(\|k\K\T{0};{}$ ${}\|k<\.{MAXPATT};{}$ ${}\|k\PP){}$\1\5
${}\\{lapi}[\|k]\K\NULL;{}$\2\6
${}\|c\K\.{'\\n'};{}$\6
-${}\\{buff}[\T{0}]\K\\{mode}\K\\{ap}\K\T{0};{}$\6
+${}\\{buff}[\T{0}]\K\T{1};{}$\6
+${}\\{mode}\K\\{ap}\K\T{0};{}$\6
${}\\{ind}\K\T{1};{}$\6
+\&{for} ${}(\\{inz}\K\T{0};{}$ ${}\\{inz}<\T{4};{}$ ${}\\{inz}\PP){}$\1\5
+${}\\{buffnz}[\\{inz}]\K\T{0};{}$\2\6
+${}\\{inz}\K\T{4};{}$\6
${}\\{numline}\K\T{1};{}$\6
${}\\{numchanges}\K\T{0};{}$\6
${}\\{mode}\K\.{TEXTMODE}{}$;\par
-\A35.
-\U26.\fi
+\A38.
+\U29.\fi
-\M{28}Při manipulaci s bufferem byl použit jeden trik. Veškeré načtené znaky
+\M{31}Při manipulaci s bufferem byl použit jeden trik. Veškeré načtené znaky
začínají až od \PB{\\{buff}[\T{1}]}, zatímco \PB{\\{buff}[\T{0}]} je rovno
nule. Je to proto, že
některé algoritmy se vrací o jeden znak zpět za svůj pattern, aby zjistily,
@@ -730,16 +814,19 @@ zda tam není symbol \uv{\.{\char92}} (například na výskyt sekvence
procenta). Kdybychm zazačali od \PB{\\{buff}[\T{0}]}, v některých situacích
bychom se ptali, zda \PB{$\\{buff}[{-}\T{1}]\E\.{'\\\\'}$}, tj. sahali bychom
na neošetřené
-místo v paměti.
-\Y\B\4\X28:Vyprázdni buffer\X${}\E{}$\6
+místo v paměti. Od 30. 4. 2009 tento problém pominul, protože se ptáme dozadu
+pouze
+v~\PB{\\{buffnz}}, ale vlastnost dříve implementovanou v \PB{\\{buff}} jsem
+ponechal beze změny.
+\Y\B\4\X31:Vyprázdni buffer\X${}\E{}$\6
${}\{{}$\1\6
-${}\\{buff}[\\{ind}]\K\T{0};{}$\6
-${}\\{fputs}({\AND}\\{buff}[\T{1}],\39\\{output});{}$\6
+${}\\{fwrite}({\AND}\\{buff}[\T{1}],\39\\{ind}-\T{1},\39\T{1},\39%
+\\{output});{}$\6
${}\\{ind}\K\T{1};{}$\6
\4${}\}{}$\2\par
-\U26.\fi
+\U29.\fi
-\M{29}Při procházení otevřenými patterny posunujeme v poli \PB{\\{lapi}} pozice
+\M{32}Při procházení otevřenými patterny posunujeme v poli \PB{\\{lapi}} pozice
jednotlivých patternů podle pokynů funkce \PB{\\{match}}, případně pattern
zavřeme
a případně vyvoláme proceduru patternu.
@@ -747,7 +834,7 @@ a případně vyvoláme proceduru patternu.
Některé patterny v poli \PB{\\{lapi}} už mohou být zavřeny, takže je nutno s
tímto
polem pracovat jako s jakýmsi děravým sýrem.
-\Y\B\4\X29:Projdi otevřené patterny\X${}\E{}$\6
+\Y\B\4\X32:Projdi otevřené patterny\X${}\E{}$\6
$\|n\K\\{ap};{}$\6
${}\|k\K\T{0};{}$\6
\&{while} (\|n)\5
@@ -770,15 +857,16 @@ ${}\\{lapi}[\|k]\K\\{lapi}[\|k]\MG\\{next}{}$;\C{ dalsi pozice patternu }\2\6
${}\|k\PP;{}$\6
${}\|n\MM;{}$\6
\4${}\}{}$\2\par
-\U26.\fi
+\U29.\fi
-\M{30}Při otevírání nových patternů, které nejsou v tuto chvíli zablokovány,
+\M{33}Při otevírání nových patternů, které nejsou v tuto chvíli zablokovány,
se hned vypořádáme s takovými patterny, které nám dávají rovnou odpověď
typu \PB{\.{FOUND}} nebo \PB{\.{NOFOUND}}. V takových případech ani nezanášíme
ukazatel
na pozici do pole \PB{\\{lapi}}.
-\Y\B\4\X30:Otevři nové patterny\X${}\E{}$\6
+\Y\B\4\X33:Otevři nové patterny\X${}\E{}$\6
$\\{pp}\K\\{listpatt};{}$\6
+\&{if} (\|c)\1\6
\&{while} ${}(\\{pp}\I\NULL){}$\5
${}\{{}$\1\6
\&{switch} ${}(\|m\K\\{match}(\\{pp}\MG\\{patt})){}$\5
@@ -788,18 +876,18 @@ ${}({*}\\{pp}\MG\\{proc})(\,){}$;\C{ spustit proceduru }\6
\4\&{case} \.{NOFOUND}:\5
\&{break};\6
\4\&{default}:\5
-\X31:Vytvoř ukazatel na nový pattern a \PB{\&{break}}\X;\6
+\X34:Vytvoř ukazatel na nový pattern a \PB{\&{break}}\X;\6
\4${}\}{}$\2\6
${}\\{pp}\K\\{pp}\MG\\{next};{}$\6
-\4${}\}{}$\2\par
-\U26.\fi
+\4${}\}{}$\2\2\par
+\U29.\fi
-\M{31}Není-li hned známa odpověď, zda pattern vyhovuje či nikoli,
+\M{34}Není-li hned známa odpověď, zda pattern vyhovuje či nikoli,
překontrolujeme nejdříve, zda už není pattern ve stejné pozici otevřený.
Pak najdeme první \uv{díru} v tabulce \PB{\\{lapi}} a tam uhnízdíme nový
ukazatel
na pozici v patternu.
-\Y\B\4\X31:Vytvoř ukazatel na nový pattern a \PB{\&{break}}\X${}\E{}$\6
+\Y\B\4\X34:Vytvoř ukazatel na nový pattern a \PB{\&{break}}\X${}\E{}$\6
$\\{pi}\K\\{pp}\MG\\{patt};{}$\6
\&{while} ${}(\|m\MM){}$\1\5
${}\\{pi}\K\\{pi}\MG\\{next};{}$\2\6
@@ -827,17 +915,17 @@ ${}\\{lapt}[\|k]\K\\{pp};{}$\6
${}\\{lapi}[\|k]\K\\{pi};{}$\6
${}\\{ap}\PP;{}$\6
\4${}\}{}$\2\par
-\U30.\fi
+\U33.\fi
-\M{32}Poslední věcí ve funci \PB{\\{tie}} je tisk závěrečné statistiky
+\M{35}Poslední věcí ve funci \PB{\\{tie}} je tisk závěrečné statistiky
zpracování.
-\Y\B\4\X32:Tiskni závěrečnou zprávu\X${}\E{}$\6
+\Y\B\4\X35:Tiskni závěrečnou zprávu\X${}\E{}$\6
$\\{fprintf}(\\{stderr},\39\.{"\~\~\~\ file:\ \%s\\t\ \ lin}\)\.{es:\ \%ld,\
changes:\ \%l}\)\.{d\\n"},\39\\{filename},\39\\{numline},\39\\{numchanges}){}$;%
\par
-\U26.\fi
+\U29.\fi
-\N{1}{33}Inicializace patternů.
+\N{1}{36}Inicializace patternů.
Po vytvoření předchozího kódu opírajícího se o~patterny máme nyní v~ruce
poměrně silný nástroj na definování různých činností programu prostým
vytvořením patternu a příslušné jeho procedury. Pokud budeme chtít
@@ -862,7 +950,7 @@ Nejprve deklarujeme některé často používané skupiny znaků v~patternech.
\\{parcheck},{}$ ${}{*}\\{verblist}{}$;\par
\fi
-\M{34}Začneme definicí nejčastěji používaného patternu na vlnkování uvnitř
+\M{37}Začneme definicí nejčastěji používaného patternu na vlnkování uvnitř
řádku. Připomeňme, že opakované volání funkce \PB{\\{setpattern}} vytváří
interně
seznam patternů, přičemž o~jejich propojení se nemusíme starat. Vyzvedneme
@@ -870,7 +958,7 @@ si z~návratového kódu funkce pouze ukazatel na první položku seznamu
\PB{\\{normallist}}. Stejně tak opakované volání funkce \PB{\\{setpi}} vytváří
seznam
pozic pro naposledy deklarovaný pattern.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
$\\{vlnkalist}\K\\{setpattern}(\\{vlnkain});{}$\6
${}\\{setpi}(\\{tblankscr},\39\.{ONE});{}$\6
${}\\{setpi}(\\{tblanks},\39\.{ANY});{}$\6
@@ -881,29 +969,54 @@ ${}\\{setpi}(\\{blanks},\39\.{ANY});{}$\6
${}\\{setpi}(\\{nochar},\39\.{ONE\_NOT}){}$;\par
\fi
-\M{35}\B\X27:Inicializace proměnných při startu funkce \PB{\\{tie}}\X${}%
+\M{38}\B\X30:Inicializace proměnných při startu funkce \PB{\\{tie}}\X${}%
\mathrel+\E{}$\6
$\\{listpatt}\K\\{normallist}\K\\{vlnkalist}{}$;\par
\fi
-\M{36}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\M{39}Vložení vlnky znamená vykonat následující práci: Zapamatovat si znak za
+skupinou mezer
+(do proměnné \PB{\|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é \PB{\|z}. Dále se posuneme v bufferu vlevo přes
+všechny mezery, tabelátory
+(přesněji \PB{\\{blanks}}) a přeskakujeme přitom všechny nulové byty. Index %
+\PB{\\{ind}} se zastaví
+na předložce. Posuneme jej doprava za předložku (++\PB{\\{ind}}) a pokud tam je
+nulový byte a první znak
+\PB{\\{tiestr}} není nulový, posuneme se až za tento nulový byte. Dále vložíme
+string \PB{\\{tiestr}},
+neboli vlnku. Nakonec připojíme zapamatovaný znak \PB{\|p}, ovšem pokud před
+ním byla nula,
+vložíme ji ještě před znak \PB{\|p}.
+\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{vlnkain}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
-\&{char} \|p;\7
+\&{int} \|i;\6
+\&{char} \|p${},{}$ \|z;\7
${}\\{ind}\MM;{}$\6
${}\|p\K\\{buff}[\\{ind}\MM];{}$\6
-\&{while} ${}(\\{strchr}(\\{blanks},\39\\{buff}[\\{ind}])\I\NULL){}$\1\5
+${}\|z\K\\{buff}[\\{ind}];{}$\6
+\&{while} ${}(\R\\{buff}[\\{ind}]\V(\\{strchr}(\\{blanks},\39\\{buff}[\\{ind}])%
+\I\NULL)){}$\1\5
${}\\{ind}\MM;{}$\2\6
-${}\\{ind}\PP;{}$\6
-${}\\{buff}[\\{ind}\PP]\K\.{'\~'};{}$\6
+\&{if} ${}(\R\\{buff}[\PP\\{ind}]\W\\{tiestr}[\T{0}]){}$\1\5
+${}\\{ind}\PP;{}$\2\6
+\&{for} ${}(\|i\K\T{0};{}$ ${}\|i<\\{tiestrlen};{}$ ${}\|i\PP){}$\1\5
+${}\\{buff}[\\{ind}\PP]\K\\{tiestr}[\|i];{}$\2\6
+${}\|i\K\\{tiestrlen}{}$;\C{ nulu pred p vlozime, pokud je z==0 a }\6
+\&{if} ${}(\R\\{tiestr}[\T{0}]){}$\1\5
+${}\|i\MM{}$;\C{ pocet vlozenych znaku z tiestr }\2\6
+\&{if} ${}(\R\|z\W(\|i\MOD\T{2})){}$\1\5
+${}\\{buff}[\\{ind}\PP]\K\T{0}{}$;\C{ je sudy }\2\6
${}\\{buff}[\\{ind}\PP]\K\|p;{}$\6
${}\\{numchanges}\PP;{}$\6
\4${}\}{}$\2\par
\fi
-\M{37}Podobně pro tvorbu vlnky \uv{přes řádek} vytvoříme pattern a kód
+\M{40}Podobně pro tvorbu vlnky \uv{přes řádek} vytvoříme pattern a kód
procedury.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
\\{setpattern}(\\{vlnkacr});\6
${}\\{setpi}(\\{tblankscr},\39\.{ONE});{}$\6
${}\\{setpi}(\\{tblanks},\39\.{ANY});{}$\6
@@ -915,7 +1028,7 @@ ${}\\{setpi}(\\{blanks},\39\.{ANY});{}$\6
${}\\{setpi}(\\{nochar},\39\.{ONE\_NOT}){}$;\par
\fi
-\M{38}V proceduře k tomuto patternu musíme ošetřit případ typu
+\M{41}V proceduře k tomuto patternu musíme ošetřit případ typu
\uv{\.{a\char126v\char92np}},
kdy nelze prostě přehodit \uv{\.{\char92n}} za \uv{\.{v}}, protože
bychom roztrhli
@@ -931,19 +1044,21 @@ nebudeme vytvářet nové. Na výstupu bude soubor o jeden řádek kratší.
\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{vlnkacr}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
-\&{char} \|p;\6
+\&{char} \|p${},{}$ \|z;\6
\&{int} \|i${},{}$ \|j;\7
${}\\{ind}\MM;{}$\6
${}\|p\K\\{buff}[\\{ind}\MM];{}$\6
-\&{while} ${}(\\{strchr}(\\{blankscr},\39\\{buff}[\\{ind}])\I\NULL){}$\1\5
+${}\|z\K\\{buff}[\\{ind}];{}$\6
+\&{while} ${}(\R\\{buff}[\\{ind}]\V(\\{strchr}(\\{blankscr},\39\\{buff}[%
+\\{ind}])\I\NULL)){}$\1\5
${}\\{ind}\MM;{}$\2\6
${}\|i\K\\{ind}{}$;\C{ misto predlozky, kterou chceme vazat }\6
\&{while} ${}(\|i\G\T{0}\W(\\{strchr}(\\{blankscr},\39\\{buff}[\|i])\E%
\NULL)){}$\1\5
${}\|i\MM;{}$\2\6
${}\|j\K\|i;{}$\6
-\&{while} ${}(\|i\G\T{0}\W(\\{strchr}(\\{blanks},\39\\{buff}[\|i])\I\NULL)){}$%
-\1\5
+\&{while} ${}(\|i\G\T{0}\W(\R\\{buff}[\\{ind}]\V(\\{strchr}(\\{blanks},\39%
+\\{buff}[\|i])\I\NULL))){}$\1\5
${}\|i\MM;{}$\2\6
\&{if} ${}(\|i\G\T{0}\W\\{buff}[\|i]\E\.{'\\n'}){}$\1\5
${}\|j\K{-}\T{1};{}$\2\6
@@ -951,16 +1066,23 @@ ${}\|j\K{-}\T{1};{}$\2\6
${}\\{buff}[\|j]\K\.{'\\n'};{}$\2\6
\&{else}\1\5
${}\\{numline}\MM;{}$\2\6
-${}\\{ind}\PP;{}$\6
-${}\\{buff}[\\{ind}\PP]\K\.{'\~'};{}$\6
+\&{if} ${}(\R\\{buff}[\PP\\{ind}]\W\\{tiestr}[\T{0}]){}$\1\5
+${}\\{ind}\PP;{}$\2\6
+\&{for} ${}(\|i\K\T{0};{}$ ${}\|i<\\{tiestrlen};{}$ ${}\|i\PP){}$\1\5
+${}\\{buff}[\\{ind}\PP]\K\\{tiestr}[\|i];{}$\2\6
+${}\|i\K\\{tiestrlen};{}$\6
+\&{if} ${}(\R\\{tiestr}[\T{0}]){}$\1\5
+${}\|i\MM;{}$\2\6
+\&{if} ${}(\R\|z\W(\|i\MOD\T{2})){}$\1\5
+${}\\{buff}[\\{ind}\PP]\K\T{0};{}$\2\6
${}\\{buff}[\\{ind}\PP]\K\|p;{}$\6
${}\\{numchanges}\PP;{}$\6
\4${}\}{}$\2\par
\fi
-\M{39}Nyní vytvoříme patterny pro případy typu \.{\char92uv\char`\{v lese\char`%
+\M{42}Nyní vytvoříme patterny pro případy typu \.{\char92uv\char`\{v lese\char`%
\}}.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
\\{setpattern}(\\{vlnkain});\C{ na radku }\6
${}\\{setpi}(\\{tblankscr},\39\.{ONE});{}$\6
${}\\{setpi}(\\{backslash},\39\.{ONE});{}$\6
@@ -986,21 +1108,22 @@ ${}\\{setpi}(\\{blanks},\39\.{ANY});{}$\6
${}\\{setpi}(\\{nochar},\39\.{ONE\_NOT}){}$;\par
\fi
-\M{40}Vytvoříme patterny a proceduru pro potlatčení tvorby vlnky u písmen těsně
+\M{43}Vytvoříme patterny a proceduru pro potlatčení tvorby vlnky u písmen těsně
následujících sekvence \.{\char92TeX} a \.{\char92LaTeX}. Tj. nechceme, aby
např z textu \uv{\.{Vlastnosti~\char92TeX~u~jsou...}} jsme dostali text
s nesprávně vázaným písmenem
\uv{\.{Vlastnosti~\char92TeX~u\char126jsou...}}.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
$\\{normalpattern}(\\{tielock},\39\.{"\\\\TeX"});{}$\6
${}\\{setpi}(\\{blankscr},\39\.{ONE});{}$\6
${}\\{normalpattern}(\\{tielock},\39\.{"\\\\LaTeX"});{}$\6
${}\\{setpi}(\\{blankscr},\39\.{ONE}){}$;\par
\fi
-\M{41}Procedura \PB{\\{tielock}} obsahuje nečistý trik. Při provádění procedury
+\M{44}Procedura \PB{\\{tielock}} obsahuje nečistý trik. Při provádění procedury
je
-právě načten znak z \PB{\\{blankscr}} a je uložen do buff. Testy na otevírání
+právě načten znak z \PB{\\{blankscr}} a je uložen do \PB{\\{buff}}. Testy na
+otevírání
nových patternů pro tento znak teprve budou následovat a testují se na
hodnotu proměnné \PB{\|c}. Stačí tedy změnit hodnotu \PB{\|c} a vlnkovací
patterny se
@@ -1012,7 +1135,7 @@ ${}\|c\K\T{1};{}$\6
\4${}\}{}$\2\par
\fi
-\M{42}Ošetříme nyní přechod do/z matematického režimu \TeX{}u. Uvnitř math
+\M{45}Ošetříme nyní přechod do/z matematického režimu \TeX{}u. Uvnitř math
módu vlnky neděláme. Při zjištěném nesouladu v přechodech mezi
math-módy spustíme následující proceduru.
\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
@@ -1026,11 +1149,11 @@ ${}\\{status}\K\.{WARNING};{}$\6
\4${}\}{}$\2\par
\fi
-\M{43}Začneme patterny pro přechod do/z matematického režimu, ohraničeného
+\M{46}Začneme patterny pro přechod do/z matematického režimu, ohraničeného
jedním dolarem, nebo v La\TeX{}u příslušnými sekvencemi. Sekvence
La\TeX{}u \.{\char92(} a \.{\char92)} nejsou zahrnuty, protože bývají
často předefinovány k jiným užitečnějším věcem.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
\&{if} ${}(\R\\{nomath}){}$\5
${}\{{}$\1\6
${}\\{mathlist}\K\\{setpattern}(\\{onedollar});{}$\6
@@ -1044,7 +1167,7 @@ ${}\\{normalpattern}(\\{mathout},\39\.{"\\\\end.\{math\}"});{}$\6
\4${}\}{}$\2\par
\fi
-\M{44}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\M{47}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{mathin}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
\&{if} ${}(\\{mode}\I\.{TEXTMODE}){}$\1\5
@@ -1061,7 +1184,7 @@ ${}\\{normallist}\K\\{listpatt}\K\\{vlnkalist};{}$\6
\4${}\}{}$\2\par
\fi
-\M{45}Při programování procedury \PB{\\{onedollar}} nesmíme zapomenout na
+\M{48}Při programování procedury \PB{\\{onedollar}} nesmíme zapomenout na
výskyt
sekvence \.{\char92\$}. V tom případě akci ignorujeme. Podobně u sekvence
\.{\$\$} souhlasí ten druhý dolar s naším patternem, ale to už jsme uvnitř
@@ -1069,8 +1192,8 @@ display módu. V takovém případě také nic neděláme.
\Y\B\4\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{onedollar}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
-\&{if} ${}(\\{buff}[\\{ind}-\T{3}]\E\.{'\\\\'}\V(\\{buff}[\\{ind}-\T{3}]\E\.{'%
-\$'}\W\\{buff}[\\{ind}-\T{4}]\I\.{'\\\\'})){}$\1\5
+\&{if} ${}(\\{buffnz}[\\{inz}-\T{3}]\E\.{'\\\\'}\V(\\{buffnz}[\\{inz}-\T{3}]\E%
+\.{'\$'}\W\\{buffnz}[\\{inz}-\T{4}]\I\.{'\\\\'})){}$\1\5
\&{return};\2\6
\&{if} ${}(\\{mode}\E\.{DISPLAYMODE}){}$\1\5
\\{printwarning}(\,);\2\6
@@ -1084,16 +1207,16 @@ ${}\{{}$\1\6
\4${}\}{}$\2\par
\fi
-\M{46}Pokud najdeme prázdný řádek, překontrolujeme, zda náhodou nejsme v
+\M{49}Pokud najdeme prázdný řádek, překontrolujeme, zda náhodou nejsme v
math-módu. Pokud ano, vypíšeme varování a přejdeme do textového módu.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
$\\{parcheck}\K\\{setpattern}(\\{checkmode});{}$\6
${}\\{setpi}(\\{cr},\39\.{ONE});{}$\6
${}\\{setpi}(\\{blanks},\39\.{ANY});{}$\6
${}\\{setpi}(\\{cr},\39\.{ONE}){}$;\par
\fi
-\M{47}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\M{50}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{checkmode}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
\&{if} ${}(\\{mode}\I\.{TEXTMODE}){}$\5
@@ -1105,12 +1228,12 @@ ${}\\{normallist}\K\\{listpatt}\K\\{vlnkalist};{}$\6
\4${}\}{}$\2\par
\fi
-\M{48}Nyní ošetříme výskyt dvou dolarů, tj. vstup do/z display módu.
+\M{51}Nyní ošetříme výskyt dvou dolarů, tj. vstup do/z display módu.
Rovněž mysleme na La\TeX{}isty a jejich prostředí pro display-mód. Protože
je možná alternativa s hvězdičkou na konci názvu prostředí, raději už
uzavírací závorku do patternu nezahrnujeme.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
\&{if} ${}(\R\\{nomath}){}$\5
${}\{{}$\1\6
${}\\{normalpattern}(\\{twodollars},\39\.{"\$\$"});{}$\6
@@ -1124,7 +1247,7 @@ ${}\\{normalpattern}(\\{displayout},\39\.{"\\\\end.\{equation"});{}$\6
\4${}\}{}$\2\par
\fi
-\M{49}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\M{52}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{displayin}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
\&{if} ${}(\\{mode}\I\.{TEXTMODE}){}$\1\5
@@ -1141,7 +1264,7 @@ ${}\\{normallist}\K\\{listpatt}\K\\{vlnkalist};{}$\6
\4${}\}{}$\2\7
\&{static} \&{void} \\{twodollars}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
-\&{if} ${}(\\{buff}[\\{ind}-\T{3}]\E\.{'\\\\'}){}$\1\5
+\&{if} ${}(\\{buffnz}[\\{inz}-\T{3}]\E\.{'\\\\'}){}$\1\5
\&{return};\2\6
\&{if} ${}(\\{mode}\E\.{DISPLAYMODE}){}$\1\5
\\{displayout}(\,);\2\6
@@ -1150,11 +1273,11 @@ ${}\{{}$\1\6
\4${}\}{}$\2\par
\fi
-\M{50}Následuje ošetření tzv. verbatim módu. Pro plain i La\TeX{} jsou
+\M{53}Následuje ošetření tzv. verbatim módu. Pro plain i La\TeX{} jsou
nejčastější
závorky pro verbatim mod tyto (variantu s \.{\char92begtt} používám
s oblibou já).
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
\&{if} ${}(\R\\{noverb}){}$\5
${}\{{}$\1\6
${}\\{verblist}\K\\{normalpattern}(\\{verbinchar},\39\.{"\\\\verb"});{}$\6
@@ -1187,7 +1310,7 @@ ${}\\{normalpattern}(\\{verbout},\39\.{"@>|"});{}$\6
\4${}\}{}$\2\par
\fi
-\M{51}Procedura \PB{\\{verbinchar}} se od \uv{společné} procedury \PB{%
+\M{54}Procedura \PB{\\{verbinchar}} se od \uv{společné} procedury \PB{%
\\{verbin}} liší v
tom, že zavede do stringu \PB{\\{verbchar}} momentální hodnotu proměnné \PB{%
\|c}.
@@ -1208,7 +1331,7 @@ ${}\\{mode}\K\.{VERBMODE};{}$\6
\4${}\}{}$\2\par
\fi
-\M{52}Při programování \uv{obecné} funkce \PB{\\{verbin}} musíme dbát na to,
+\M{55}Při programování \uv{obecné} funkce \PB{\\{verbin}} musíme dbát na to,
aby
zůstal aktivní pouze odpovídající \uv{výstupní} pattern k danému
vstupnímu. Také si zapamatujeme mód, ze kterého jsme do verbatim
@@ -1233,7 +1356,7 @@ ${}\|i\K\T{2};{}$\6
;\6
\4\&{case} \.{'d'}:\5
${}\|i\K\T{3};{}$\6
-\&{if} ${}(\\{buff}[\\{ind}-\T{3}]\E\.{'@'}){}$\1\5
+\&{if} ${}(\\{buffnz}[\\{inz}-\T{3}]\E\.{'@'}){}$\1\5
\&{return};\C{ dvojity @ ignorovat }\2\6
\&{break};\6
\4${}\}{}$\2\6
@@ -1245,13 +1368,13 @@ ${}\\{mode}\K\.{VERBMODE};{}$\6
\4${}\}{}$\2\par
\fi
-\M{53}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\M{56}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{verbout}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
\&{if} ${}(\\{mode}\I\.{VERBMODE}){}$\1\5
\&{return};\2\6
-\&{if} ${}(\\{web}\W\\{buff}[\\{ind}-\T{2}]\E\.{'@'}\W\\{buff}[\\{ind}-\T{3}]\E%
-\.{'@'}){}$\1\5
+\&{if} ${}(\\{web}\W\\{buffnz}[\\{inz}-\T{2}]\E\.{'@'}\W\\{buffnz}[\\{inz}-%
+\T{3}]\E\.{'@'}){}$\1\5
\&{return};\2\6
${}\\{mode}\K\\{prevmode};{}$\6
${}\\{normallist}\MG\\{next}\K\\{prevlist};{}$\6
@@ -1270,16 +1393,16 @@ ${}\\{normallist}\K\\{listpatt}\K\\{vlnkalist};{}$\6
\4${}\}{}$\2\par
\fi
-\M{54}Nyní implementujeme vlastnost dříve používaného programu vlnka, tj. že
+\M{57}Nyní implementujeme vlastnost dříve používaného programu vlnka, tj. že
lze jeho činnost vypnout a opět zapnout v komentářích. Vytváříme druhý
nezávislý seznam patternů a proto nejprve pronulujeme \PB{\\{lastpt}}.
-\Y\B\4\X21:Inicializace datových struktur\X${}\mathrel+\E{}$\6
+\Y\B\4\X24:Inicializace datových struktur\X${}\mathrel+\E{}$\6
$\\{lastpt}\K\T{0};{}$\6
${}\\{commentlist}\K\\{normalpattern}(\\{tieoff},\39\.{"\%.\~.-"});{}$\6
${}\\{normalpattern}(\\{tieon},\39\.{"\%.\~.+"}){}$;\par
\fi
-\M{55}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
+\M{58}\B\X6:Pomocné funkce\X${}\mathrel+\E{}$\6
\&{static} \&{void} \\{tieoff}(\&{void})\1\1\2\2\6
${}\{{}$\1\6
${}\\{normallist}\K\NULL;{}$\6
@@ -1290,7 +1413,7 @@ ${}\\{normallist}\K\\{vlnkalist};{}$\6
\4${}\}{}$\2\par
\fi
-\M{56}Další plánovaná vylepšení. Program by mohl číst definici svého chování
+\M{59}Další plánovaná vylepšení. Program by mohl číst definici svého chování
nejen z~příkazové řádky, ale v~mnohem kompletnější podobě, včetně
uživatelsky definovaných patternů, z komentářové oblasti ve čteném souboru.
Parametry zde uvedené by mohly mít vyšší prioritu, než parametry
@@ -1300,7 +1423,7 @@ písmena nemají být vázana vlnkou (zatím je implemenováno na pevno jen
\fi
-\N{1}{57}Rejstřík.
+\N{1}{60}Rejstřík.
\fi