\chapter{Popis problému, specifikace cíle}

Tato kapitola se zaměřuje předev\v{s}\'{\i}m na v\'{y}chodiska
bakal\'{a}řsk\'{e} pr\'{a}ce, tj. stanovuje jej\'{\i} c\'{\i}le a
po\v{z}adavky a popisuje stav, ve kter\'{e}m byl program převzat.

\section{V\'{y}choz\'{\i} stav}
V~tomto odstavci je pops\'{a}no, v~jak\'{e}m stavu se program Espresso
nach\'{a}zelo před zah\'{a}jen\'{\i}m jeho změny a jak\'{e} materi\'{a}ly
byly současně s~n\'{\i}m autorovi pr\'{a}ce poskytnuty.

Espresso existovalo jako spustiteln\'{y} program pro operačn\'{\i}
syst\'{e}m MS DOS, kter\'{y} fungoval i pod operačn\'{\i}m syst\'{e}mem MS
Windows.

Samozřejmě byly k~dispozici i zdrojov\'{e} k\'{o}dy Espressa napsan\'{e}
v~jazyce K{\&}R C (v\'{\i}c informac\'{\i} k~nalezen\'{\i} zde \ref{AnsiC}), 
kter\'{e} se ani s~přilo\v{z}en\'{y}m souborem {\it Makefile} nepovedlo
zkompilovat. Program byl rozm\'{\i}stěn do~několika adres\'{a}řů
představuj\'{\i}c\'{\i} bal\'{\i}čky, kter\'{e} plnily odli\v{s}n\'{e}
\'{u}koly. Ka\v{z}d\'{y} bal\'{\i}ček obsahoval dokumentaci se
z\'{a}kladn\'{\i}m popisem funkc\'{\i}. (Popis bal\'{\i}čků k~nalezen\'{\i}
v~př\'{\i}loze \ref{Balicky}

D\'{a}le byly autorovi pr\'{a}ce poskytnuty manu\'{a}lov\'{e} str\'{a}nky
(obsahuj\'{\i}c\'{\i} popis přep\'{\i}načů Espressa \cite{EspressoMan} a
popis form\'{a}tu vstupn\'{\i}ho souboru \cite{EspressoFormat}) a kniha detailně
popisuj\'{\i}c\'{\i} funkci Espresso algoritmu \cite{Minimization}

\section{C\'{\i}l pr\'{a}ce}
\'{U}kolem pr\'{a}ce bylo upravit původn\'{\i}, 20 let star\'{y} program do
formy pou\v{z}iteln\'{e} pro knihovnu. N\'{a}sledně navrhnout a
implementovat rozhran\'{\i} pro knihovnu postavenou nad upraven\'{y}m
programem a nakonec z~v\'{y}sledn\'{e} inovace vytvořit statickou i
dynamickou knihovnu pou\v{z}itelnou pod operačn\'{\i}mi syst\'{e}my MS
Windows a Linux.

Kromě toho, \v{z}e k\'{y}\v{z}en\'{a} knihovna v~sobě bude zahrnovat
v\v{s}echnu funkcionalitu původn\'{\i}ho Espressa, maj\'{\i} b\'{y}t
př\'{\i}stupn\'{e} funkce představuj\'{\i}c\'{\i} jednotliv\'{e} kroky
Espresso algoritmu (pro v\'{\i}c informac\'{\i} viz. \cite{Minimization}

\section{Po\v{z}adavky na v\'{y}stup}\label{Pozadavky}
Vět\v{s}ina prim\'{a}rn\'{\i}ch po\v{z}adavků souvisela s~t\'{\i}m, \v{z}e
se jednalo o implementaci knihovny. Knihovna by měla:

\begin{itemize}
\item \uv{Po sobě v\v{z}dy uklidit}, tj. zajistit, aby nedoch\'{a}zelo k~memory-leakům \footnote{memory-leak=unikl\'{a} paměť, kter\'{a} měla b\'{y}t dealokov\'{a}na a nebyla}
\item poskytovat u\v{z}ivateli informaci o korektn\'{\i}m průběhu vykon\'{a}van\'{y}ch funkc\'{\i} nebo o př\'{\i}padn\'{y}ch chyb\'{a}ch, kter\'{e} během vykon\'{a}v\'{a}n\'{\i} nastaly.
\item b\'{y}t přenositeln\'{a}
\end{itemize}
a naopak by zas neměla:

\begin{itemize}
\item volat funkce na ukončen\'{\i} běhu programu
\item pos\'{\i}lat kamkoliv data, ani\v{z} by j\'{\i} to bylo explicitně zad\'{a}no
\end{itemize}
Dal\v{s}\'{\i} zadavatelem určen\'{e} po\v{z}adavky byly
n\'{a}sleduj\'{\i}c\'{\i}:

\begin{itemize}
\item logick\'{a} funkce se mus\'{\i} umět duplikovat (vytvořit svou kopii)
\item zpř\'{\i}stupnit funkce představuj\'{\i}c\'{\i} jednotliv\'{e} kroky Espresso algoritmu
\end{itemize}
Několik dal\v{s}\'{\i}ch po\v{z}adavků vyvstalo i během anal\'{y}zy
\ref{Analyza} a budou zm\'{\i}něny v~z\'{a}věru anal\'{y}zy \ref{ZaverAnalyzy}

Volba implementačn\'{\i}ho prostřed\'{\i} byla ponech\'{a}na na z\'{a}věr
anal\'{y}zy (kapitola \ref{ZaverAnalyzy}). Prozat\'{\i}m bylo určeno, \v{z}e to bude C
nebo C++, přičem\v{z} obě alternativy přin\'{a}\v{s}ej\'{\i} sv\'{e} pro a
proti.
