Unita GetOpts poprvé - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Unita GetOpts poprvé

30. srpna 2001, 00.00 | I když světu počítačů dominují různá grafická uživatelská
rozhraní, stále nevymizela potřeba používat klasický příkazový
řádek. I ve Free Pascalu se s ním dá pohodlně pracovat.

I když světu počítačů dominují různá grafická uživatelská rozhraní, stále nevymizela potřeba používat klasický příkazový řádek a programy, které fungují v textovém režimu. Chování takových programů lze většinou ovlivnit pomocí parametrů zapsaných na příkazovém řádku za názvem spouštěného programu.

My se budeme zajímat o to, jak z programu tyto parametry efektivně zpracovávat. Ve chvíli, kdy je program trochu složitější a má několik desítek různých voleb, je poněkud nepohodlné zvládat vše pomocí klasických dvou pascalských funkcí ParamCount a ParamStr. A právě pro tyto situace je určena unita GetOpts, která je dostupná právě ve Free Pascalu.

Původ

Tato unita se (jako ostatně většina věcí) nevzala ve Free Pascalu zčista jasna, ale je v podstatě přepsáním obdobné knihovny, dostupné standardně v Linuxu s překladačem jazyka C++ GCC.

Unita byla původně určena jen pro Linux, ale nyní je dostupná i pro všechny ostatní platformy podporované Free Pascalem.

Druhy parametrů

Obecně se programům předávají dva druhy parametrů: volby (options) a soubory (files nebo obecněji non-options).

Za volby jsou v unitě GetOpts považovány všechny parametry začínající pomlčkou (-). Volby můžou být krátké (jednopísmenné) a dlouhé (vícepísmenné), přičemž dlouhé jsou uvozeny dvěma pomlčkami (--). Obvykle má každá volba jak krátkou, tak i dlouhou variantu. Například nápovědu lze většinou vyvolat volbami -h nebo --help, přičemž obě dvě jsou ekvivalentní.

Za některými volbami je třeba doplnit argumenty, které volbu dále zpřesňují. Například vypisovaní něčeho do šířky 50 sloupců můžeme typicky zadat takto: -w 50 (nebo -w=50).

Soubory, se kterými se má pracovat, jsou obvykle předávány na úplném konci příkazového řádku (ale někdy též jako argumenty některých voleb, záleží na konkrétním případu).

Krátké volby

Dnes se podíváme na tu část knihovny, která je určena pro práci s krátkými volbami. Klíčem je zde funkce GetOpt deklarovaná takto::

function GetOpt (ShortOpts: String): Char;

Do jejího parametru ShortOpts vepíšeme řetězec znaků, které jsou povolenými krátkými volbami našeho programu. Pokud má volba povinný argument, doplníme za její písmeno dvojtečku (:), pokud je tento argument nepovinný, doplníme dvě dvojtečky (::).

Funkci je nutné volat opakovaně, dokud nevrátí hodnotu EndOfOptions, což znamená, že už jsme prošli všechny volby. Jinak funkce vrací písmeno právě zpracovávané volby. Pokud má volba argument, jeho hodnotu najdeme v globální proměnné OptArg.

Pokud funkce vrátí znak '?' (otazník), znamená to, že programu byla předána volba, kterou nezná. Její písmeno najdeme v proměnné OptOpt. Pokud před voláním funkce nastavíme globální proměnou OptErr na hodnotu True, funkce GetOpt automaticky vypíše i chybové hlášení. Pokud hodnotu nastavíme na False, o výpis chybového hlášení se musíme postarat sami.

Příklad

Vysvětlování už bylo dost, podívejte se raději na příklad, ze kterého je vše pochopitelné. Ti z vás, kteří nemají Free Pascal, ti můžou stáhnout i zkompilovanou verzi.

{ Program umí zpracovat volby -a, -b a -c, přičemž -b a -c mají argument
  (u -c nepovinný). Za volbami můžeme uvést libovolné množství souborů.
  Program nedělá nic, než že přehledně vypíše všechny parametry,
  se kterými byl volán. }
program GetOptsTest;

uses GetOpts;

var
  Ch: Char;
  I: Integer;
begin
  // opakujeme, dokud nenačteme všechny volby
  repeat
    Ch := GetOpt('ab:c::');
    case Ch of
      'a': Writeln('Pouzita volba "-a".');
      'b': Writeln('Pouzita volba "-b" s argumentem "', OptArg, '".');
      'c': Writeln('Pouzita volba "-c" s argumentem "', OptArg, '".');
      '?': Writeln('Pouziti: getopts [-a] [-b arg] [-c [arg]] [soubor1, soubor2,...]');
    end;
  until Ch = EndOfOptions;
  // Po skončení bude v proměnné OptInd index prvního parametru, který
  // není volbou (je to tedy soubor).
  for I := OptInd to ParamCount do
    Writeln('Soubor "', ParamStr(I), '"');
end.

Příště

V příštím dílu seriálu se podíváme na to, jak se v unitě GetOpts zpracovávají dlouhé volby.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: