{ Командная строка программы FTest. } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2000 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 75-47-15 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 1999 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 75-47-15 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} UNIT Delphi_FCmdLine; INTERFACE USES Windows, SysUtils; const cBufLengthMax=High(integer) div 2; cBufLengthMin=1000; cBufDefaultLength=High(word); cFNameIn='test.txt'; cFNameOut1='test._tx'; cFNameOut2='test.!tx'; function Ansi2Dos(const s:string):string; procedure ShowHelp; type tAction=(aHelp, aCompress, aDecompress, aCompressAndDecompress); tProgramParameters=record FNameIn,FNameOut1,FNameOut2,DefaultFolder:string; Action:tAction; BufLength:integer; iMax:word; end; procedure ParseCmdLine(var ProgParams:tProgramParameters); IMPLEMENTATION function Ansi2Dos(const s:string):string; begin SetLength(Result,Length(s)); CharToOEMBuff(@s[1],@Result[1],Length(s)); end; procedure ShowHelp; begin writeln; writeln(Ansi2Dos('Использование программы:')); writeln(Ansi2Dos(' ftest.exe команда [опции...]')); writeln(Ansi2Dos(' Команды:')); writeln(Ansi2Dos(' c - упаковать "файл0" в "файл1";')); writeln(Ansi2Dos(' d - распаковать "файл0" в "файл1";')); writeln(Ansi2Dos(' сd - упаковать "файл0" в "файл1", распаковать в "файл2"')); writeln(Ansi2Dos(' и сравнить "файл0" с "файл2".')); writeln(Ansi2Dos(' по умолчанию: "файл0"='),cFNameIn,Ansi2Dos(', "файл1"='),cFNameOut1,Ansi2Dos(', "файл2"='),cFNameOut2,'.'); writeln(Ansi2Dos(' Опции:')); writeln(Ansi2Dos(' /0:файл0 - имя для "файл0";')); writeln(Ansi2Dos(' /1:файл1 - имя для "файл1";')); writeln(Ansi2Dos(' /1:файл2 - имя для "файл2";')); writeln(Ansi2Dos(' /f:папка - имя рабочей папки, добавляется к имени файла, если оно не содержит пути;')); writeln(Ansi2Dos(' /b:NNNN - размер буфера NNNN ('),Pred(cBufLengthMin),'0 then begin writeln(Ansi2Dos(' Разбор командной строки...')); if ParamStr(1)='c' then ProgParams.Action:=aCompress else if ParamStr(1)='d' then ProgParams.Action:=aDecompress else if ParamStr(1)='cd' then ProgParams.Action:=aCompressAndDecompress; for i:=2 to ParamCount do begin p:=ParamStr(i); if (not (fFile0 in Flags)) and (Copy(p,0,3)='/0:') then begin ProgParams.FNameIn:=Copy(p,4,$FFFF); Include(Flags,fFile0); end else if (not (fFile1 in Flags)) and (Copy(p,0,3)='/1:') then begin ProgParams.FNameOut1:=Copy(p,4,$FFFF); Include(Flags,fFile1); end else if (not (fFile2 in Flags)) and (Copy(p,0,3)='/2:') then begin ProgParams.FNameOut2:=Copy(p,4,$FFFF); Include(Flags,fFile2); end else if (not (fDefaultFolder in Flags)) and (Copy(p,0,3)='/f:') then begin ProgParams.DefaultFolder:=Copy(p,4,$FFFF); Include(Flags,fDefaultFolder); end else if (not (fBuffer in Flags)) and (Copy(p,0,3)='/b:') then begin Include(Flags,fBuffer); Val(Copy(p,4,$FF),n,e); if e=0 then begin if NcBufLengthMax then begin writeln(Ansi2Dos(^G' буфер слишком велик: '), n, Ansi2Dos(', использую максимальный: '),cBufLengthMax); n:=cBufLengthMax; end; ProgParams.BufLength:=n; writeln(Ansi2Dos(' использую буфер, байт: '), n); end else begin writeln(Ansi2Dos(' !неправильное число:'), ParamStr(i)); ProgParams.Action:=aHelp end; end else if (not (fRepeat in Flags)) and (Copy(p,0,3)='/r:') then begin Include(Flags,fRepeat); Val(Copy(p,4,$FF),n,e); if e=0 then begin if (0<=N) and (N<=100) then begin ProgParams.iMax:=n; end else begin writeln(Ansi2Dos(' !недопустимое число:'), ParamStr(i)); end; end else begin writeln(Ansi2Dos(' !неправильное число:'), ParamStr(i)); ProgParams.Action:=aHelp end; end else ProgParams.Action:=aHelp; end; AddPath(ProgParams.FNameIn, ProgParams.DefaultFolder); AddPath(ProgParams.FNameOut1, ProgParams.DefaultFolder); AddPath(ProgParams.FNameOut2, ProgParams.DefaultFolder); writeln(Ansi2Dos(' Завершен разбор командной строки.')); end; end; END.