getopt и getopt_long
Модератор: Модераторы
getopt и getopt_long
Имеется ли аналог функций getopt() и getopt_long() во FreePascal?
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Добрый день!
Пожалуйста, напишите простой пример.
К примеру, моей программе надо указать имя файла куда сохранить результат действия и значения пары-тройки переменных
Как организовать разбор подобной командной строки средствами модуля 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)
Но это, я так понимаю, как ключи запуска, значение переменной таким образом не передать.
__________________________
Нашёл пример
http://www.math.uni-leipzig.de/pool/tuts/FreePascal/units/node6.html#fu:GetLongOpts
Только что-то всё равно ничего не понимаю
__________________________
Вот, немного разобрался с короткими параметрами
Пожалуйста, напишите простой пример.
К примеру, моей программе надо указать имя файла куда сохранить результат действия и значения пары-тройки переменных
Код: Выделить всё
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;Но это, я так понимаю, как ключи запуска, значение переменной таким образом не передать.
__________________________
Нашёл пример
Код: Выделить всё
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.
Только что-то всё равно ничего не понимаю
__________________________
Вот, немного разобрался с короткими параметрами
Код: Выделить всё
...
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.