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