[Allegro] V33.5beta und Vb.255-Vorab

Thomas Berger ThB at Gymel.com
Sa Nov 30 00:00:09 CET 2013


Lieber Herr Eversberg,

nach stundenlanger Fehlersuche kann ich vermelden:


> Lokaler Ersetzungsbefehl (a99 und acon)
> ---------------------------------------
> Der FLEX-Befehl "insert" hat eine Sonderfunktion. Er kann im Inhalt
> der internen Variablen Ersetzungen ausfuehren:
> 
> insert _abc_XYZ_   insert ,abc,XYZ,   avanti
> Im Inhalt der internen Variablen wird  abc  durch  XYZ  ersetzt.
> Wenn  abc  mehrfach vorkommt, wird jedes Vorkommnis ersetzt.
> Nachfolgendes  ins #nnn  kopiert dann den veränderten Inhalt in eine
> Kategorie oder eine #u-Variable.
> Zu beachten:
> ...
> o  Steuerzeichen (control codes) können so angegeben werden:
>    z.B.  ^M^J  für 13 10
>    sowohl in abc wie in XYZ.
>    D.h. ^A steht für Code 1 usw., ^T für Code 20 = ¶ [ab V27.6]
>    Für das Zeichen ^ selbst ist  ^~  anzugeben, z.B. ^~U statt ^U
> 
> und jetzt NEU:
> 
> o  Jedes Zeichen, ob druckbar oder nicht, kann man auch in der Form
>    ^NNN angeben, mit genau drei Dezimalziffern NNN, also z.B.
>    ^013^010  statt ^M^J,  oder ^170 fuer das Nichtsortierzeichen.
>    Folgen auf ^ keine drei Ziffern und kein Grossbuchstabe, gelten
>    die Zeichen als normale Zeichen, z.B.  ^u .
>    Das gilt für beide Teile des Befehls, (abc und XYZ).

das hatten wir um den 14./15.11. hier ja diskutiert.

In der endgueltigen vb255, die im GP enthalten ist, ist nun eher
heimlich hinzugekommen:

a99: Globale Ersetzung mit $
----------------------------
Die Zeichenfolge abc, die man in das linke Feld einträgt, kann mit $
enden. Dann wird nach abc gesucht, und der darauf folgende gesamte Rest
des Feldes entfaellt bei der Ersetzung. Soll aber ein $-Zeichen ersetzt
werden, stellt man ein $ an den Anfang des Eingabefelds "Suche nach",
dann die Zeichenfolge, die ein $ enthält. Der $ am Beginn schaltet
die Wirkung des $ als "Abzwack-Operator" ab.
Spezialfall:  $$, um ueberall im Satz den  $  durch was anderes zu
ersetzen.


Und dies hat leider den Nachteil, dass es sich auch auf lokale
Ersetzungen in Parameterdateien auswirkt (sofern von acon und a99
ausgefuehrt, nicht jedoch bei index oder srch):

Konkret hatte ich beim Umstieg von acon v33.4 auf 33.5 mysterioese
Abstuerze bei einer Parameterdatei, die ich auf eine Ersetzung

#ukn y0 e"|" b"[▼]" b1 f32 b0 ,"_$_▼_" Acv    % mehr Unterfelder

zurueckfuehren konnte (ein paar hundert Datensaetze lang geht
es gut, dann macht es "Bumm").
Der Grund ist, dass (exet.cpp, l. 1309) fuer lokale Ersetzungen
im Arbeitstext ebenfalls die SrRp-Methode aus record.cpp
benutzt und hier wird neuerdings ein "$" als erstes Zeichen
als Flag fuer die Sonderbedeutung registriert und anschliessend
weggenommen. In meinem Beispiel war der Suchtext dann leer,
daher wohl der Absturz, in anderen Faellen aeussert sich die
Inkompatibilitaet subtiler, das "$" bleibt stillschweigend
stehen (jepp: am aktuellen acon festellbar).

Ersetzungen, die mit "$" anfangen, sind nicht untypisch, oft
geht es darum, "merkwuerdig" codierte Unterfeldzeichen aus
Fremddaten zu normieren. Die Standarddistribution hat analoges
an mehreren Stellen in picaa.ppt). Pikanterweise war genau das
der Ausgangspunkt fuer die Diskussion, ein "$" sollte nicht
als Abschneidezeichen im Suchen-und-Ersetzen-Menue gelten,
damit man die Chance hat, das per globaler Ersetzung zu
bereinigen. Die Verbesserung, die das nun interaktiv
moeglich macht, sorgt gleichzeitig dafuer, dass vorhandene
Parameterdateien, die das im Rahmen lokaler Ersetzungen
bislang klaglos konnten, nun nicht mehr funktionieren und
ueberarbeitet werden muessten...

Was nun uebrigens auch klar ist, ist dass die "Abzwack"-
Funktion des $ /am Ende/ des Suchtexts auch in Ersetzungen
als Manipulationsbefehl stets bestanden hat und daher das
obige Beispiel ,"_$_▼_" eher nicht den gewuenschten
Effekt (ersetze jegliches "$" durch Dreieck) haben wird...

Was ich uebrigens ueberhaupt nicht verstehe ist der
Fall eines '$' im inneren des Suchstrings:

while (a[++k]!=cmc && (a[k]==g[n] || a[k]=='?') && a[k]!='$' && g[n]) ++n;

bricht quasi vorzeitig ab, k wird anschliessend zwar noch
inkrementiert, aber da cmc dadurch immer noch nicht erreicht
ist, gilt es als kein Treffer. Aber dennoch funktioniert es:
Wo ist da mein Denkfehler?

viele Gruesse
Thomas Berger





Mehr Informationen über die Mailingliste Allegro