{ Командная строка программы GOST89. } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2006 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 375-41-46 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 2006 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 375-41-46 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} UNIT FCmdLine; INTERFACE uses GostBase; const cBufLengthMax=(2000000 div SizeOf(tDataUnit))*SizeOf(tDataUnit); cBufLengthMin=(1000 div SizeOf(tDataUnit))*SizeOf(tDataUnit); cBufLength=(100000 div SizeOf(tDataUnit))*SizeOf(tDataUnit); cFNameIn='test.txt'; cFNameOut1='test.gst'; cFNameOut2='test.tx!'; cFNameKey='key.txt'; cFNameSubstTable='substable.txt'; cFNameGamma='sync.txt'; procedure ShowHelp; type tAction=(aHelp, aEncode, aDecode, aEncodeAndDecode); tOption=(opDoNotStopAtEnd, opDoShowKey, opDoShowSubstTable, opUseGamma, opDoShowSync); tOptions=set of tOption; tProgramParameters=record FNameIn,FNameOut1,FNameOut2,DefaultFolder, FNameKey, FNameSubstTable, FNameGamma:string; Action:tAction; BufLength:cardinal; iMax:word; Options:tOptions; end; procedure ParseCmdLine(var ProgParams:tProgramParameters); IMPLEMENTATION Uses SysUtils, UMiscFun; procedure ShowHelp; begin writeln; writeln(Ansi2Dos('Использование программы:')); writeln(Ansi2Dos(' gost89.exe команда [опции...]')); writeln(Ansi2Dos(' Команды:')); writeln(Ansi2Dos(' c - зашифровать "файл0" в "файл1";')); writeln(Ansi2Dos(' d - дешифровать "файл0" в "файл1";')); writeln(Ansi2Dos(' сd - зашифровать "файл0" в "файл1", дешифровать "файл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(' /k:файлКлюча - имя файла с ключом ['+cFNameKey+'].')); writeln(Ansi2Dos(' /s:файлТаблЗамен - имя файла с таблицей замен ['+cFNameSubstTable+'].')); writeln(Ansi2Dos(' /c:файлСинхропосылки - имя файла с начальным заполнением генератора гаммы ['+cFNameGamma+'],')); writeln(Ansi2Dos(' если этот параметр указан - шифрование ведется в режиме гаммирования.')); writeln(Ansi2Dos(' /f:папка - имя рабочей папки. Используется, если имя файла не содержит пути.')); writeln(Ansi2Dos(' /b:NNNN - размер буфера файла NNNN, '), Pred(cBufLengthMin),'0 then begin writeln(Ansi2Dos(' Разбор командной строки...')); if ParamStr(1)='c' then ProgParams.Action:=aEncode else if ParamStr(1)='d' then ProgParams.Action:=aDecode else if ParamStr(1)='cd' then ProgParams.Action:=aEncodeAndDecode; 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 (fKey in Flags)) and (Copy(p,0,3)='/k:') then begin ProgParams.FNameKey:=Copy(p,4,$FF); Include(Flags,fKey); end else if (not (fSubstTable in Flags)) and (Copy(p,0,3)='/s:') then begin ProgParams.FNameSubstTable:=Copy(p,4,$FF); Include(Flags,fSubstTable); end else if (not (fSync in Flags)) and (Copy(p,0,3)='/c:') then begin ProgParams.FNameGamma:=Copy(p,4,$FF); Include(Flags,fSync); Include(ProgParams.Options,opUseGamma); end else if (not (fSync in Flags)) and (Copy(p,0,3)='/c') then begin Include(Flags,fSync); Include(ProgParams.Options,opUseGamma); 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 div SizeOf(tDataUnit))*SizeOf(tDataUnit); 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 if (not (fDoShowKey in Flags)) and (Copy(p,0,3)='/ke') then begin Include(Flags,fDoShowKey); Include(ProgParams.Options,opDoShowKey); end else if (not (fDoShowSubstTable in Flags)) and (Copy(p,0,3)='/st') then begin Include(Flags,fDoShowSubstTable); Include(ProgParams.Options,opDoShowSubstTable); end else if (not (fDoShowSync in Flags)) and (Copy(p,0,3)='/sy') then begin Include(Flags,fDoShowSync); Include(ProgParams.Options,opDoShowSync); end else ProgParams.Action:=aHelp; end; AddPath(ProgParams.FNameIn, ProgParams.DefaultFolder); AddPath(ProgParams.FNameOut1, ProgParams.DefaultFolder); AddPath(ProgParams.FNameOut2, ProgParams.DefaultFolder); AddPath(ProgParams.FNameKey, ProgParams.DefaultFolder); AddPath(ProgParams.FNameSubstTable, ProgParams.DefaultFolder); AddPath(ProgParams.FNameGamma, ProgParams.DefaultFolder); writeln(Ansi2Dos(' Завершен разбор командной строки.')); end; end; END.