avanti-x 'end'-Befehl

Anando Eger anando at aneg-dv.de
So Dez 15 14:32:41 CET 2002


Lieber Herr Eversberg,

da ich nun gerade mal avanti-x quäle, bin ich auf folgende
Effekte gestoßen:

Laut xend.rtf gilt der end-Befehl auch für avanti.

Wenn ich jedoch diesen kleinen Job starte, 
--- FALL A ---------------------------------------------------
& ./
jump M2
:M1
end

:M2
jump M1
@ DB=avdemo ID=opac/opac
AVANTI:EOJ
--------------------------------------------------------------
erhalte ich 
--------------------------------------------------------------
J: Joblimit reached (1000000 lines)
AVANTI:EOR
--------------------------------------------------------------
wenn etwas mehr im Job drinsteht, auch 'core dump's.

Ändere ich den Job so ab:
--- FALL B ---------------------------------------------------
& ./
jump M2
:M1
end
jump ende
:M2
jump M1
:ende
end
@ DB=avdemo ID=opac/opac
AVANTI:EOJ
--------------------------------------------------------------
läuft alles scheinbar normal. Ich vermutete, dass sich der erste 
'end'-Befehl irgendwie irregulär zu benehmen scheint, wenn vorher 
einige Sprünge erfolgt sind - aber nein:
--- Fall C ---------------------------------------------------
& ./
write "vor 1. end" n
end
write "nach 1. end" n
end
@ DB=avdemo ID=opac/opac
AVANTI:EOJ
--------------------------------------------------------------
erzeugt:
--------------------------------------------------------------
vor 1. end
nach 1. end

AVANTI:EOR
--------------------------------------------------------------
Das gilt auch für ältere Avanti-Versionen.

Ich habe die

Vermutung 1
**************************************************************
* - avanti ignoriert ein einzelnes 'end'                     *
**************************************************************

Nach der Ausschrift, die Fall B erzeugt, läßt sich 
außerdem annehmen 

Vermutung 2:
**************************************************************
* - avanti zählt die Anzahl der abgearbeiteten Befehle und   *
*   hört nach 1000000 Befehlen auf.                          *
*   Dadurch kann man keine Schleifen programmieren, deren    * 
*   Befehlsschritt-Summe in die genannte Größenordnung       * 
*   gelangt.                                                 *
**************************************************************

Um die letzte Vermutung zu prüfen, versuchte ich
--- Fall D ---------------------------------------------------
& ./
:M1
jump M1
@ DB=avdemo ID=opac/opac
AVANTI:EOJ
--------------------------------------------------------------
was aber zu meiner Überraschung folgendes produziert:
--------------------------------------------------------------
jp=
J:<E120> Label M1 not found

AVANTI:EOR
--------------------------------------------------------------
das erzeugt bei mir die:

Vermutung 3:
***********************************************************
* - auf der ersten Jobzeile nach "& ..." darf keine       *
*   Sprungmarke stehen                                    *
***********************************************************

Ich halte diese durch folgendes Ergebnis bestätigt,
--- Fall E ---------------------------------------------------
& ./
write n
:M1
jump M1
@ DB=avdemo ID=opac/opac
AVANTI:EOJ
--------------------------------------------------------------
da dieser Job außerdem das nach Vermutung 2 erwartete liefert:
--------------------------------------------------------------

J: Joblimit reached (1000000 lines)

AVANTI:EOR
--------------------------------------------------------------
Der 
--- Fall F ---------------------------------------------------
& ./
write "1" n
var "A"
if "A" end
end
write "2" n
end
@ DB=avdemo ID=opac/opac
AVANTI:EOJ
--------------------------------------------------------------
ergibt mit avanti 1.7.1ff
--------------------------------------------------------------
1
2

AVANTI:EOR
--------------------------------------------------------------
und läßt mich die Vermutung 1 ändern in
- der end-Befehl funktioniert in avanti-x nicht.

Nur bedingter >>FRUST<<: Man sollte ja immer zum Ende springen,
das ist besserer Programmierstil (deshalb war mir das bisher nicht
aufgefallen :-))

Die Randbedingungen zu diesen Tests waren:
- SuSe-Linux 8.0
- avanti's der Versionen 1.7(1999)ff
- netterm als Terminal-Programm, dessen Scripfähigkeit ich
  hierzu missbrauchte. 
- die avdemo-datenbank sowie verschiedene eigene, die
  das Verhalten aber nicht beeinflussten
- Die Jobtext-Zeilen wurden CP850 codiert, die Zeilen mit
  0a0d(hex) abgeschlossen.
- probeweise habe ich als Zeilenabschluss nur 0a(hex) verwendet,
  was das Verhalten aber nicht beeinflusste

Diskussion der Egebnisse:

- Die Begrenzung auf 1000000 abarbeitenbare Befehle würde ich
  abschaffen. Mit einer geeigneten timeout-Überwachung sollten
  sich auch Endlosschleifen vermeiden lassen.

- Die Sache mit der Sprungmarke auf der ersten (Nutz-)Befehlszeile
  halte ich für einen Fehler.

- Eine end-Anweisung sollte den Job unbedingt beenden, oder die
  Kennzeichnung des 'end'-Befehls als von "avanti unterstützt" 
  sollte in xend.rtf entfernt werden.

Viele Grüße
Anando Eger




Mehr Informationen über die Mailingliste Allegro