{ Командная строка программы 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 FCmdLine; INTERFACE USES Windows, SysUtils, AriTypes; const cBufLengthMax=cMaxBufferLength; cBufLengthMin=1000; cBufLength=HIGH(word) div 2+1; 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; Quiet:boolean; AlignStatistic:boolean; BufLength:tBufferIndex; // HalfCounterCount:tHalfCounter; 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(' ariftest.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(' Опции:')); writeln(Ansi2Dos(' /0:файл0 - имя для "файл0" ['), cFNameIn, '];'); writeln(Ansi2Dos(' /1:файл1 - имя для "файл1" ['), cFNameOut1, '];'); writeln(Ansi2Dos(' /2:файл2 - имя для "файл2" ['), cFNameOut2, '];'); writeln(Ansi2Dos(' /f:папка - имя рабочей папки, добавляется к имени файла,')); writeln(Ansi2Dos(' если оно не содержит пути [папка ariftest.exe];')); 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); writeln(Ansi2Dos(' использовать файл0: "'), Ansi2Dos(ProgParams.FNameIn),'"'); end else if (not (fFile1 in Flags)) and (Copy(p,0,3)='/1:') then begin ProgParams.FNameOut1:=Copy(p,4,$FFFF); writeln(Ansi2Dos(' использовать файл1: "'), Ansi2Dos(ProgParams.FNameOut1),'"'); Include(Flags,fFile1); end else if (not (fFile2 in Flags)) and (Copy(p,0,3)='/2:') then begin ProgParams.FNameOut2:=Copy(p,4,$FFFF); writeln(Ansi2Dos(' использовать файл2: "'), Ansi2Dos(ProgParams.FNameOut2),'"'); Include(Flags,fFile2); end else if (not (fDefaultFolder in Flags)) and (Copy(p,0,3)='/f:') then begin ProgParams.DefaultFolder:=Copy(p,4,$FFFF); writeln(Ansi2Dos(' использовать папку: "'), Ansi2Dos(ProgParams.DefaultFolder),'"'); Include(Flags,fDefaultFolder); end else if (not (fQuiet in Flags)) and (Copy(p,0,3)='/q') then begin writeln(Ansi2Dos(' использовать завершение без нажатия Enter.')); Include(Flags, fQuiet); ProgParams.Quiet:=true; end else if (not (fAlign in Flags)) and (Copy(p,0,3)='/a') then begin writeln(Ansi2Dos(' выравнивать статистику на степень двойки.')); Include(Flags, fAlign); ProgParams.AlignStatistic:=true; 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 (ProgParams.iMax=N) then begin end else if (0<=N) and (N<=100) then begin ProgParams.iMax:=n; writeln(Ansi2Dos(' повторить, раз: '), 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.