[Allegro] Trick 48: Praezises Einfuegen

Bernhard Eversberg ev at biblio.tu-bs.de
Do Jul 19 08:27:45 CEST 2007


Trick 48 : Präzisions-Einfügungen

Aufgabe: Schnell mal eben in eine Zeichenfolge an einer bestimmten
          Position 1 oder mehr Zeichen einfügen, und zwar
          mit oder ohne Ersetzung von 1 oder mehr dort stehenden Zeichen

Warum? Man hat zuweilen Zeichenfolgen, in denen an bestimmten (festen)
        Positionen bestimmte Angaben stehen, die man durch etwas anderes
        ersetzen will.

Hinweis: Zum Ersetzen von exakten Zeichenfolgen an beliebiger Stelle
          durch andere gibt es den Befehl  insert %abc%xyz%
          Zum Ersetzen einzelner Zeichen oder Doppelzeichen durch andere
          im gesamten Text (das nennt man "Umcodierung") gibt es das
          Instrumentarium des Befehls  xcode

Lösung:
Man schreibt sich eine Datei  stri.inc  (siehe unten) und bindet sie
mit "include stri.inc" ein.
So wird die Funktion dann benutzt:

Wenn in das Feld  #789  an der Position 11 die Zeichen "abc" eingesetzt
werden sollen, dort genau 2 Zeichen ersetzend, die vorher da stehen,
dann macht man folgendes:

var #789
   Startstring
ins #usT
   Befehlsstring (kann beliebig konstruiert werden, auch aus Variablen!)
var "10,abc,2"
   (Statt , als Trenner ist auch / möglich)
   Aufruf
perf stri
   Ergebnis in iV nach #789 sichern
ins #789

var "Resultat: " #789
mes
   ... weitere Aktionen
   Am Ende das UP einbinden:
include stri.inc


             Und dies ist das Unterprogramm  stri.inc
  **********************************************************************
   STRI.INC : Zeichen an fester Position in eine Zeichenfolge einfuegen
   2007-07-17   u.U. mit Ersetzung vorhandener Zeichen

   Aufruf :  Man besetzt zuerst folgende Variable:
           #usT  : die Ausgangs-Zeichenfolge

           iV    : zahl1,zeichenfolge,zahl2  oder  / statt ,
                   die beiden Zahlen muessen positive ganze sein oder 0
                   zahl2 mit dem vorangehenden Komma darf fehlen

           Bedeutung:  zahl1 Zeichen vom Anfang von #usT belassen
                       dann die  zeichenfolge  anhaengen
                       vom Rest von #usT  zahl2  Zeichen wegnehmen,
                       und was noch von #usT uebrig ist, anhaengen
           Beispiele:
                  Das vierte Zeichen durch x ersetzen
           var "3,x,1"
                  In #upo steht Position, in #uez die einzufueg. Zeichen
                       in #uaz ANz. der zu ersetzenden Zeichen
           var #upo "," #uez "," #uaz
                  Hinter dem 10. Zeichen  Inhalt von #uab  zwischenfügen
           var "10," #uab ",0"   oder   var "10," #uab
                  Vorn 2 Zeichen durch abcdeg  ersetzen, Rest belassen
           var "0,abcdeg,2"
                    (einfacher mit  var "abc" #usT(2,0) )
                  Hinter dem 2. Zeichen  abcdeg  einsetzen, Rest weg
           var "2,abcdeg,1000"
                    (einfacher mit  var #usT(0,2) "abcdeg" !)

        Dann der Aufruf:

           perf stri

        Ergebnis steht danach in der iV

   UPro beginnt hier
end
   Setze
          #uZ1 = zahl1 , #uZ2=zahl2 , #uZB = Zeichenfolge bei Beginn
:stri
   Kontrolle beim Testen
  mes
ins #uZB
var #uZB(f"0123456789")
if "/" jump stri:s
if not "," return
   Komma ist Trennung:
var #uZB(e",")
ins #uZ1
var #uZB(b"," b",")
ins #uZ2
   Trennsymbol ,
#uZT,
jump stri:w

   / ist Trennung:
:stri:s
var #uZB(e"/")
ins #uZ1
var #uZB(b"/" b"/")
ins #uZ2
   Trennsymbol /
#uZT/

:stri:w
eval #uZ1 + #uZ2
   Position, wo der Rest beginnt
ins #uZ3
   Manipulations-Ausdruck in die iV schreiben:
        (beachte den Nebentrick mit dem Trennsymbol #uZT)
var #uZ1
if not "0" var "#usT(0," #uZ1 " F' ') #uZB(b'#uZT' e'#uZT') #usT(" #uZ3 
",0)"
if "0" var "#uZB(b'#uZT' e'#uZT') #usT(" #uZ3 ",0)"

   zur Kontrolle beim Testen den Ausdruck zeigen:
  mes
   Ausdruck auswerten   (das ist der eigentliche Trick!)
var
   Nun steht das Erg. in der iV
   Hilfsvar. loeschen
#uZT
#uZB
#uZ1
#uZ2
#uZ3
return

   *********************************************************************







Mehr Informationen über die Mailingliste Allegro