{ Командная строка программы LZFileTest. } {--------------------------------------------------------------------------- (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 Александров О.Е., 2000 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 75-47-15 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} UNIT FCmdLine; INTERFACE USES LZDic0, LZDic1, ComTypes; const cBufLengthMax=2000000{cMaxBufferLength}; cBufLengthMin=1000; cBufLength=100000; cDicSizeInNodes=100000; cFNameIn='test.txt'; cFNameOut1='test._tx'; cFNameOut2='test.!tx'; procedure ShowHelp; type tAction=(aHelp, aCompress, aDecompress, aCompressAndDecompress); tOption=(opDoNotStopAtEnd); tOptions=set of tOption; tProgramParameters=record FNameIn,FNameOut1,FNameOut2,DefaultFolder:string; Action:tAction; BufLength:cardinal; DicSize:cardinal; FragmentLength:cardinal; iMax:word; Options:tOptions; end; procedure ParseCmdLine(var ProgParams:tProgramParameters); IMPLEMENTATION Uses SysUtils, UMiscFun; 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(' /2:файл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,$FF); Include(Flags,fFile0); end else if (not (fFile1 in Flags)) and (Copy(p,0,3)='/1:') then begin ProgParams.FNameOut1:=Copy(p,4,$FF); Include(Flags,fFile1); end else if (not (fFile2 in Flags)) and (Copy(p,0,3)='/2:') then begin ProgParams.FNameOut2:=Copy(p,4,$FF); 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 (fDicSize in Flags)) and (Copy(p,0,3)='/l:') then begin Include(Flags,fDicSize); Val(Copy(p,4,$FF),n,e); if e=0 then begin if NcSizeInNodesMax then begin writeln(Ansi2Dos(^G' словарь слишком велик: '), n,Ansi2Dos(', использую максимальный: '),cSizeInNodesMax); n:=cSizeInNodesMax; end; ProgParams.DicSize:=n; writeln(Ansi2Dos(' использую словарь, символов: '), n); end else begin writeln(Ansi2Dos(' !неправильное число:'), ParamStr(i)); ProgParams.Action:=aHelp end; end else if (not (fFragLen in Flags)) and (Copy(p,0,3)='/z:') then begin Include(Flags,fFragLen); Val(Copy(p,4,$FF),n,e); if e=0 then begin if NcSizeInNodesMax then begin writeln(Ansi2Dos(^G' длина фрагмента слишком велика: '), n,Ansi2Dos(', использую максимальную: '),cSizeInNodesMax); n:=cSizeInNodesMax; end; ProgParams.FragmentLength:=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 if (not (fDoNotStopAtEnd in Flags)) and (Copy(p,0,3)='/go') then begin Include(Flags,fDoNotStopAtEnd); Include(ProgParams.Options,opDoNotStopAtEnd); 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.