getopt и getopt_long

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

getopt и getopt_long

Сообщение Tamachi » 07.10.2007 18:59:56

Имеется ли аналог функций getopt() и getopt_long() во FreePascal?
Tamachi
новенький
 
Сообщения: 10
Зарегистрирован: 01.10.2007 14:31:38

Сообщение Sergei I. Gorelkin » 07.10.2007 19:31:29

Имеется. Модуль getopts, ф-ция getopt_long называется GetLongOpts.
Кроме того, подобная функциональность присутствует в классе TCustomApplication, от которого наследуется TApplication из LCL.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: getopt и getopt_long

Сообщение ifrost » 19.02.2011 16:59:33

Добрый день!

Пожалуйста, напишите простой пример. :roll:
К примеру, моей программе надо указать имя файла куда сохранить результат действия и значения пары-тройки переменных
Код: Выделить всё
util.exe -f c:\result.txt -param1 22 -param2 33 -param3 234

Как организовать разбор подобной командной строки средствами модуля getopts?


P.S. Набрёл в интернете на http://www.gnu.org/s/libc/manual/html_node/Example-of-Getopt.html, но, честно, я там ничего не понимаю :(

P.P.S. Пример использования функции GetOpts нашёл в исходниках FPC (\fpc\2.4.2\source\packages\fcl-base\examples\dsocksvr.pp)
Код: Выделить всё
  repeat
    Option := GetOpt('12');
    case Option of
      '1':
      begin
        //Действие 1
      end;
      '2':
      begin
        //Действие 2
      end;
    end;
  until Option = EndOfOptions;

Но это, я так понимаю, как ключи запуска, значение переменной таким образом не передать.
__________________________

Нашёл пример :D http://www.math.uni-leipzig.de/pool/tuts/FreePascal/units/node6.html#fu:GetLongOpts
Код: Выделить всё
program testopt;

{ Program to depmonstrate the getopts function. }

{
  Valid calls to this program are
  optex --verbose --add me --delete you
  optex --append --create child
  optex -ab -c me -d you
  and so on
}
uses getopts;

var c : char;
    optionindex : Longint;
    theopts : array[1..7] of TOption;

begin
  with theopts[1] do
   begin
    name:='add';
    has_arg:=1;
    flag:=nil;
    value:=#0;
  end;
  with theopts[2] do
   begin
    name:='append';
    has_arg:=0;
    flag:=nil;
    value:=#0;
  end;
  with theopts[3] do
   begin
    name:='delete';
    has_arg:=1;
    flag:=nil;
    value:=#0;
  end;
  with theopts[4] do
   begin
    name:='verbose';
    has_arg:=0;
    flag:=nil;
    value:=#0;
  end;
  with theopts[5] do
   begin
    name:='create';
    has_arg:=1;
    flag:=nil;
    value:='c'
  end;
  with theopts[6] do
   begin
    name:='file';
    has_arg:=1;
    flag:=nil;
    value:=#0;
  end;
  with theopts[7] do
   begin
    name:='';
    has_arg:=0;
    flag:=nil;
  end;
  c:=#0;
  repeat
    c:=getlongopts('abc:d:012',@theopts[1],optionindex);
    case c of
      '1','2','3','4','5','6','7','8','9' :
        begin
        writeln ('Got optind : ',c)
        end;
      #0 : begin
           write ('Long option : ',theopts[optionindex].name);
           if theopts[optionindex].has_arg>0 then
             writeln (' With value  : ',optarg)
           else
             writeln
           end;
      'a' : writeln ('Option a.');
      'b' : writeln ('Option b.');
      'c' : writeln ('Option c : ', optarg);
      'd' : writeln ('Option d : ', optarg);
      '?',':' : writeln ('Error with opt : ',optopt);
   end; { case }
until c=endofoptions;
if optind<=paramcount then
    begin
    write ('Non options : ');
    while optind<=paramcount do
      begin
      write (paramstr(optind),' ');
      inc(optind)
      end;
    writeln
    end
end.

Только что-то всё равно ничего не понимаю :roll:

__________________________

Вот, немного разобрался с короткими параметрами :)
Код: Выделить всё
...
var
  Option: char;
  a, b, c: Integer;
  Output: TStringList;

begin
  repeat
    Option := GetOpt('a:b:c:f:');
    case Option of
      'a':
      begin
        a := StrToInt(OptArg);
      end;
      'b':
      begin
        b := StrToInt(OptArg);
      end;
      'c':
      begin
        c := StrToInt(OptArg);
      end;
      'f':
      begin
        Output := TStringList.Create;
        Output.Add(IntToStr(a + b + c));
        Output.SaveToFile(OptArg);
        FreeAndNil(Output);
      end;
    end;
  until Option = EndOfOptions;
end.
ifrost
новенький
 
Сообщения: 21
Зарегистрирован: 13.11.2009 09:19:51


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru