Advertisement
Guest User

Untitled

a guest
Oct 26th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 26.08 KB | None | 0 0
  1. {*****************************************************************************
  2.   This file is part program Redaktor
  3.  
  4.   See the file COPYING.modifiedLGPL.txt, included in this distribution,
  5.   for details about the license.
  6.  *****************************************************************************
  7.   Copyright (C) 2018  Pjotr Danilovic  <kran100@yandex.ru>
  8.  *****************************************************************************
  9. }
  10.  
  11. {
  12. Редактор 1.0.0
  13. данная программа предназначена
  14. для простого и понятного изменения фрагментов файлов длиной от 0 байт до многих мегабайт.
  15. Автор программы за последствия её использования ответственности не несёт,
  16. вы используете её на свой страх и риск.
  17. }
  18.  
  19. //Сборка программы:
  20. //fpc redaktor.pp -XX -CX
  21. //
  22. //Сборка программы с линковкой к libc и её зависимостям:
  23. //fpc redaktor.pp -XX -CX -dSGLIBCEM
  24.  
  25. Program redaktor;
  26.  
  27. // ./redaktor "имя редактируемого файла" "заменяемая подстрока" "заменяющая подстрока" "цифра, сколько раз надо заменить"
  28. //              "необязательные параметры"
  29.  
  30. {$GOTO ON}
  31. {$mode fpc}
  32. {$R+}
  33.  
  34. uses
  35. sysutils, strutils
  36. {$IFNDEF SGLIBCEM}
  37. ,baseunix
  38. {$ENDIF SGLIBCEM}
  39. ;
  40.  
  41. const
  42. kolvo_dop_parametrov = 6;
  43.  
  44. type
  45. ZZ_64 = array of int64;
  46.  
  47. uzelok = record
  48. {HOLOPY,}RODOSLOVNAJA: ZZ_64;
  49. //NAJOMNIKI: array of longint;  //не пригодились, пусть отдохнут, как и холопы
  50. NITKA5: ansistring;
  51. DYRKA3: byte;
  52. end;
  53.  
  54. trjapka  = array of uzelok;
  55. Tverjovka = array of trjapka; //тип данных для построения горизонтального тряпочного дерева - росток такого дерева
  56.  
  57. var
  58. C5,Q5,W5,E5,F5,PF5,PUTJ_NOSKA5,FII_NAMA5,SKLAD_NOSKOV5: ansistring;
  59. PPPP5: array [1..kolvo_dop_parametrov] of ansistring;
  60. PPPPB: array [1..kolvo_dop_parametrov] of boolean = (false,false,false,false,false,false);
  61. C64,A64,D64,FF,FF64,LE_FF64,CC64,CCC64,Z64,X64,DF,ADRES,ADRES64,SKOTOBAZA,SKOTOVOD,
  62. STEKLOSHOK64, POROSHOK64: int64;
  63. XX2,KNUT2,KNUT1_2: longint;
  64. FII: TSearchRec;
  65. WW3,EE3: byte;
  66. QQ3: byte=0;
  67. ZAMENA3: byte=0;
  68. FIIKLFOS3: byte=0; //флаг переменной FII
  69. MASSIVADRESOV3: byte=0;
  70. SIMLINKI: byte=1;
  71. DEREVO: byte=0;
  72. VERJOVKA: Tverjovka;
  73. uzelok0: uzelok; //образец пустого элемента массива
  74. KUSKI_VERJOVKI,UNIKALJNJE_NOSKI: array of ansistring;
  75. {$IFDEF SGLIBCEM}
  76. PPCV: pchar;
  77. {$ENDIF SGLIBCEM}
  78.  
  79.  
  80. label
  81. 1,2,3,4,98,99,100,101;
  82.  
  83.  
  84. {$IFDEF SGLIBCEM}
  85. function realpath(name:pchar;resolved:pchar):pchar;cdecl;external 'c';
  86.  
  87. function realpath2(XX5: ansistring):ansistring;
  88. begin
  89. realpath2:=realpath(pchar(XX5),PPCV);
  90. end;
  91. {$ENDIF SGLIBCEM}
  92.  
  93. {$IFNDEF SGLIBCEM}
  94. function realpath3(FILENAME,CURDIR:ansistring;var ERROR8:boolean): ansistring;
  95. var
  96. FILENAME5,FILEPATH5,FILEPATH2_5,DIR5,EEE5,RRR5: ansistring;
  97. label
  98. 1,100;
  99. begin
  100. //CURDIR -ТЕКУЩИЙ КАТАЛОГ
  101. ERROR8:=false;
  102. FILEPATH5:=ExtractFilePath(FILENAME);
  103. {$I-}
  104. Chdir(FILEPATH5);
  105. if IOresult<>0 then goto 1;
  106. GetDir(0,DIR5);
  107. Chdir(CURDIR);
  108. {$I+}
  109. RRR5:='';
  110. EEE5:=ExtractFileName(FILENAME);
  111. if EEE5<>'' then RRR5:=C5;
  112. FILENAME5:=DIR5+RRR5+EEE5;
  113. realpath3:=FpReadLink(FILENAME5);
  114. if realpath3='' then begin
  115.    case fpGetErrno() of
  116.    ESYSENOTDIR,ESYSENAMETOOLONG,ESYSENOENT,
  117.    ESYSEACCES,ESYSELOOP,ESYSEIO,ESYSEFAULT,ESYSENOMEM: goto 1;
  118.    end;
  119.    realpath3:=FILENAME5;  
  120.                      end;
  121. FILEPATH2_5:=ExtractFilePath(realpath3);
  122. {$I-}
  123. Chdir(FILEPATH5);
  124. Chdir(FILEPATH2_5);
  125. {$I+}
  126. if IOresult<>0 then goto 1;
  127. GetDir(0,DIR5);
  128. Chdir(CURDIR);
  129. RRR5:='';
  130. EEE5:=ExtractFileName(realpath3);
  131. if EEE5<>'' then RRR5:=C5;
  132. realpath3:=DIR5+RRR5+EEE5;
  133. goto 100;
  134. 1:
  135. ERROR8:=true;
  136. realpath3:='';
  137. Chdir(CURDIR);
  138. 100:
  139. {$I+}
  140. end;
  141.  
  142. function realpath2(XX5: ansistring):ansistring;
  143. var
  144. BOO_ERROR: boolean;
  145. begin
  146. realpath2:=realpath3(XX5,SKLAD_NOSKOV5,BOO_ERROR);
  147. end;
  148. {$ENDIF SGLIBCEM}
  149.  
  150. function f_val(XX5: ansistring): int64;
  151. var
  152. QQQQ64: int64;
  153. begin
  154. val(XX5,QQQQ64);
  155. f_val:=QQQQ64;
  156. end;
  157.  
  158. procedure vyprjamljalka(var XX5: ansistring);
  159. var
  160. Q3: byte;
  161. Q2,W2,E2: longint;
  162. ZZ5,VVV5: ansistring;
  163. label
  164. 1,2;
  165. begin
  166. writeln('Производится конвертация подстроки из десятичного формата с коррекцией ошибок');
  167. ZZ5:='';
  168. W2:=length(XX5);
  169. Q3:=0;
  170. VVV5:='';
  171. for Q2:=1 to W2 do begin
  172.     case XX5[Q2] of
  173.     '+': begin
  174.          case Q3 of
  175.          0: inc(Q3);
  176.          1: ZZ5:=ZZ5+#0;
  177.          2..4:  begin
  178.                 E2:=f_val(VVV5);
  179.                 VVV5:='';
  180.                 if E2>255 then E2:=255;
  181.                 if E2<0 then E2:=0;
  182.                 ZZ5:=ZZ5+chr(E2);
  183.                 Q3:=1;
  184.                 end;
  185.          end;
  186.          end;
  187.     '1','2','3','4','5','6','7','8','9','0': begin
  188.        inc(Q3);
  189.        if Q3<2 then goto 1;
  190.        if Q3 in [2..4] then VVV5:=VVV5+XX5[Q2];
  191.        if Q3>4 then begin
  192.                     E2:=f_val(VVV5);
  193.                     if E2>255 then E2:=255;
  194.                     if E2<0 then E2:=0;
  195.                     ZZ5:=ZZ5+chr(E2);
  196.                     VVV5:='';
  197.                     Q3:=0;
  198.                     end;
  199.                                              end;
  200.     else begin
  201.          if VVV5='' then goto 1;
  202.          E2:=f_val(VVV5);
  203.          if E2>255 then E2:=255;
  204.          if E2<0 then E2:=0;
  205.          ZZ5:=ZZ5+chr(E2);
  206.          VVV5:='';
  207.          Q3:=0;
  208.          end;
  209.     end;
  210. goto 2;
  211. 1:
  212. Q3:=0;
  213. 2:
  214.                    end;
  215. if VVV5<>'' then begin
  216.                  E2:=f_val(VVV5);
  217.                  if E2>255 then E2:=255;
  218.                  if E2<0 then E2:=0;
  219.                  ZZ5:=ZZ5+chr(E2);
  220.                  end;
  221. XX5:=ZZ5;
  222. end;
  223.  
  224. function parametr5(XX5: ansistring): boolean;
  225. begin
  226. parametr5:=true;
  227. case XX5 of
  228. '--TT', '--tt', '--тт', '--ТТ': ;
  229. '--1010': begin
  230.           vyprjamljalka(W5);
  231.           vyprjamljalka(E5);
  232.           QQ3:=3;
  233.           end;
  234. '--10T', '--10t',
  235. '--10т', '--10Т': begin
  236.                   vyprjamljalka(W5);
  237.                   QQ3:=1;
  238.                   end;
  239. '--T10', '--t10',
  240. '--т10', '--Т10': begin
  241.                   vyprjamljalka(E5);
  242.                   QQ3:=2;
  243.                   end;
  244. else parametr5:=false;
  245. end;
  246. end;
  247.  
  248.  
  249. function parametr6(XX5: ansistring): boolean;
  250. var
  251. Q3,W3: byte;
  252. AAA5,XXX5: ansistring;
  253. label
  254. 1,100;
  255. begin
  256. parametr6:=false;
  257. XXX5:=XX5;
  258. W3:=length('--adres=');
  259. if length(XX5)<W3+1 then goto 1;
  260. AAA5:='';
  261. for Q3:=1 to W3 do AAA5:=AAA5+XX5[Q3];
  262. delete(XX5,1,W3);
  263. case AAA5 of
  264. '--adres=', '--ADRES=': begin
  265.                         ADRES:=f_val(XX5);
  266.                         parametr6:=true;
  267.                         goto 100;
  268.                         end;
  269. end;
  270. 1:
  271. W3:=length('--адрес=');
  272. if length(XXX5)<W3+1 then goto 100;
  273. AAA5:='';
  274. for Q3:=1 to W3 do AAA5:=AAA5+XXX5[Q3];
  275. delete(XXX5,1,W3);
  276. case AAA5 of
  277. '--адрес=', '--АДРЕС=': begin
  278.                         ADRES:=f_val(XXX5);
  279.                         parametr6:=true;
  280.                         end;
  281. end;
  282. 100:
  283. end;
  284.  
  285.  
  286. function parametr7(XX5: ansistring): boolean;
  287. var
  288. Q3,W3: byte;
  289. AAA5,XXX5: ansistring;
  290. label
  291. 1,100;
  292. begin
  293. parametr7:=false;
  294. XXX5:=XX5;
  295. W3:=length('--konecpoiska=');
  296. if length(XX5)<W3+1 then goto 1;
  297. AAA5:='';
  298. for Q3:=1 to W3 do AAA5:=AAA5+XX5[Q3];
  299. delete(XX5,1,W3);
  300. case AAA5 of
  301. '--konecpoiska=', '--KONECPOISKA=': begin
  302.                                     ADRES64:=f_val(XX5);
  303.                                     parametr7:=true;
  304.                                     goto 100;
  305.                                     end;
  306. end;
  307. 1:
  308. W3:=length('--конецпоиска=');
  309. if length(XXX5)<W3+1 then goto 100;
  310. AAA5:='';
  311. for Q3:=1 to W3 do AAA5:=AAA5+XXX5[Q3];
  312. delete(XXX5,1,W3);
  313. case AAA5 of
  314. '--конецпоиска=', '--КОНЕЦПОИСКА=': begin
  315.                                     ADRES64:=f_val(XXX5);
  316.                                     parametr7:=true;
  317.                                     end;
  318. end;
  319. 100:
  320. end;
  321.  
  322.  
  323. function parametr8(XX5: ansistring): boolean;
  324. begin
  325. parametr8:=true;
  326. case XX5 of
  327. '--zamena', '--ZAMENA', '--замена', '--ЗАМЕНА': ZAMENA3:=1;
  328. else parametr8:=false;
  329. end;
  330. end;
  331.  
  332.  
  333. function parametr9(XX5: ansistring): boolean;
  334. begin
  335. parametr9:=true;
  336. case XX5 of
  337. '--simlinki0', '--SIMLINKI0', '--симлинки0', '--СИМЛИНКИ0': SIMLINKI:=0;
  338. else parametr9:=false;
  339. end;
  340. end;
  341.  
  342.  
  343. function parametr10(XX5: ansistring): boolean;
  344. begin
  345. parametr10:=true;
  346. case XX5 of
  347. '--derevo', '--DEREVO', '--дерево', '--ДЕРЕВО': DEREVO:=1;
  348. else parametr10:=false;
  349. end;
  350. end;
  351.  
  352.  
  353. function rasshifrovka_puti: longint;
  354. var
  355. Q2,W2,E2,DV2: longint;
  356. Q3: byte;
  357. S5: ansistring;
  358. label
  359. 1,2,99,100;
  360. begin
  361. Q2:=1;
  362. E2:=length(Q5);
  363. if E2<3 then goto 100;
  364. Q3:=0;
  365. for W2:=1 to E2 do case Q5[W2] of
  366.                    '*': Q3:=1;
  367.                    '/','\': if Q5[W2]=C5 then if Q3=1 then goto 1;
  368.                    end;
  369. goto 100; //Путь не содержит дерева каталогов, нечего больше обрабатывать
  370. 1: //Тут - обработка сложных случаев
  371. Q2:=2;
  372. DV2:=1;
  373. setlength(KUSKI_VERJOVKI,DV2);
  374. S5:='';
  375. for W2:=1 to E2 do begin
  376.    S5:=S5+Q5[W2];
  377.    if Q5[W2]=C5 then begin
  378.       inc(DV2);
  379.       setlength(KUSKI_VERJOVKI,DV2);
  380.       KUSKI_VERJOVKI[DV2-1]:=S5;
  381.       S5:='';      
  382.       goto 2;
  383.                      end;
  384.    if W2=E2  then begin
  385.       inc(DV2);
  386.       setlength(KUSKI_VERJOVKI,DV2);
  387.       KUSKI_VERJOVKI[DV2-1]:=S5;    
  388.       goto 99;
  389.                   end;
  390. 2:
  391.                    end;
  392. 99: for W2:=1 to DV2-1 do begin
  393.        E2:=length(KUSKI_VERJOVKI[W2]);
  394.        if E2>1 then if KUSKI_VERJOVKI[W2,E2]=C5 then setlength(KUSKI_VERJOVKI[W2],E2-1);
  395.                           end;
  396. 100:
  397. rasshifrovka_puti:=Q2;
  398. end;
  399.  
  400.  
  401. procedure zapisj_kataloga_v_trjapku(W2: longint;stroka5: ansistring;rodoslovnaja: ZZ_64);
  402. var
  403. DT64,R64: int64;
  404. begin
  405. //W2 - уровень тряпичного дерева
  406. if length(VERJOVKA)<W2+1 then setlength(VERJOVKA,W2+1);
  407. DT64:=length(VERJOVKA[W2]);
  408. setlength(VERJOVKA[W2],DT64+1);
  409. VERJOVKA[W2,DT64]:=uzelok0;
  410. R64:=length(rodoslovnaja);//Родословная может быть для чего-то полезна в будущем, например,
  411.           //для изучения программирования таких (тряпичных, с массивами вместо указателей)
  412.          //деревьев, но пока - не пригодилась.
  413. if W2>1 then stroka5:=VERJOVKA[W2-1,rodoslovnaja[R64-1]].NITKA5+C5+stroka5;
  414. inc(R64);
  415. VERJOVKA[W2,DT64].RODOSLOVNAJA:=rodoslovnaja;
  416. setlength(VERJOVKA[W2,DT64].RODOSLOVNAJA,R64);
  417. VERJOVKA[W2,DT64].RODOSLOVNAJA[R64-1]:=DT64;
  418. VERJOVKA[W2,DT64].NITKA5:=stroka5;
  419. VERJOVKA[W2,DT64].DYRKA3:=1;
  420. end;
  421.  
  422.  
  423. function vzjatj_dannye_iz_verjovki(W2: longint;var N64: int64;var putj5: ansistring;var rodoslovnaja: ZZ_64): byte;
  424. var
  425. Q3: byte;
  426. DT64: int64;
  427. label
  428. 100;
  429. begin
  430. Q3:=0;
  431. //W2 - номер тряпки
  432. //N64 - номер узелка
  433. if W2=0 then begin //чтение из пустой верёвки
  434.              if N64=0 then Q3:=1;
  435.              inc(N64);
  436.              goto 100;
  437.              end;
  438. DT64:=length(VERJOVKA[W2]);
  439. if DT64<=N64 then goto 100;
  440. if VERJOVKA[W2,N64].DYRKA3=0 then goto 100;
  441. putj5:=VERJOVKA[W2,N64].NITKA5;
  442. rodoslovnaja:=VERJOVKA[W2,N64].RODOSLOVNAJA;
  443. inc(N64);
  444. Q3:=1;
  445. 100:
  446. vzjatj_dannye_iz_verjovki:=Q3;
  447. end;
  448.  
  449.  
  450. function PLJUSC_CITALJNIK(var STROKA5: ansistring): byte;
  451. label
  452. 1,99,100;
  453. begin
  454. 1:
  455. PLJUSC_CITALJNIK:=0;
  456. sysutils.FindClose(FII);
  457. inc(SKOTOBAZA);
  458. if DEREVO=0 then KNUT1_2:=KNUT2;
  459. if DEREVO=1 then if KNUT1_2>KNUT2 then goto 100;
  460. if SKOTOBAZA>=SKOTOVOD then begin
  461.          if KNUT1_2=1 then if SKOTOBAZA=1 then begin
  462.            if DEREVO=0 then goto 100;
  463.            goto 100;
  464.                                                end;
  465.          goto 99;
  466.                             end;
  467. STROKA5:=VERJOVKA[KNUT1_2,SKOTOBAZA].NITKA5+C5+KUSKI_VERJOVKI[KNUT2+1];
  468. PF5:=VERJOVKA[KNUT1_2,SKOTOBAZA].NITKA5+C5;
  469. PLJUSC_CITALJNIK:=1;
  470. 99:
  471. if DEREVO=1 then begin //А вот хрен вам а не выход из функции, рабочий день ещё не окончен!
  472.               if PLJUSC_CITALJNIK=1 then goto 100;
  473.                  inc(KNUT1_2);
  474.                  if KNUT1_2>KNUT2 then  goto 100;
  475.                  SKOTOBAZA:=-1;
  476.                  SKOTOVOD:=length(VERJOVKA[KNUT1_2]);
  477.                  goto 1;
  478.                  end;
  479. 100:
  480. end;
  481.  
  482.  
  483. function iskatjdaljse: longint;
  484. var
  485. ZZ2: longint;
  486. STROKA5: ansistring;
  487. label
  488. 1,2,3,100;
  489. begin
  490. 3:
  491. iskatjdaljse:=-1;
  492. if MASSIVADRESOV3=1 then goto 1;
  493. iskatjdaljse:=sysutils.FindNext(FII);
  494. FII_NAMA5:=FII.NAME;
  495. if iskatjdaljse=0 then if (FII.attr and faDirectory)=faDirectory then goto 3;
  496. goto 100;
  497. 1:
  498. if FIIKLFOS3<>0 then goto 2;
  499. if PLJUSC_CITALJNIK(STROKA5)=0 then goto 100;
  500. ZZ2:=sysutils.FindFirst(STROKA5,faAnyFile and faDirectory,FII);
  501. FII_NAMA5:=FII.NAME;
  502. FIIKLFOS3:=1;
  503. if ZZ2<>0 then begin
  504.                FIIKLFOS3:=0;
  505.                goto 1;
  506.                end;
  507. if (FII.attr and faDirectory)=faDirectory then goto 2;
  508. iskatjdaljse:=0;
  509. goto 100;
  510. 2:
  511. ZZ2:=sysutils.FindNext(FII);
  512. FII_NAMA5:=FII.NAME;
  513. if ZZ2<>0 then begin
  514.                FIIKLFOS3:=0;
  515.                goto 1;
  516.                end;
  517. if (FII.attr and faDirectory)=faDirectory then goto 2;
  518. iskatjdaljse:=0;
  519. 100:
  520. end;
  521.  
  522.  
  523. function iskatj1raz: longint; //эта функция не просто ищет но и кучу всего инициализирует
  524. var
  525. Q2,W2,E2,DV2: longint;
  526. N64: int64;
  527. rodoslovnaja: ZZ_64;
  528. putj5: ansistring;
  529. label
  530. 1,2,3,100;
  531. begin
  532. iskatj1raz:=-1;
  533. Q2:=rasshifrovka_puti;
  534. if Q2=1 then begin
  535.              if DEREVO=1 then DEREVO:=0;
  536.              iskatj1raz:=sysutils.FindFirst(Q5,faAnyFile and faDirectory,FII);
  537.              FII_NAMA5:=FII.NAME;
  538.              if iskatj1raz=0 then if (FII.attr and faDirectory)=faDirectory then iskatj1raz:=iskatjdaljse;
  539.              goto 100;
  540.              end;
  541. 3:
  542. MASSIVADRESOV3:=1;
  543. setlength(uzelok0.rodoslovnaja,0);
  544. //uzelok0.holopy:=uzelok0.rodoslovnaja;
  545. //setlength(uzelok0.najomniki,0);
  546. uzelok0.nitka5:='';
  547. uzelok0.dyrka3:=0;
  548. setlength(rodoslovnaja,2);
  549. rodoslovnaja[0]:=0;
  550. rodoslovnaja[0]:=0;
  551. DV2:=length(KUSKI_VERJOVKI);
  552. putj5:='';
  553. for W2:=1 to DV2-2 do begin //заполнение каталогами тряпичного дерева
  554.     setlength(VERJOVKA,W2+1);
  555.     N64:=0;
  556. 1:  if vzjatj_dannye_iz_verjovki(W2-1,N64,putj5,rodoslovnaja)=0 then goto 2;
  557.     sysutils.FindClose(FII);
  558.     if W2>1 then putj5:=putj5+C5;
  559.     E2:=sysutils.FindFirst(putj5+KUSKI_VERJOVKI[W2],faAnyFile and faDirectory,FII);
  560.     FII_NAMA5:=FII.NAME;
  561.     if E2<>0 then goto 1;
  562.     if (FII.attr and faDirectory)=faDirectory
  563.       then if FII_NAMA5<>'.' then if FII_NAMA5<>'..'
  564.         then zapisj_kataloga_v_trjapku(W2,FII_NAMA5,rodoslovnaja);            
  565.      while sysutils.FindNext(FII)=0 do begin
  566.       FII_NAMA5:=FII.NAME;
  567.       if (FII.attr and faDirectory)=faDirectory
  568.         then if FII_NAMA5<>'.' then if FII_NAMA5<>'..'
  569.           then zapisj_kataloga_v_trjapku(W2,FII_NAMA5,rodoslovnaja);
  570.                                        end;
  571.     goto 1;
  572. 2:
  573.                       end;
  574. KNUT2:=DV2-2;
  575. SKOTOVOD:=length(VERJOVKA[KNUT2]);
  576. if DEREVO=1 then begin
  577.                  KNUT1_2:=1;
  578.                  SKOTOVOD:=length(VERJOVKA[KNUT1_2]);
  579.                  end;
  580. SKOTOBAZA:=-1;
  581. FIIKLFOS3:=0;
  582. iskatj1raz:=iskatjdaljse;
  583. 100:
  584. end;
  585.  
  586.  
  587. function NOSOK_BEU(Q3:byte):boolean;
  588. var
  589. Q64: int64;
  590. KONFETKA_POSIKU5: ansistring;
  591. label
  592. 1,2,3,99,100;
  593. begin
  594. NOSOK_BEU:=false;
  595. if SIMLINKI=0 then goto 100;
  596. if Q3=2 then goto 3; //перед вызовом функции с Q3=2 должен быть вызов с Q3<>2 для записи значения в PUTJ_NOSKA5
  597. KONFETKA_POSIKU5:='';
  598. if length(PF5)>1 then if PF5[1]='.' then if PF5[2]=C5 then goto 2; //Он и так уже обожрался
  599. if length(PF5)>0 then if PF5[1]<>C5 then KONFETKA_POSIKU5:='.'+C5;
  600. 2:
  601. PUTJ_NOSKA5:=realpath2(KONFETKA_POSIKU5+PF5+FII_NAMA5);
  602. if PUTJ_NOSKA5='' then goto 99;//если путь вычислился как '', значит произошла ошибка чтения
  603. if STEKLOSHOK64<0 then goto 100;
  604. Q64:=0;
  605. 1:
  606. if Q64>STEKLOSHOK64 then goto 100;
  607. if UNIKALJNJE_NOSKI[Q64]=PUTJ_NOSKA5 then goto 99;
  608. inc(Q64);
  609. goto 1;
  610. goto 100;
  611. 3:
  612. inc(STEKLOSHOK64);
  613. if STEKLOSHOK64>=POROSHOK64 then begin
  614.                  POROSHOK64:=POROSHOK64+100;
  615.                  setlength(UNIKALJNJE_NOSKI,POROSHOK64);
  616.                                  end;
  617. UNIKALJNJE_NOSKI[STEKLOSHOK64]:=PUTJ_NOSKA5;
  618. goto 100;
  619. 99:
  620. NOSOK_BEU:=true;
  621. 100:
  622. end;
  623.  
  624.  
  625. function parametrx(Q3,W3: byte): boolean;
  626. begin
  627. case Q3 of
  628. 1: PPPPB[Q3]:=parametr5(PPPP5[W3]);
  629. 2: PPPPB[Q3]:=parametr6(PPPP5[W3]);
  630. 3: PPPPB[Q3]:=parametr7(PPPP5[W3]);
  631. 4: PPPPB[Q3]:=parametr8(PPPP5[W3]);
  632. 5: PPPPB[Q3]:=parametr9(PPPP5[W3]);
  633. 6: PPPPB[Q3]:=parametr10(PPPP5[W3]);
  634. else parametrx:= false;
  635. end;
  636. parametrx:=PPPPB[Q3];
  637. end;
  638.  
  639.  
  640. BEGIN
  641. Q5:=ParamStr(1);
  642. if Q5='' then begin
  643.   writeln('Redaktor 1.0.0');
  644.   writeln('Утилита для простого и понятного изменения фрагментов файлов длиной от 0 байт до многих мегабайт.');
  645.   writeln('Синтаксис применения:');
  646.   write('./redaktor "имя редактируемого файла" "заменяемая подстрока" "заменяющая подстрока"');
  647.   write(' "цифра, сколько раз надо заменить" "необязательные параметры"');
  648.   write('"имя редактируемого файла" может состоять из маски с символами * понимаемой паскалевской функцией FindFirst. ');
  649.   write('Посредством такой маски можно редактировать сразу группу файлов в одном каталоге. ');
  650.   write('Можно использовать маски в путях к файлу - поисковик будет искать по указанному дереву каталогов. ');
  651.   write('Собранная с использованием собственного поисковика утилита во время проверки истинного ');
  652.   writeln('пути файла временно меняет текущий каталог процесса. Поиск истинного пути файла задача не имеющая изящного и хорошего решения, иначе этим занималось бы ядро ОС а не программы!');
  653.   write('Первые 4 параметра являются обязательными и пишутся строго на своих местах. Остальные параметры - необязательные');
  654.   write(' и пишутся в любом порядке, после обязательных. Буквы заголовка необязательного параметра пишутся или только нижним');
  655.   writeln(' регистром, или только верхним - КАПСОМ. Писать параметры можно и латиницей в utf-8 кодировке, ');
  656.   writeln('ниже приведён список дополнительных параметров в нижнем регистре в латинской и русской форме написания.'+#13#10);
  657.   writeln('Пятый, необязательный параметр, необходим для преодоления ограничений баша на содержание текста.');
  658.   writeln('Виды, пятого, необязательного параметра:');
  659.   writeln('--tt  --тт   - обе подстроки в текстовом формате, включено по умолчанию');
  660.   writeln('--1010  - обе подстроки в формате десятичных символов вида +0+1+2..+255');
  661.   writeln('--10t  --10т   - первая подстрока в десятичном виде, а вторая в текстовом');
  662.   writeln('--t10  --т10   - первая подстрока в текстовом виде, а вторая в десятичном.');
  663.   writeln('');
  664.   writeln('Шестой, необязательный: ');
  665.   write('--adres=цифра   --адрес=цифра  - начинающийся с единицы адрес, начиная с ');
  666.   writeln('которого редактор вносит правки в редактируемый файл.'+#13#10);
  667.   writeln('Седьмой, необязательный:');
  668.   write('--konecpoiska=цифра  --конецпоиска=цифра   - все подстроки, ');
  669.   writeln('начало которых >= этой цифры - не редактируются,'+#13#10);
  670.   writeln('Восьмой, необязательный:');
  671.   write('--zamena  --замена   - заменяется любой текст с длиной как у второго ');
  672.   writeln('параметра, эффективно применять совместно с --adres=цифра'+#13#10);
  673.   writeln('Девятый, необязательный:');
  674.   write('--simlinki0  --симлинки0   - отключает проверку сравнивающую истинные ');
  675.   write('пути и имена всех редактируемых файлов. Эта проверка препятствует возникающей ');
  676.   write('при использовании масок и наличии символических ссылок в файловой системе возможности');
  677.   writeln(' за раз отредактировать один файл несколько раз.'+#13#10);
  678.   writeln('Десятый, необязательный:');
  679.   write('--derevo  --дерево  - редактировать файлы во всём переданном редактору в первом параметре ');
  680.   write('дереве каталогов. При этом имя файла или его маска записанная в конце пути ');
  681.   writeln('применяется ко всему пути. Будьте осторожны с применением этого параметра.');
  682.   goto 100;
  683.               end;
  684. STEKLOSHOK64:=-1;
  685. POROSHOK64:=100;
  686. if SIMLINKI<>0 then setlength(UNIKALJNJE_NOSKI,POROSHOK64);
  687. W5:=ParamStr(2);
  688. E5:=ParamStr(4);
  689. Z64:=f_val(E5);
  690. E5:=ParamStr(3);
  691. GetDir(0,SKLAD_NOSKOV5);
  692. for WW3:=1 to kolvo_dop_parametrov do PPPP5[WW3]:=ParamStr(WW3+4);
  693. if ParamStr(4+kolvo_dop_parametrov+1)<>'' then begin
  694.   writeln('Максимальное количество параметров превышено - ошибка!');
  695.   goto 100;
  696.                                                end;
  697. ADRES:=0;
  698. ADRES64:=-1;
  699. for WW3:=1 to kolvo_dop_parametrov do if PPPP5[WW3]<>'' then begin
  700.   for EE3:=1 to kolvo_dop_parametrov do if PPPPB[EE3]=false then
  701.     if parametrx(EE3,WW3) then goto 4;  
  702.   writeln(4+WW3,' параметр не опознан - ошибка! ',PPPP5[WW3]);
  703.   goto 100;
  704. 4:
  705.                                                              end;
  706. if QQ3 in [1,3] then begin //тест правильности конвертации
  707.                      writeln('Заменяемая подстрока:',W5);
  708.                      write('Заменяемая подстрока:');
  709.                      for XX2:=1 to length(W5) do write('+',ord(W5[XX2]));
  710.                      writeln('');
  711.                      end;
  712. if QQ3 in [2,3] then begin
  713.                      writeln('Заменяющая подстрока:',E5);
  714.                      write('Заменяющая подстрока:');
  715.                      for XX2:=1 to length(E5) do write('+',ord(E5[XX2]));
  716.                      writeln('');
  717.                      end;            
  718. if Z64<1 then goto 100;
  719. D64:=length(E5);
  720. A64:=length(W5);
  721. C5:='\'; //Разделитель в путях файлов
  722. {$IFNDEF WINDOWS}
  723. C5:='/';
  724. {$ENDIF WINDOWS}
  725. {$IFDEF DOS}
  726. C5:='\';
  727. {$ENDIF DOS}
  728. PF5:=ExtractFilePath(Q5);
  729. if iskatj1raz<>0 then goto 100;
  730. goto 3;
  731. 2:
  732. if iskatjdaljse<>0 then goto 100;
  733. 3:
  734. if NOSOK_BEU(1) then begin
  735.              if PUTJ_NOSKA5='' then  writeln('Истинный путь файла "',PF5+FII_NAMA5,
  736.                '" не прочитался, не редактируется.') else
  737.                  writeln('Этот файл уже редактировался, пропускается: ',PUTJ_NOSKA5);
  738.              goto 2;
  739.                      end;
  740. FF:=sysutils.fileopen(PF5+FII_NAMA5,fmOpenReadWrite);
  741. if FF=-1 then begin
  742.               writeln('Не удалось открыть для редактирования файл ',PF5+FII_NAMA5);
  743.               goto 99;
  744.               end;
  745. DF:=sysutils.fileseek(FF,0,2);
  746. sysutils.fileseek(FF,0,0);
  747. X64:=0;
  748. setlength(F5,DF);
  749. if DF>0 then sysutils.fileread(FF,F5[1],DF);
  750. C64:=1;
  751. if ADRES>0 THEN C64:=ADRES;
  752. if DF=0 then if ADRES=0 then goto 1;
  753. if C64>DF then goto 99;
  754. 1:
  755. if ZAMENA3<>1 then CC64:=PosEx(W5,F5,C64) else
  756.      begin
  757.      CC64:=-1;    
  758.      FF64:=length(F5);    
  759.      if (C64+A64-1)<=FF64 then CC64:=C64;
  760.      end;
  761. CCC64:=CC64;
  762. if A64=0 then CCC64:=1;
  763. if A64=0 then if ADRES>0 then CCC64:=ADRES;
  764. if A64<>0 then if CC64<1 then goto 98;
  765. if ADRES64<>-1 then if CC64>=ADRES64 then goto 98;
  766. if A64<>0 then delete(F5,CCC64,A64);
  767. insert(E5,F5,CCC64);
  768. C64:=CC64+D64;
  769. if A64<>0 then if C64>=length(F5) then goto 98;
  770. inc(X64);
  771. if X64>=Z64 then goto 98;
  772. goto 1;
  773.  
  774. 98:
  775. LE_FF64:=length(F5);
  776. if LE_FF64<DF then sysutils.FileTruncate(FF,LE_FF64);
  777. sysutils.fileseek(FF,0,0);
  778. writeln('Редактируется файл ',PF5+FII_NAMA5);
  779. if LE_FF64>0 then sysutils.FileWrite(FF,F5[1],LE_FF64);
  780. NOSOK_BEU(2);
  781. 99:
  782. sysutils.fileclose(FF);
  783. goto 2;
  784. 101:
  785. sysutils.FindClose(FII);
  786. 100:
  787. END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement