home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Spezial / SPEZIAL2_97.zip / SPEZIAL2_97.iso / ANWEND / ONLINE / X_CHAN_1 / X-CHANGE.CMD < prev   
OS/2 REXX Batch file  |  1997-06-07  |  28KB  |  711 lines

  1. /********************************************************************/
  2. /* Suchen und Ersetzen von Texten in Dateien (z.B. txt, html, ...)  */
  3. /* x-change.CMD    Version 0.62   11. Überarbeitung vom 07.06.97       */
  4. /*                                                                  */
  5. /* Bjoern Erik Wenz, 11th version Mai 1997, sirius@poboxes.com      */
  6. /*                                                                  */
  7. /* Kurzbeschreibung: Sucht rekursiv alle Dateien, auf welche die    */
  8. /* Datei-Suchmaske passt und ersetzt den Suchtext durch den neuen   */
  9. /* Text und schreibt bei Bedarf die Liste in eine Kontroll-Datei.   */
  10. /********************************************************************/
  11. /*    !!!    BETA-Version       !!!    !!!    BETA-version    !!! */
  12. /*                                                                  */
  13. /* Dieses Script darf beliebig weiterverwendet werden, solange es   */
  14. /* UNverändert bleibt und dieser Header NICHT geloescht wird.       */
  15. /*                                                                  */
  16. /* Hinweise zur Verbesserung diese Scriptes sind IMMER WILLKOMMEN!  */
  17. /********************************************************************/
  18. /* Dieses Script habe ich zur dazu geschrieben, meine Web-Admin     */
  19. /* Tätigkeit zu erleichtern, was auch geglückt ist. Ich werde ver-  */
  20. /* suchen dieses Script zu warten und stetig zu verbessern - aber   */
  21. /* ich versteife mich nicht darauf. Ich helfe bei Fragen gerne -    */
  22. /* aber eine verpflichtung auf eine schnelle Antwort gibt's nicht.  */
  23. /* Trotsdem - Fragen kostet nix!      ;-)                           */
  24. /********************************************************************/
  25. /* Ich werde die aktuellste Version immer hier deponieren:          */
  26. /*      ftp.leo.org/pub/comp/os2/...                                */
  27. /*   ftp.pmnet.uni-oldenburg.de//pub/Sortiertes/os2/tcpip/diverses  */
  28. /*   Datei: x-change-bx_xx.zip (b=beta ,x_xx = Versionsnummer)      */
  29. /********************************************************************/
  30. /* Aufruf: [] = optionaler parameter, Reihenfolge beachten        */
  31. /* x-change datei_suchmaske suchtext neuer_text [listendatei] [opt.]*/
  32. /*        datei_suchmaske: z.b: e:\freemind\*.htm            */
  33. /*        suchtext: Datei in der der Suchtext steht        */
  34. /*        neuer_text: Datei in der der neue Text steht        */
  35. /*        listendatei: Datei, in die die Liste der veränderten*/
  36. /*                Dateien geschrieben/angehängt wird  */
  37. /* Anmerkung: Die listendatei kann auch weggelassen werden !        */
  38. /*    opt.: Optionsschalter, wie folgend aufgelistet.            */
  39. /*        /t    dateinamen werden als text interpretiert    */
  40. /*    oder    /t:ziel dateinamen werden als text interpretiert    */
  41. /*           und die veränderten Dateien werden nach ziel kopiert   */
  42. /*    oder    /h    es wird auf html-konforme-umlaute geprüft   */
  43. /*           suchtext und neuer_text dabei bitte als . angeben      */
  44. /*    oder    /h:ziel    es wird auf html-konforme-umlaute geprüft   */
  45. /*           und die veränderten Dateien werden nach ziel kopiert   */
  46. /* oder /c:ziel  die veränderten Dateien werden nach ziel kopiert   */
  47. /* oder /w    es wird auf Windows-Umlaute (andere codepage) geprüft */
  48. /*              und diese werden in html-umlaute verwandelt         */
  49. /* oder /w:ziel dto, nur mit verschieben der geänderten Dateien     */
  50. /* oder /z      Erzeugen eines Zählers-Eintrages aus dem Dateinamen */
  51. /* oder /z:ziel dto, nur mit verschieben der geänderten Dateien     */
  52. /* Der Zähler wird aus verschiedenen Variablen gebildet, die hier   */
  53. /* am Anfang gesetzt werden, und an <img src=" angehängt werden.    */
  54. /* Der Names der Zähl-Datei wird aus dem Ziel-Dateinamen gebildet   */
  55. /* Das ganze ist auf den Counter 'Count.cgi' optimiert.             */
  56. /*      Zähler-Variablen:                                           */
  57. /*       count_cgi: Aufruf des cgi-scriptes (/cgi-bin/Count.cgi?)   */
  58. /*       count_file: aufruf des files (df=fm-, fm-=opt. Namensteil) */
  59. /*       count_name: Automatisch generierter Namens-Teil            */
  60. /*              wird nur generiert, wenn nicht angegeben (='')      */
  61. /*       count_end: endung des counter-files (.dat)                 */
  62. /*       count_option: optionen für den counter (&sh=N)             */
  63. /*       count_img_option: optionen für den img-Aufruf              */
  64. /*       count_position: eine Zeile vor diesem sitzt der Counter    */
  65. /*              solllte sinniger weise nur 1 mal vorkommen :-)      */
  66. /*       count_call: Kompletter Counter-Aufruf-String incl. CrLf    */
  67. /*              wird nur generiert, wenn nicht angegeben (='')      */
  68. /*              Aber immer wird er vor count_position gesetzt       */
  69. /*      count_vor / count_nach: CrLf vor/nach <img ...>             */
  70. /*                                                                  */
  71. /* Zur Zeit nur unter os2 lauffähig - Work's only under os2 yet        */
  72. /********************************************************************/
  73.  
  74. /* Variablen für /z definieren */
  75. /* Aufruf: '<img src="'||count_cgi||count_file||count_name||count_end||count_option||'"'||count_img_option||'>' */
  76. count_cgi='http://www.freemind.de/cgi-bin/Count.cgi?';
  77. count_prefix='fm-';
  78. count_file='df='||count_prefix;
  79. count_name='';
  80. count_end='.dat';
  81. count_option='&sh=N';
  82. count_img_option=' border=0 width=1 height=1';
  83. count_position='</BODY>';
  84. count_call='';
  85. count_vor=1;
  86. count_nach=1;
  87. verz_count_erst="f:\web\freemind-www-upload"; /* verzeichnis, wo die dazugehörigen Counter-Dateien erstellt werden */
  88. verz_count_ja=1; /* ob verz_count_erst genutzt werden soll */
  89.  
  90. /* RexxUtil-Funktionen laden */
  91. CALL RxFuncAdd 'SysFileTree', 'RexxUtil', 'SysFileTree'
  92.  
  93. /* Argumente einlesen */
  94. PARSE ARG datei_suchmaske suchtext neuer_text listendatei option;
  95. if option = '' then
  96.     do
  97.     if left(listendatei,1) = "/" then
  98.         do
  99.         option = listendatei;
  100.         listendatei = ''
  101.         end;
  102.     end;
  103. if suchtext = '' then
  104.     CALL FALSCHER_AUFRUF;
  105.         
  106. /************************************************************************/
  107. /***********    Fehlerbehandlung                 ************/
  108. /************************************************************************/
  109. SIGNAL ON Syntax;
  110. SIGNAL ON NoValue;
  111. SIGNAL ON NotREADY;
  112. SIGNAL ON Halt;
  113. SIGNAL ON Failure;
  114. SIGNAL ON Error;
  115.  
  116. /************************************************************************/
  117. /***********    Hauptprogramm                         ************/
  118. /************************************************************************/
  119.  
  120. rc=time('R');
  121. say time()||' '||Date()
  122.  
  123. umlaute_umwandeln=0; /* 0=nicht, 1=uml->html, 2=winum->html, (3=winum->uml) */
  124. dateien_kopieren=0;
  125. counter_insert=0;
  126. select
  127. when left(option,3) = '/c:' then
  128.     do
  129.         dateien_kopieren=1
  130.         dateien_ziel=substr(option,4,length(option)-3)
  131.     suchen=DateiEinlesen(suchtext);
  132.     ersetzen=DateiEinlesen(neuer_text);
  133.     end;
  134. when option = '/h' then
  135.     do
  136.         umlaute_umwandeln=1;
  137. /*    suchen=DateiEinlesen(suchtext);*/
  138. /*    ersetzen=DateiEinlesen(neuer_text);*/
  139. /* noch auskommentiert - wenn die prüfung automatisch bei jeder umwandlung durchgeführt wird */
  140. /* dann kommt dieser Teil zur Verwendung - dazu muß aber die Austausch-Routine anders werden */
  141.     end;
  142. when left(option,3) = '/h:' then
  143.     do
  144.         dateien_kopieren=1
  145.         dateien_ziel=substr(option,4,length(option)-3)
  146.         umlaute_umwandeln=1;
  147.     end;
  148. when option = '/t' then
  149.     do
  150.     suchen=suchtext;
  151.     ersetzen=neuer_text;
  152.     end;
  153. when left(option,3) = '/t:' then
  154.     do
  155.         dateien_kopieren=1
  156.         dateien_ziel=substr(option,4,length(option)-3)
  157.     suchen=suchtext;
  158.     ersetzen=neuer_text;
  159.     end;
  160. when option = '/w' then
  161.     do
  162.         umlaute_umwandeln=2;
  163.     end;
  164. when left(option,3) = '/w:' then
  165.     do
  166.         dateien_kopieren=1
  167.         dateien_ziel=substr(option,4,length(option)-3)
  168.         umlaute_umwandeln=2;
  169.     end;
  170. when option = '/z' then
  171.     do
  172.         suchen=count_position;
  173.         ersetzen='';
  174.         counter_insert=1;
  175.     end;
  176. when left(option,3) = '/z:' then
  177.     do
  178.         dateien_kopieren=1
  179.         dateien_ziel=substr(option,4,length(option)-3)
  180.         suchen=count_position;
  181.         ersetzen='';
  182.         counter_insert=1;
  183.     end;
  184. otherwise
  185.     do
  186.     suchen=DateiEinlesen(suchtext);
  187.     ersetzen=DateiEinlesen(neuer_text);
  188.     end;
  189. end;
  190.  
  191. MASKE=datei_suchmaske
  192.  
  193. CALL SysFileTree MASKE, 'FILE', 'FSO'
  194.  
  195. if file.0 < 1 then
  196. do
  197.     Say 'Keine passenden Dateien zu ' maske ' gefunden'
  198.     signal programm_ende
  199. end;
  200.  
  201. d=0;
  202. dn=0;
  203. DO x=1 TO file.0
  204.     say copies('*', 40);
  205.     say x;
  206.     Say 'Bearbeite Datei:' file.x;
  207.     datei_veraendert=Austausch(FILE.x);
  208.     if datei_veraendert <> '0' then
  209.     do
  210.         d=d+1;
  211.         datei_liste.d = file.x;
  212.     end;
  213.     else
  214.     do
  215.         dn=dn+1;
  216.         datei_liste_nicht.dn = file.x;
  217.     end;
  218.     
  219. END;
  220.  
  221. say ''
  222. say copies('# ', 30);
  223. say 'Folgende ' d ' Dateien wurden verändert:'
  224. if d <> 0 then
  225. do x=1 to d
  226.     say x'. ' datei_liste.x
  227. end
  228. else Say 'Keine Datei mußte geändert werden.'
  229.  
  230. If listendatei <> '' then
  231. do
  232.     CrLf = D2C(13)''D2C(10);
  233.     rc=lineout(listendatei, CrLf);
  234.     rc=lineout(listendatei, copies('+', 50));
  235.     rc=lineout(listendatei, time()||' '||Date()||CrLf);
  236.     rc=lineout(listendatei, 'Änderungen an '||maske)
  237.         if counter_insert=1 then rc=lineout(listendatei, ' - Für die folgenden dateien wurde automatisch ein Counter-eingefügt.');
  238.         if umlaute_umwandeln=1 then rc=lineout(listendatei, ' - Nach richtigen Umlaut-Enities wurde geprüft.');
  239.         if umlaute_umwandeln=2 then rc=lineout(listendatei, ' - Nach alten Windows-Codepage-Umlaten wurde gesucht und in Umlaut-Enities gewandelt.');
  240.         if umlaute_umwandeln=3 then rc=lineout(listendatei, ' - Nach alten Windows-Codepage-Umlaten wurde gesucht und in Umlaute gewandelt.');
  241.     rc=lineout(listendatei, 'Es wurden '||d+dn||' Dateien am '||date()||' um '||time()||CrLf||' innerhalb von '||time('E')||' unter '||maske||' bearbeitet.');
  242.         rc=lineout(listendatei, 'Dabei blieben '||dn||' unverändert und '||d||' wurden verändert.');
  243.         if dateien_kopieren=1 then rc=lineout(listendatei, ' - Veränderte Dateien werden nach '||dateien_ziel||' kopiert. -');
  244.     if d <> 0 then
  245.     do x=1 to d
  246.         rc=lineout(listendatei, x'.' datei_liste.x)
  247.     end;
  248.     else rc=lineout(listendatei, 'Keine Datei wurde verändert.');
  249.  
  250.     rc=lineout(listendatei, copies('+ ++ ', 5));
  251.  
  252.     if dn <> 0 then
  253.     do x=1 to dn
  254.         rc=lineout(listendatei, x'.' datei_liste_nicht.x 'blieb unverändert.')
  255.     end;
  256.     else rc=lineout(listendatei, 'Keine Datei blieb unverändert.');
  257.  
  258.     rc=lineout(listendatei);
  259.         if dateien_kopieren=1 then Say ' - Veränderte Dateien werden nach '||dateien_ziel||' kopiert. -'
  260.     Say 'Diese Dateiliste wurde in: ' listendatei ' gespeichert.'
  261. end
  262.  
  263. programm_ende:
  264. exit 0;
  265.  
  266. /************************************************************************/
  267. /***********    Funktionen / Unterprogramme             ************/
  268. /************************************************************************/
  269.  
  270. /***********    DateiEinlesen     **********/
  271. /******************************************/
  272. DateiEinlesen:
  273. /* Einlesen einer datei in einen einzeiligen string                     */
  274. /* Aufruf: variable_für_dateiinhalt=DateiEinlesen(dateiname)            */
  275. signal off notready;
  276. CrLf = D2C(13)''D2C(10);
  277. PARSE ARG datei; /* KEIN Punkt, damit auch Leerzeichendateinamen übertragen werden */
  278. text = "";
  279. rc=lineout(datei);
  280. do while lines(datei) <> 0
  281.     zeile = linein(datei);
  282.     text = text || zeile || CrLf;
  283. end;
  284. text=left(text,length(text)-2);
  285. rc=lineout(datei);
  286. signal on notready;
  287. return text;
  288.  
  289. /***********    Austausch     ***********/
  290. /****************************************/
  291. Austausch:
  292. /* Durchsuchen von File nach 'suchen' und ersetzen durch 'ersetzen'.    */
  293. /* Aufruf: Call Austausch dateiname                    */
  294.  
  295. PARSE ARG file; /* KEIN Punkt, damit auch Leerzeichendateinamen übertragen werden */
  296.  
  297. string=DateiEinlesen(file)
  298. /*string=charin(file,1,length(file));*/
  299.  
  300. if umlaute_umwandeln=0 then
  301.    do
  302.         if counter_insert=1 then ersetzen=create_call(maske count_vor count_nach file);
  303.         differenz=length(suchen)-length(ersetzen);
  304.  
  305.         /* 1a. Ermitteln der Anzahl der fundstellen in der Datei -> position.nr  */
  306.         i=0;
  307.         start=1;
  308.         exit=0;
  309.         do while exit=0 
  310.             i=i+1;
  311.             fundstelle=pos(suchen, string, start);
  312.             if fundstelle = 0 then exit=1;
  313.             else do
  314.                 if i>0 then start=fundstelle+1;
  315.                         fundstelle = fundstelle - ((i-1) *differenz);
  316.                 position.i=fundstelle;
  317.                   end;    
  318.             position.0 = i-1
  319.         end;
  320.  
  321.         If position.0 ='0' then signal nichts_gefunden;
  322.  
  323.         Say 'Es wurden ' position.0 ' zu ersetzende Stelle(n) gefunden' 
  324.  
  325.         /* 2a. Ersetzen der gefundenen strings */
  326.         if counter_insert=1 then
  327.            do
  328.                 if verz_count_ja=1 & 0=pos(ersetzen, string) then
  329.                  do
  330.                    if count_name='' then
  331.                      verz_count_filename=verz_count_erst||'\'||count_prefix||translate(left(substr(file,lastpos('\',maske)+1),lastpos('.',substr(file,lastpos('\',maske)+1))-1),'_','\')||count_end;
  332.                    else
  333.                      verz_count_filename=verz_count_erst||'\'||count_prefix||count_name||count_end;
  334.                    rc=lineout(verz_count_filename, '1');
  335.                    rc=lineout(verz_count_filename);
  336.                    say verz_count_filename 'wurde erstellt';
  337.                  end /* do */ 
  338.                    do i=1 to position.0 while 0=pos(ersetzen, string)
  339.                     call string_ersetzen position.i;
  340.                     If position.i<position.0 then position.i+1=pos(suchen, string, position.i);
  341.                    end;
  342.            end /* do */
  343.         else
  344.            do i=1 to position.0
  345.             call string_ersetzen position.i;
  346.             If position.i<position.0 then position.i+1=pos(suchen, string, position.i);
  347.            end;
  348.    end /* do */
  349. else
  350.    do
  351.         /* 1b. Ermitteln der Anzahl der fundstellen in der Datei -> position.nr  */
  352.         was_gefunden=0
  353.     differenz=0
  354.         DO y=1 to 7
  355.            select
  356.               when (y=1) & (umlaute_umwandeln=1) then umlaut='ä'
  357.               when (y=2) & (umlaute_umwandeln=1) then umlaut='ö'
  358.               when (y=3) & (umlaute_umwandeln=1) then umlaut='ü'
  359.               when (y=4) & (umlaute_umwandeln=1) then umlaut='Ä'
  360.               when (y=5) & (umlaute_umwandeln=1) then umlaut='Ö'
  361.               when (y=6) & (umlaute_umwandeln=1) then umlaut='Ü'
  362.               when (y=7) & (umlaute_umwandeln=1) then umlaut='ß'
  363.               when (y=1) & (umlaute_umwandeln=2) then umlaut='Σ'
  364.               when (y=2) & (umlaute_umwandeln=2) then umlaut='÷'
  365.               when (y=3) & (umlaute_umwandeln=2) then umlaut='ⁿ'
  366.               when (y=4) & (umlaute_umwandeln=2) then umlaut='─'
  367.               when (y=5) & (umlaute_umwandeln=2) then umlaut='╓'
  368.               when (y=6) & (umlaute_umwandeln=2) then umlaut='▄'
  369.               when (y=7) & (umlaute_umwandeln=2) then umlaut='▀'
  370.            otherwise
  371.               SAY 'Fehler, y darf nicht > 7 sein!';
  372.            end  /* select */
  373.                 i=0;
  374.                 start=1;
  375.                 exit=0;
  376.                 do while exit=0 
  377.                     i=i+1;
  378.                     fundstelle=pos(umlaut, string, start);
  379.                     if fundstelle = 0 then exit=1;
  380.                     else do
  381.                         if i>0 then start=fundstelle+1;
  382.                                 fundstelle = fundstelle - ((i-1) *differenz);
  383.                                 position.i=fundstelle;
  384.                           end;    
  385.                     position.0 = i-1
  386.                 end;
  387.                 if position.0 \= '0' then was_gefunden=was_gefunden+1
  388.         end /* do */
  389.  
  390.         If was_gefunden ='0' then signal nichts_gefunden;
  391.  
  392.         Say 'Es wurden zu ersetzende Umlaute gefunden' 
  393.  
  394.         /* 2b. Ersetzen der gefundenen strings */
  395.         select
  396.            when umlaute_umwandeln=1 then string=htmltrans(string);
  397.            when umlaute_umwandeln=2 then string=winhtmltrans(string);
  398.         otherwise
  399.         end  /* select */
  400.    end /* do */
  401.  
  402. /* 3. Löschen der Datei und schreiben der veraenderten */
  403. '@del' convertNameToOS(file);
  404. rc=lineout(file, string);
  405. rc=lineout(file);
  406. /*rc=charout(file, string);*/
  407. /*rc=charout(file);*/
  408. if dateien_kopieren=1 then
  409. do
  410.         lokaler_pfad=left(maske,lastpos('\',maske)-1);
  411.         zusatz_pfad_mit_datei=substr(file,length(lokaler_pfad)+1);
  412.         zusatz_pfad=left(zusatz_pfad_mit_datei,lastpos('\',zusatz_pfad_mit_datei));
  413.         dateien_ziel_pfad=dateien_ziel||zusatz_pfad;
  414.    '@xcopy' convertNameToOS(file) dateien_ziel_pfad '/V'
  415. end /* do */
  416. was_ersetzt='1';
  417.  
  418. signal ende_austausch
  419. nichts_gefunden:
  420. Say 'In der datei ' file ' wurde der Suchstring nicht gefunden';
  421. was_ersetzt='0';
  422. ende_austausch:
  423. return was_ersetzt;
  424.  
  425. /***********    htmltrans     ***********/
  426. /****************************************/
  427. htmltrans: procedure
  428. /*   translates german umlaute to html-tags                         */
  429. /*      Aufruf: htmltrans string-der geprüft werden soll            */
  430. parse arg line
  431.   au=pos("ß",line)
  432.   do while au <> 0
  433.      line=left(line,au-1)||"ß"||right(line,length(line)-au)
  434.      au=pos("ß",line,au+1)
  435.   end /* do */
  436.   au=pos("ä",line)
  437.   do while au <> 0
  438.      line=left(line,au-1)||"ä"||right(line,length(line)-au)
  439.      au=pos("ä",line,au+1)
  440.   end /* do */
  441.   au=pos("ö",line)
  442.   do while au <> 0
  443.      line=left(line,au-1)||"ö"||right(line,length(line)-au)
  444.      au=pos("ö",line,au+1)
  445.   end /* do */
  446.   au=pos("ü",line)
  447.   do while au <> 0
  448.      line=left(line,au-1)||"ü"||right(line,length(line)-au)
  449.      au=pos("ü",line,au+1)
  450.   end /* do */
  451.   au=pos("Ä",line)
  452.   do while au <> 0
  453.      line=left(line,au-1)||"Ä"||right(line,length(line)-au)
  454.      au=pos("Ä",line,au+1)
  455.   end /* do */
  456.   au=pos("Ö",line)
  457.   do while au <> 0
  458.      line=left(line,au-1)||"Ö"||right(line,length(line)-au)
  459.      au=pos("Ö",line,au+1)
  460.   end /* do */
  461.   au=pos("Ü",line)
  462.   do while au <> 0
  463.      line=left(line,au-1)||"Ü"||right(line,length(line)-au)
  464.      au=pos("Ü",line,au+1)
  465.   end /* do */
  466. return line;
  467.  
  468. /***********   winhtmltrans   ***********/
  469. /****************************************/
  470. winhtmltrans: procedure
  471. /*   translates german umlaute to html-tags                         */
  472. /*      Aufruf: htmltrans string-der geprüft werden soll            */
  473. parse arg line
  474.   au=pos("▀",line)
  475.   do while au <> 0
  476.      line=left(line,au-1)||"ß"||right(line,length(line)-au)
  477.      au=pos("▀",line,au+1)
  478.   end /* do */
  479.   au=pos("Σ",line)
  480.   do while au <> 0
  481.      line=left(line,au-1)||"ä"||right(line,length(line)-au)
  482.      au=pos("Σ",line,au+1)
  483.   end /* do */
  484.   au=pos("÷",line)
  485.   do while au <> 0
  486.      line=left(line,au-1)||"ö"||right(line,length(line)-au)
  487.      au=pos("÷",line,au+1)
  488.   end /* do */
  489.   au=pos("ⁿ",line)
  490.   do while au <> 0
  491.      line=left(line,au-1)||"ü"||right(line,length(line)-au)
  492.      au=pos("ⁿ",line,au+1)
  493.   end /* do */
  494.   au=pos("─",line)
  495.   do while au <> 0
  496.      line=left(line,au-1)||"Ä"||right(line,length(line)-au)
  497.      au=pos("─",line,au+1)
  498.   end /* do */
  499.   au=pos("╓",line)
  500.   do while au <> 0
  501.      line=left(line,au-1)||"Ö"||right(line,length(line)-au)
  502.      au=pos("╓",line,au+1)
  503.   end /* do */
  504.   au=pos("▄",line)
  505.   do while au <> 0
  506.      line=left(line,au-1)||"Ü"||right(line,length(line)-au)
  507.      au=pos("▄",line,au+1)
  508.   end /* do */
  509. return line;
  510.  
  511. /***********    string_ersetzen        ************/
  512. /***********************************************/
  513. string_ersetzen:
  514. PARSE ARG stelle;
  515.  
  516. Say 'Ersetze Text an Position:' stelle
  517. neuer_string=left(string,stelle-1) || ersetzen || substr(string,stelle+length(suchen));
  518. string=neuer_string;
  519. return;
  520.  
  521. /***********      create_name        ************/
  522. /***********************************************/
  523. create_name:
  524. if count_name='' then
  525.   do
  526.         PARSE ARG count_name_ wildcard;
  527.         /* count_name_: voller pfad der Zieldatei */
  528.         /* wildcard: Suchpfad zur datei, der von dateiname abgezogen wird */
  529.         count_name_=substr(count_name_,lastpos('\',wildcard)+1);
  530.         count_name_=left(count_name_,lastpos('.',count_name_)-1);
  531.         count_name_=translate(count_name_,'_','\');
  532.   end /* do */
  533. else
  534. count_name_=count_name;
  535. count_name_='<img src="'||count_cgi||count_file||count_name_||count_end||count_option||'"'||count_img_option||'>';
  536. return count_name_;
  537.  
  538. /***********      create_call        ************/
  539. /***********************************************/
  540. create_call:
  541. PARSE ARG file_maske anzahl_CrLf_vor anzahl_CrLf_nach file_name; /* KEIN Punkt, damit auch Leerzeichendateinamen übertragen werden */
  542. /* count_position: string vor den der counter gesetzt wird */
  543. if count_call='' then
  544. do
  545.         count_call_=create_name(file_name file_maske);
  546.         do c=1 to anzahl_CrLf_vor by 1 while c<anzahl_CrLf_vor+1
  547.                 count_call_=CrLf||count_call_
  548.         end /* do */
  549.         do c=1 to anzahl_CrLf_nach by 1 while c<anzahl_CrLf_nach+1
  550.                 count_call_=count_call_||CrLf
  551.         end /* do */
  552. end /* do */
  553. else
  554. count_call_=count_call;
  555. count_call_=count_call_||count_position;
  556. return count_call_;
  557.  
  558.  /* ------------------------------------------------------------------ */
  559.  /* function:  convert a file or directory name to OS conventions      */
  560.  /*            by adding a leading and trailing quote or double quote  */
  561.  /*                                                                    */
  562.  /* call:      convertNameToOS dir_or_file_name                        */
  563.  /*                                                                    */
  564.  /* where:     dir_or_file_name = name to convert                      */
  565.  /*                                                                    */
  566.  /* returns:   converted file or directory name                        */
  567.  /*                                                                    */
  568.  ConvertNameToOS: PROCEDURE
  569.    parse arg fileName
  570.  
  571.    if pos('"', fileName ) = 0 then
  572.      fileName = '"' || fileName || '"'
  573.    else if pos("'", filename ) = 0 then
  574.      fileName = "'" || fileName || "'"
  575.  
  576.  RETURN fileName
  577.  
  578. /************************************************************************/
  579. /***********    Fehlerbehandlungsroutinen             ************/
  580. /************************************************************************/
  581. FALSCHER_AUFRUF:
  582. SAY COPIES('*', 50)
  583. SAY 'Falscher Aufruf! - Zuviele oder fehlende Parameter'
  584. SAY ''
  585. SAY 'Syntax: x-change datei_suchmaske suchtext neuer_text [listendatei] [opt.]'
  586. SAY '           z.B: x-change e:\*.htm abc@xy.com xxx@abc.de /t'
  587. SAY '   oder    x-change e:\*.htm peter paul liste.txt /t'
  588. SAY '   oder    x-change e:\*.htm suchen.txt finden.txt liste.txt'
  589. SAY '   opt.: Optionsschalter, wie folgend aufgelistet...'
  590. SAY '           /t      dateinamen werden als text interpretiert'
  591. SAY '   oder    /t:ziel dateinamen werden als text interpretiert'
  592. SAY '        und die veränderten Dateien werden nach ziel kopiert'
  593. SAY '   oder    /h      es wird auf html-konforme-umlaute geprüft'
  594. SAY '        suchtext und neuer_text dabei bitte als . angeben'
  595. SAY '   oder    /h:ziel    es wird auf html-konforme-umlaute geprüft'
  596. SAY '        und die veränderten Dateien werden nach ziel kopiert'
  597. SAY '   oder /c:ziel  die veränderten Dateien werden nach ziel kopiert'
  598. SAY '   oder /w    es wird auf Windows-Umlaute (andere codepage) geprüft'
  599. SAY '              und diese werden in html-umlaute verwandelt'
  600. SAY '   oder /w:ziel dto, nur mit verschieben der geänderten Dateien'
  601. SAY '   oder /z      Erzeugen eines Zählers-Eintrages aus dem Dateinamen'
  602. SAY '   oder /z:ziel dto, nur mit verschieben der geänderten Dateien'
  603. EXIT
  604.  
  605. ERROR:
  606. SAY 'Es trat ein schwerer Fehler auf';
  607. SAY 'Ein Syntaxfehler ' rc 'wurde festgestellt in Zeile:' sigl;
  608.    say '-->' "ERRORTEXT"(rc)
  609.    say "SOURCELINE"(sigl)
  610.    trace ?r; nop
  611. EXIT;
  612.  
  613. FAILURE:
  614. SAY 'Es trat ein leichter Fehler auf';
  615. SAY 'Ein Syntaxfehler ' rc 'wurde festgestellt in Zeile:' sigl;
  616.    say '-->' "ERRORTEXT"(rc)
  617.    say "SOURCELINE"(sigl)
  618.    trace ?r; nop
  619. EXIT;
  620.  
  621. HALT:
  622. SAY 'Programm vom Nutzer abgebrochen in Zeile:' sigl;
  623. EXIT;
  624.  
  625. NOTREADY:
  626. SAY 'Es trat ein ein/ausgabe Fehler auf';
  627. SAY 'Ein Syntaxfehler ' rc 'wurde festgestellt in Zeile:' sigl;
  628.    say '-->' "ERRORTEXT"(rc)
  629.    say "SOURCELINE"(sigl)
  630.    trace ?r; nop
  631. EXIT;
  632.  
  633. NOVALUE:
  634. SAY 'Eine uninitialisierte Variable wurde bei PARSE VAR benutzt';
  635. SAY 'Ein Syntaxfehler ' rc 'wurde festgestellt in Zeile:' sigl;
  636.    say '-->' "ERRORTEXT"(rc)
  637.    say "SOURCELINE"(sigl)
  638.    trace ?r; nop
  639. EXIT;
  640.  
  641. SYNTAX:
  642. SAY 'Ein Syntaxfehler ' rc 'wurde festgestellt in Zeile:' sigl;
  643.    say '-->' "ERRORTEXT"(rc)
  644.    say "SOURCELINE"(sigl)
  645.    trace ?r; nop
  646. EXIT;
  647.  
  648. /**********************************************************/
  649. /**********************************************************/
  650. /**********************************************************/
  651. /***********                ENDE           ************/
  652. /**********************************************************/
  653. /**********************************************************/
  654. /**********************************************************/
  655.  
  656. /*
  657. Versionen:
  658. 0.1    Ende Februar 97
  659.     Die Grunddatei, mit 3 oder 4 parametern.
  660.     Funktioniert 100%.
  661.  
  662. 0.2    Anfang März 97
  663.     Schalter /t mit aufgenommen.
  664.     Schreibfehler korrigiert und optimiert.
  665.  
  666. 0.21    bug beim ersetzen repariert.
  667. 0.22    nur Schreibfehler Korrigiert
  668.  
  669. 0.3     Mai 97
  670.         Umwandeln von HTML-codes eingebunden
  671.  
  672. 0.4     Mai 97
  673.         schalter zum Kopieren der veränderten Dateien wurden hinzugefügt.
  674.         /h:ziel - /c:ziel - /t:ziel
  675.  
  676. 0.41    Mai 97
  677.         Schalter /w und /w:ziel hinzugefügt
  678.     Bugfix zu umlaute_umwandeln: Die strings sind gleich lang -> differenz=0
  679.  
  680. 0.5     Mai 97
  681.            besseres 'errorhandling' eingebaut (kann aber noch optimiert werden)
  682.         austausch: habe lineout durch charout ersetzt (doch nicht :-(, warum fehler?)
  683.  
  684. 0.51    14.05.1997
  685.     einige Bug-Fixes
  686.  
  687. 0.60    15.05.1997
  688.         schalter /z und /z: installiert
  689.  
  690. 0.61    2.6.97
  691.         Bugifx: /* alle Filenamen mit Leerzeichen in einen String mit Anführungszeichen verwandeln */
  692.  
  693. 0.62    7.6.97
  694.         Bugifx: Fehler beim Einlesen von Einzeiligen Dateien behoben (Falscher Abbruch weil angeblich nicht lesbar)
  695.         Ist sie aber doch und wird auch, nur ist der Zeiger nicht auf die 2. Zeile steuerbar - deshalb der "Quasi-Fehler".
  696.         Behoben durch SIGNAL ON NOTREADY umgeheung während des Einlesens. :-)
  697.  
  698. Ausblick auf weitere Versionen    (geplant):
  699.     - option für 'nur eine Datei', was dann auch unter anderen System Funktioniert.
  700.     - optionale dll, die Sysfiletree simuliert, damit system-portabel (z.B: dosRexx)
  701.           Achtung: wer will oder kann mir eine SysFileTree (simple C-Programmierung aufgrund DisFindFirst/Next) schreiben?
  702.           (Als DLL zum einbinden.) Mail bitte an sirius@poboxes.com
  703.     - optimierte und besser steuerbare Listenausgabe über Schalter
  704. ####        (- umstellung der Schalterauswertung: Seit 0.60 Implementiert, oder wer hat 'ne bessere Idee?)
  705.         - schalter /s, mit dem alle Dateien der Suchmaske gescannt werden, und sollte eine
  706.                 Zeile länger als 255 Zeichen sein, beim letzten Leerzeichen oder zwischen
  707.                 den Tags (also zw. ><) einen Zeilenumbruch erzeigt.
  708.  
  709. Tips und Anregungen nehme ich gerne unter sirius@poboxes.com, Subject:x-change.cmd entgegen.
  710. */
  711.