Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {*****************************************************************************
- This file is part program Redaktor
- See the file COPYING.modifiedLGPL.txt, included in this distribution,
- for details about the license.
- *****************************************************************************
- Copyright (C) 2018 Pjotr Danilovic <kran100@yandex.ru>
- *****************************************************************************
- }
- {
- Редактор 1.0.0
- данная программа предназначена
- для простого и понятного изменения фрагментов файлов длиной от 0 байт до многих мегабайт.
- Автор программы за последствия её использования ответственности не несёт,
- вы используете её на свой страх и риск.
- }
- //Сборка программы:
- //fpc redaktor.pp -XX -CX
- //
- //Сборка программы с линковкой к libc и её зависимостям:
- //fpc redaktor.pp -XX -CX -dSGLIBCEM
- Program redaktor;
- // ./redaktor "имя редактируемого файла" "заменяемая подстрока" "заменяющая подстрока" "цифра, сколько раз надо заменить"
- // "необязательные параметры"
- {$GOTO ON}
- {$mode fpc}
- {$R+}
- uses
- sysutils, strutils
- {$IFNDEF SGLIBCEM}
- ,baseunix
- {$ENDIF SGLIBCEM}
- ;
- const
- kolvo_dop_parametrov = 6;
- type
- ZZ_64 = array of int64;
- uzelok = record
- {HOLOPY,}RODOSLOVNAJA: ZZ_64;
- //NAJOMNIKI: array of longint; //не пригодились, пусть отдохнут, как и холопы
- NITKA5: ansistring;
- DYRKA3: byte;
- end;
- trjapka = array of uzelok;
- Tverjovka = array of trjapka; //тип данных для построения горизонтального тряпочного дерева - росток такого дерева
- var
- C5,Q5,W5,E5,F5,PF5,PUTJ_NOSKA5,FII_NAMA5,SKLAD_NOSKOV5: ansistring;
- PPPP5: array [1..kolvo_dop_parametrov] of ansistring;
- PPPPB: array [1..kolvo_dop_parametrov] of boolean = (false,false,false,false,false,false);
- C64,A64,D64,FF,FF64,LE_FF64,CC64,CCC64,Z64,X64,DF,ADRES,ADRES64,SKOTOBAZA,SKOTOVOD,
- STEKLOSHOK64, POROSHOK64: int64;
- XX2,KNUT2,KNUT1_2: longint;
- FII: TSearchRec;
- WW3,EE3: byte;
- QQ3: byte=0;
- ZAMENA3: byte=0;
- FIIKLFOS3: byte=0; //флаг переменной FII
- MASSIVADRESOV3: byte=0;
- SIMLINKI: byte=1;
- DEREVO: byte=0;
- VERJOVKA: Tverjovka;
- uzelok0: uzelok; //образец пустого элемента массива
- KUSKI_VERJOVKI,UNIKALJNJE_NOSKI: array of ansistring;
- {$IFDEF SGLIBCEM}
- PPCV: pchar;
- {$ENDIF SGLIBCEM}
- label
- 1,2,3,4,98,99,100,101;
- {$IFDEF SGLIBCEM}
- function realpath(name:pchar;resolved:pchar):pchar;cdecl;external 'c';
- function realpath2(XX5: ansistring):ansistring;
- begin
- realpath2:=realpath(pchar(XX5),PPCV);
- end;
- {$ENDIF SGLIBCEM}
- {$IFNDEF SGLIBCEM}
- function realpath3(FILENAME,CURDIR:ansistring;var ERROR8:boolean): ansistring;
- var
- FILENAME5,FILEPATH5,FILEPATH2_5,DIR5,EEE5,RRR5: ansistring;
- label
- 1,100;
- begin
- //CURDIR -ТЕКУЩИЙ КАТАЛОГ
- ERROR8:=false;
- FILEPATH5:=ExtractFilePath(FILENAME);
- {$I-}
- Chdir(FILEPATH5);
- if IOresult<>0 then goto 1;
- GetDir(0,DIR5);
- Chdir(CURDIR);
- {$I+}
- RRR5:='';
- EEE5:=ExtractFileName(FILENAME);
- if EEE5<>'' then RRR5:=C5;
- FILENAME5:=DIR5+RRR5+EEE5;
- realpath3:=FpReadLink(FILENAME5);
- if realpath3='' then begin
- case fpGetErrno() of
- ESYSENOTDIR,ESYSENAMETOOLONG,ESYSENOENT,
- ESYSEACCES,ESYSELOOP,ESYSEIO,ESYSEFAULT,ESYSENOMEM: goto 1;
- end;
- realpath3:=FILENAME5;
- end;
- FILEPATH2_5:=ExtractFilePath(realpath3);
- {$I-}
- Chdir(FILEPATH5);
- Chdir(FILEPATH2_5);
- {$I+}
- if IOresult<>0 then goto 1;
- GetDir(0,DIR5);
- Chdir(CURDIR);
- RRR5:='';
- EEE5:=ExtractFileName(realpath3);
- if EEE5<>'' then RRR5:=C5;
- realpath3:=DIR5+RRR5+EEE5;
- goto 100;
- 1:
- ERROR8:=true;
- realpath3:='';
- Chdir(CURDIR);
- 100:
- {$I+}
- end;
- function realpath2(XX5: ansistring):ansistring;
- var
- BOO_ERROR: boolean;
- begin
- realpath2:=realpath3(XX5,SKLAD_NOSKOV5,BOO_ERROR);
- end;
- {$ENDIF SGLIBCEM}
- function f_val(XX5: ansistring): int64;
- var
- QQQQ64: int64;
- begin
- val(XX5,QQQQ64);
- f_val:=QQQQ64;
- end;
- procedure vyprjamljalka(var XX5: ansistring);
- var
- Q3: byte;
- Q2,W2,E2: longint;
- ZZ5,VVV5: ansistring;
- label
- 1,2;
- begin
- writeln('Производится конвертация подстроки из десятичного формата с коррекцией ошибок');
- ZZ5:='';
- W2:=length(XX5);
- Q3:=0;
- VVV5:='';
- for Q2:=1 to W2 do begin
- case XX5[Q2] of
- '+': begin
- case Q3 of
- 0: inc(Q3);
- 1: ZZ5:=ZZ5+#0;
- 2..4: begin
- E2:=f_val(VVV5);
- VVV5:='';
- if E2>255 then E2:=255;
- if E2<0 then E2:=0;
- ZZ5:=ZZ5+chr(E2);
- Q3:=1;
- end;
- end;
- end;
- '1','2','3','4','5','6','7','8','9','0': begin
- inc(Q3);
- if Q3<2 then goto 1;
- if Q3 in [2..4] then VVV5:=VVV5+XX5[Q2];
- if Q3>4 then begin
- E2:=f_val(VVV5);
- if E2>255 then E2:=255;
- if E2<0 then E2:=0;
- ZZ5:=ZZ5+chr(E2);
- VVV5:='';
- Q3:=0;
- end;
- end;
- else begin
- if VVV5='' then goto 1;
- E2:=f_val(VVV5);
- if E2>255 then E2:=255;
- if E2<0 then E2:=0;
- ZZ5:=ZZ5+chr(E2);
- VVV5:='';
- Q3:=0;
- end;
- end;
- goto 2;
- 1:
- Q3:=0;
- 2:
- end;
- if VVV5<>'' then begin
- E2:=f_val(VVV5);
- if E2>255 then E2:=255;
- if E2<0 then E2:=0;
- ZZ5:=ZZ5+chr(E2);
- end;
- XX5:=ZZ5;
- end;
- function parametr5(XX5: ansistring): boolean;
- begin
- parametr5:=true;
- case XX5 of
- '--TT', '--tt', '--тт', '--ТТ': ;
- '--1010': begin
- vyprjamljalka(W5);
- vyprjamljalka(E5);
- QQ3:=3;
- end;
- '--10T', '--10t',
- '--10т', '--10Т': begin
- vyprjamljalka(W5);
- QQ3:=1;
- end;
- '--T10', '--t10',
- '--т10', '--Т10': begin
- vyprjamljalka(E5);
- QQ3:=2;
- end;
- else parametr5:=false;
- end;
- end;
- function parametr6(XX5: ansistring): boolean;
- var
- Q3,W3: byte;
- AAA5,XXX5: ansistring;
- label
- 1,100;
- begin
- parametr6:=false;
- XXX5:=XX5;
- W3:=length('--adres=');
- if length(XX5)<W3+1 then goto 1;
- AAA5:='';
- for Q3:=1 to W3 do AAA5:=AAA5+XX5[Q3];
- delete(XX5,1,W3);
- case AAA5 of
- '--adres=', '--ADRES=': begin
- ADRES:=f_val(XX5);
- parametr6:=true;
- goto 100;
- end;
- end;
- 1:
- W3:=length('--адрес=');
- if length(XXX5)<W3+1 then goto 100;
- AAA5:='';
- for Q3:=1 to W3 do AAA5:=AAA5+XXX5[Q3];
- delete(XXX5,1,W3);
- case AAA5 of
- '--адрес=', '--АДРЕС=': begin
- ADRES:=f_val(XXX5);
- parametr6:=true;
- end;
- end;
- 100:
- end;
- function parametr7(XX5: ansistring): boolean;
- var
- Q3,W3: byte;
- AAA5,XXX5: ansistring;
- label
- 1,100;
- begin
- parametr7:=false;
- XXX5:=XX5;
- W3:=length('--konecpoiska=');
- if length(XX5)<W3+1 then goto 1;
- AAA5:='';
- for Q3:=1 to W3 do AAA5:=AAA5+XX5[Q3];
- delete(XX5,1,W3);
- case AAA5 of
- '--konecpoiska=', '--KONECPOISKA=': begin
- ADRES64:=f_val(XX5);
- parametr7:=true;
- goto 100;
- end;
- end;
- 1:
- W3:=length('--конецпоиска=');
- if length(XXX5)<W3+1 then goto 100;
- AAA5:='';
- for Q3:=1 to W3 do AAA5:=AAA5+XXX5[Q3];
- delete(XXX5,1,W3);
- case AAA5 of
- '--конецпоиска=', '--КОНЕЦПОИСКА=': begin
- ADRES64:=f_val(XXX5);
- parametr7:=true;
- end;
- end;
- 100:
- end;
- function parametr8(XX5: ansistring): boolean;
- begin
- parametr8:=true;
- case XX5 of
- '--zamena', '--ZAMENA', '--замена', '--ЗАМЕНА': ZAMENA3:=1;
- else parametr8:=false;
- end;
- end;
- function parametr9(XX5: ansistring): boolean;
- begin
- parametr9:=true;
- case XX5 of
- '--simlinki0', '--SIMLINKI0', '--симлинки0', '--СИМЛИНКИ0': SIMLINKI:=0;
- else parametr9:=false;
- end;
- end;
- function parametr10(XX5: ansistring): boolean;
- begin
- parametr10:=true;
- case XX5 of
- '--derevo', '--DEREVO', '--дерево', '--ДЕРЕВО': DEREVO:=1;
- else parametr10:=false;
- end;
- end;
- function rasshifrovka_puti: longint;
- var
- Q2,W2,E2,DV2: longint;
- Q3: byte;
- S5: ansistring;
- label
- 1,2,99,100;
- begin
- Q2:=1;
- E2:=length(Q5);
- if E2<3 then goto 100;
- Q3:=0;
- for W2:=1 to E2 do case Q5[W2] of
- '*': Q3:=1;
- '/','\': if Q5[W2]=C5 then if Q3=1 then goto 1;
- end;
- goto 100; //Путь не содержит дерева каталогов, нечего больше обрабатывать
- 1: //Тут - обработка сложных случаев
- Q2:=2;
- DV2:=1;
- setlength(KUSKI_VERJOVKI,DV2);
- S5:='';
- for W2:=1 to E2 do begin
- S5:=S5+Q5[W2];
- if Q5[W2]=C5 then begin
- inc(DV2);
- setlength(KUSKI_VERJOVKI,DV2);
- KUSKI_VERJOVKI[DV2-1]:=S5;
- S5:='';
- goto 2;
- end;
- if W2=E2 then begin
- inc(DV2);
- setlength(KUSKI_VERJOVKI,DV2);
- KUSKI_VERJOVKI[DV2-1]:=S5;
- goto 99;
- end;
- 2:
- end;
- 99: for W2:=1 to DV2-1 do begin
- E2:=length(KUSKI_VERJOVKI[W2]);
- if E2>1 then if KUSKI_VERJOVKI[W2,E2]=C5 then setlength(KUSKI_VERJOVKI[W2],E2-1);
- end;
- 100:
- rasshifrovka_puti:=Q2;
- end;
- procedure zapisj_kataloga_v_trjapku(W2: longint;stroka5: ansistring;rodoslovnaja: ZZ_64);
- var
- DT64,R64: int64;
- begin
- //W2 - уровень тряпичного дерева
- if length(VERJOVKA)<W2+1 then setlength(VERJOVKA,W2+1);
- DT64:=length(VERJOVKA[W2]);
- setlength(VERJOVKA[W2],DT64+1);
- VERJOVKA[W2,DT64]:=uzelok0;
- R64:=length(rodoslovnaja);//Родословная может быть для чего-то полезна в будущем, например,
- //для изучения программирования таких (тряпичных, с массивами вместо указателей)
- //деревьев, но пока - не пригодилась.
- if W2>1 then stroka5:=VERJOVKA[W2-1,rodoslovnaja[R64-1]].NITKA5+C5+stroka5;
- inc(R64);
- VERJOVKA[W2,DT64].RODOSLOVNAJA:=rodoslovnaja;
- setlength(VERJOVKA[W2,DT64].RODOSLOVNAJA,R64);
- VERJOVKA[W2,DT64].RODOSLOVNAJA[R64-1]:=DT64;
- VERJOVKA[W2,DT64].NITKA5:=stroka5;
- VERJOVKA[W2,DT64].DYRKA3:=1;
- end;
- function vzjatj_dannye_iz_verjovki(W2: longint;var N64: int64;var putj5: ansistring;var rodoslovnaja: ZZ_64): byte;
- var
- Q3: byte;
- DT64: int64;
- label
- 100;
- begin
- Q3:=0;
- //W2 - номер тряпки
- //N64 - номер узелка
- if W2=0 then begin //чтение из пустой верёвки
- if N64=0 then Q3:=1;
- inc(N64);
- goto 100;
- end;
- DT64:=length(VERJOVKA[W2]);
- if DT64<=N64 then goto 100;
- if VERJOVKA[W2,N64].DYRKA3=0 then goto 100;
- putj5:=VERJOVKA[W2,N64].NITKA5;
- rodoslovnaja:=VERJOVKA[W2,N64].RODOSLOVNAJA;
- inc(N64);
- Q3:=1;
- 100:
- vzjatj_dannye_iz_verjovki:=Q3;
- end;
- function PLJUSC_CITALJNIK(var STROKA5: ansistring): byte;
- label
- 1,99,100;
- begin
- 1:
- PLJUSC_CITALJNIK:=0;
- sysutils.FindClose(FII);
- inc(SKOTOBAZA);
- if DEREVO=0 then KNUT1_2:=KNUT2;
- if DEREVO=1 then if KNUT1_2>KNUT2 then goto 100;
- if SKOTOBAZA>=SKOTOVOD then begin
- if KNUT1_2=1 then if SKOTOBAZA=1 then begin
- if DEREVO=0 then goto 100;
- goto 100;
- end;
- goto 99;
- end;
- STROKA5:=VERJOVKA[KNUT1_2,SKOTOBAZA].NITKA5+C5+KUSKI_VERJOVKI[KNUT2+1];
- PF5:=VERJOVKA[KNUT1_2,SKOTOBAZA].NITKA5+C5;
- PLJUSC_CITALJNIK:=1;
- 99:
- if DEREVO=1 then begin //А вот хрен вам а не выход из функции, рабочий день ещё не окончен!
- if PLJUSC_CITALJNIK=1 then goto 100;
- inc(KNUT1_2);
- if KNUT1_2>KNUT2 then goto 100;
- SKOTOBAZA:=-1;
- SKOTOVOD:=length(VERJOVKA[KNUT1_2]);
- goto 1;
- end;
- 100:
- end;
- function iskatjdaljse: longint;
- var
- ZZ2: longint;
- STROKA5: ansistring;
- label
- 1,2,3,100;
- begin
- 3:
- iskatjdaljse:=-1;
- if MASSIVADRESOV3=1 then goto 1;
- iskatjdaljse:=sysutils.FindNext(FII);
- FII_NAMA5:=FII.NAME;
- if iskatjdaljse=0 then if (FII.attr and faDirectory)=faDirectory then goto 3;
- goto 100;
- 1:
- if FIIKLFOS3<>0 then goto 2;
- if PLJUSC_CITALJNIK(STROKA5)=0 then goto 100;
- ZZ2:=sysutils.FindFirst(STROKA5,faAnyFile and faDirectory,FII);
- FII_NAMA5:=FII.NAME;
- FIIKLFOS3:=1;
- if ZZ2<>0 then begin
- FIIKLFOS3:=0;
- goto 1;
- end;
- if (FII.attr and faDirectory)=faDirectory then goto 2;
- iskatjdaljse:=0;
- goto 100;
- 2:
- ZZ2:=sysutils.FindNext(FII);
- FII_NAMA5:=FII.NAME;
- if ZZ2<>0 then begin
- FIIKLFOS3:=0;
- goto 1;
- end;
- if (FII.attr and faDirectory)=faDirectory then goto 2;
- iskatjdaljse:=0;
- 100:
- end;
- function iskatj1raz: longint; //эта функция не просто ищет но и кучу всего инициализирует
- var
- Q2,W2,E2,DV2: longint;
- N64: int64;
- rodoslovnaja: ZZ_64;
- putj5: ansistring;
- label
- 1,2,3,100;
- begin
- iskatj1raz:=-1;
- Q2:=rasshifrovka_puti;
- if Q2=1 then begin
- if DEREVO=1 then DEREVO:=0;
- iskatj1raz:=sysutils.FindFirst(Q5,faAnyFile and faDirectory,FII);
- FII_NAMA5:=FII.NAME;
- if iskatj1raz=0 then if (FII.attr and faDirectory)=faDirectory then iskatj1raz:=iskatjdaljse;
- goto 100;
- end;
- 3:
- MASSIVADRESOV3:=1;
- setlength(uzelok0.rodoslovnaja,0);
- //uzelok0.holopy:=uzelok0.rodoslovnaja;
- //setlength(uzelok0.najomniki,0);
- uzelok0.nitka5:='';
- uzelok0.dyrka3:=0;
- setlength(rodoslovnaja,2);
- rodoslovnaja[0]:=0;
- rodoslovnaja[0]:=0;
- DV2:=length(KUSKI_VERJOVKI);
- putj5:='';
- for W2:=1 to DV2-2 do begin //заполнение каталогами тряпичного дерева
- setlength(VERJOVKA,W2+1);
- N64:=0;
- 1: if vzjatj_dannye_iz_verjovki(W2-1,N64,putj5,rodoslovnaja)=0 then goto 2;
- sysutils.FindClose(FII);
- if W2>1 then putj5:=putj5+C5;
- E2:=sysutils.FindFirst(putj5+KUSKI_VERJOVKI[W2],faAnyFile and faDirectory,FII);
- FII_NAMA5:=FII.NAME;
- if E2<>0 then goto 1;
- if (FII.attr and faDirectory)=faDirectory
- then if FII_NAMA5<>'.' then if FII_NAMA5<>'..'
- then zapisj_kataloga_v_trjapku(W2,FII_NAMA5,rodoslovnaja);
- while sysutils.FindNext(FII)=0 do begin
- FII_NAMA5:=FII.NAME;
- if (FII.attr and faDirectory)=faDirectory
- then if FII_NAMA5<>'.' then if FII_NAMA5<>'..'
- then zapisj_kataloga_v_trjapku(W2,FII_NAMA5,rodoslovnaja);
- end;
- goto 1;
- 2:
- end;
- KNUT2:=DV2-2;
- SKOTOVOD:=length(VERJOVKA[KNUT2]);
- if DEREVO=1 then begin
- KNUT1_2:=1;
- SKOTOVOD:=length(VERJOVKA[KNUT1_2]);
- end;
- SKOTOBAZA:=-1;
- FIIKLFOS3:=0;
- iskatj1raz:=iskatjdaljse;
- 100:
- end;
- function NOSOK_BEU(Q3:byte):boolean;
- var
- Q64: int64;
- KONFETKA_POSIKU5: ansistring;
- label
- 1,2,3,99,100;
- begin
- NOSOK_BEU:=false;
- if SIMLINKI=0 then goto 100;
- if Q3=2 then goto 3; //перед вызовом функции с Q3=2 должен быть вызов с Q3<>2 для записи значения в PUTJ_NOSKA5
- KONFETKA_POSIKU5:='';
- if length(PF5)>1 then if PF5[1]='.' then if PF5[2]=C5 then goto 2; //Он и так уже обожрался
- if length(PF5)>0 then if PF5[1]<>C5 then KONFETKA_POSIKU5:='.'+C5;
- 2:
- PUTJ_NOSKA5:=realpath2(KONFETKA_POSIKU5+PF5+FII_NAMA5);
- if PUTJ_NOSKA5='' then goto 99;//если путь вычислился как '', значит произошла ошибка чтения
- if STEKLOSHOK64<0 then goto 100;
- Q64:=0;
- 1:
- if Q64>STEKLOSHOK64 then goto 100;
- if UNIKALJNJE_NOSKI[Q64]=PUTJ_NOSKA5 then goto 99;
- inc(Q64);
- goto 1;
- goto 100;
- 3:
- inc(STEKLOSHOK64);
- if STEKLOSHOK64>=POROSHOK64 then begin
- POROSHOK64:=POROSHOK64+100;
- setlength(UNIKALJNJE_NOSKI,POROSHOK64);
- end;
- UNIKALJNJE_NOSKI[STEKLOSHOK64]:=PUTJ_NOSKA5;
- goto 100;
- 99:
- NOSOK_BEU:=true;
- 100:
- end;
- function parametrx(Q3,W3: byte): boolean;
- begin
- case Q3 of
- 1: PPPPB[Q3]:=parametr5(PPPP5[W3]);
- 2: PPPPB[Q3]:=parametr6(PPPP5[W3]);
- 3: PPPPB[Q3]:=parametr7(PPPP5[W3]);
- 4: PPPPB[Q3]:=parametr8(PPPP5[W3]);
- 5: PPPPB[Q3]:=parametr9(PPPP5[W3]);
- 6: PPPPB[Q3]:=parametr10(PPPP5[W3]);
- else parametrx:= false;
- end;
- parametrx:=PPPPB[Q3];
- end;
- BEGIN
- Q5:=ParamStr(1);
- if Q5='' then begin
- writeln('Redaktor 1.0.0');
- writeln('Утилита для простого и понятного изменения фрагментов файлов длиной от 0 байт до многих мегабайт.');
- writeln('Синтаксис применения:');
- write('./redaktor "имя редактируемого файла" "заменяемая подстрока" "заменяющая подстрока"');
- write(' "цифра, сколько раз надо заменить" "необязательные параметры"');
- write('"имя редактируемого файла" может состоять из маски с символами * понимаемой паскалевской функцией FindFirst. ');
- write('Посредством такой маски можно редактировать сразу группу файлов в одном каталоге. ');
- write('Можно использовать маски в путях к файлу - поисковик будет искать по указанному дереву каталогов. ');
- write('Собранная с использованием собственного поисковика утилита во время проверки истинного ');
- writeln('пути файла временно меняет текущий каталог процесса. Поиск истинного пути файла задача не имеющая изящного и хорошего решения, иначе этим занималось бы ядро ОС а не программы!');
- write('Первые 4 параметра являются обязательными и пишутся строго на своих местах. Остальные параметры - необязательные');
- write(' и пишутся в любом порядке, после обязательных. Буквы заголовка необязательного параметра пишутся или только нижним');
- writeln(' регистром, или только верхним - КАПСОМ. Писать параметры можно и латиницей в utf-8 кодировке, ');
- writeln('ниже приведён список дополнительных параметров в нижнем регистре в латинской и русской форме написания.'+#13#10);
- writeln('Пятый, необязательный параметр, необходим для преодоления ограничений баша на содержание текста.');
- writeln('Виды, пятого, необязательного параметра:');
- writeln('--tt --тт - обе подстроки в текстовом формате, включено по умолчанию');
- writeln('--1010 - обе подстроки в формате десятичных символов вида +0+1+2..+255');
- writeln('--10t --10т - первая подстрока в десятичном виде, а вторая в текстовом');
- writeln('--t10 --т10 - первая подстрока в текстовом виде, а вторая в десятичном.');
- writeln('');
- writeln('Шестой, необязательный: ');
- write('--adres=цифра --адрес=цифра - начинающийся с единицы адрес, начиная с ');
- writeln('которого редактор вносит правки в редактируемый файл.'+#13#10);
- writeln('Седьмой, необязательный:');
- write('--konecpoiska=цифра --конецпоиска=цифра - все подстроки, ');
- writeln('начало которых >= этой цифры - не редактируются,'+#13#10);
- writeln('Восьмой, необязательный:');
- write('--zamena --замена - заменяется любой текст с длиной как у второго ');
- writeln('параметра, эффективно применять совместно с --adres=цифра'+#13#10);
- writeln('Девятый, необязательный:');
- write('--simlinki0 --симлинки0 - отключает проверку сравнивающую истинные ');
- write('пути и имена всех редактируемых файлов. Эта проверка препятствует возникающей ');
- write('при использовании масок и наличии символических ссылок в файловой системе возможности');
- writeln(' за раз отредактировать один файл несколько раз.'+#13#10);
- writeln('Десятый, необязательный:');
- write('--derevo --дерево - редактировать файлы во всём переданном редактору в первом параметре ');
- write('дереве каталогов. При этом имя файла или его маска записанная в конце пути ');
- writeln('применяется ко всему пути. Будьте осторожны с применением этого параметра.');
- goto 100;
- end;
- STEKLOSHOK64:=-1;
- POROSHOK64:=100;
- if SIMLINKI<>0 then setlength(UNIKALJNJE_NOSKI,POROSHOK64);
- W5:=ParamStr(2);
- E5:=ParamStr(4);
- Z64:=f_val(E5);
- E5:=ParamStr(3);
- GetDir(0,SKLAD_NOSKOV5);
- for WW3:=1 to kolvo_dop_parametrov do PPPP5[WW3]:=ParamStr(WW3+4);
- if ParamStr(4+kolvo_dop_parametrov+1)<>'' then begin
- writeln('Максимальное количество параметров превышено - ошибка!');
- goto 100;
- end;
- ADRES:=0;
- ADRES64:=-1;
- for WW3:=1 to kolvo_dop_parametrov do if PPPP5[WW3]<>'' then begin
- for EE3:=1 to kolvo_dop_parametrov do if PPPPB[EE3]=false then
- if parametrx(EE3,WW3) then goto 4;
- writeln(4+WW3,' параметр не опознан - ошибка! ',PPPP5[WW3]);
- goto 100;
- 4:
- end;
- if QQ3 in [1,3] then begin //тест правильности конвертации
- writeln('Заменяемая подстрока:',W5);
- write('Заменяемая подстрока:');
- for XX2:=1 to length(W5) do write('+',ord(W5[XX2]));
- writeln('');
- end;
- if QQ3 in [2,3] then begin
- writeln('Заменяющая подстрока:',E5);
- write('Заменяющая подстрока:');
- for XX2:=1 to length(E5) do write('+',ord(E5[XX2]));
- writeln('');
- end;
- if Z64<1 then goto 100;
- D64:=length(E5);
- A64:=length(W5);
- C5:='\'; //Разделитель в путях файлов
- {$IFNDEF WINDOWS}
- C5:='/';
- {$ENDIF WINDOWS}
- {$IFDEF DOS}
- C5:='\';
- {$ENDIF DOS}
- PF5:=ExtractFilePath(Q5);
- if iskatj1raz<>0 then goto 100;
- goto 3;
- 2:
- if iskatjdaljse<>0 then goto 100;
- 3:
- if NOSOK_BEU(1) then begin
- if PUTJ_NOSKA5='' then writeln('Истинный путь файла "',PF5+FII_NAMA5,
- '" не прочитался, не редактируется.') else
- writeln('Этот файл уже редактировался, пропускается: ',PUTJ_NOSKA5);
- goto 2;
- end;
- FF:=sysutils.fileopen(PF5+FII_NAMA5,fmOpenReadWrite);
- if FF=-1 then begin
- writeln('Не удалось открыть для редактирования файл ',PF5+FII_NAMA5);
- goto 99;
- end;
- DF:=sysutils.fileseek(FF,0,2);
- sysutils.fileseek(FF,0,0);
- X64:=0;
- setlength(F5,DF);
- if DF>0 then sysutils.fileread(FF,F5[1],DF);
- C64:=1;
- if ADRES>0 THEN C64:=ADRES;
- if DF=0 then if ADRES=0 then goto 1;
- if C64>DF then goto 99;
- 1:
- if ZAMENA3<>1 then CC64:=PosEx(W5,F5,C64) else
- begin
- CC64:=-1;
- FF64:=length(F5);
- if (C64+A64-1)<=FF64 then CC64:=C64;
- end;
- CCC64:=CC64;
- if A64=0 then CCC64:=1;
- if A64=0 then if ADRES>0 then CCC64:=ADRES;
- if A64<>0 then if CC64<1 then goto 98;
- if ADRES64<>-1 then if CC64>=ADRES64 then goto 98;
- if A64<>0 then delete(F5,CCC64,A64);
- insert(E5,F5,CCC64);
- C64:=CC64+D64;
- if A64<>0 then if C64>=length(F5) then goto 98;
- inc(X64);
- if X64>=Z64 then goto 98;
- goto 1;
- 98:
- LE_FF64:=length(F5);
- if LE_FF64<DF then sysutils.FileTruncate(FF,LE_FF64);
- sysutils.fileseek(FF,0,0);
- writeln('Редактируется файл ',PF5+FII_NAMA5);
- if LE_FF64>0 then sysutils.FileWrite(FF,F5[1],LE_FF64);
- NOSOK_BEU(2);
- 99:
- sysutils.fileclose(FF);
- goto 2;
- 101:
- sysutils.FindClose(FII);
- 100:
- END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement