Groesser/Kleiner-Suche

Thomas Berger ThB at gymel.com
Di Jun 1 09:55:45 CEST 2004


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Lieber Herr Eversberg,


| Die Sache geht nun so, und zwar fuer jedes Register XYZ:
| (logische Reg. genau wie echte, also z.B. |7 )
|
| find XYZ A---B
| wobei A und B beliebige Zeichenketten sind.

aus xqrix.rtf:

|>>
abc kann aus 2 Teilen bestehen, getrennt durch das Zeichen '<' oder
gleichwertig '@'. Dann endet die Auflistung mit dem letzten Eintrag, der
kleiner ist als das, was hinter '<' bzw. '@' steht. Man verwendet '@'
dann, wenn der erste Suchbegriff ein '<' enthalten kann, bzw. umgekehrt.
<<<

D.h. Sie hatten fuer dasselbe Problem bereits schon einmal
eine Syntax eingefuehrt, die gleichermassen unbefriedigend
war.

Wenn Sie den Parser fuer Suchbefehle verbessern koennten,
dann waere eine saubere Loesung moeglich, die in keinem
Fall einen Konflikt mit Zeichenketten aus Suchbegriffen
ergibt. Etwa

find XYZ "A" - "B"
und analog
qrix XYZ "A" - "B"

d.h. Die neue Mimik greift nur dann, wenn die Suchbegriffe
in irgendeine Form von Anfuehrungszeichen eingeschlossen
sind und in diesem Fall ist klar, was Suchbegriff(e) ist/sind
und was ein syntaktisches Element der Abfragesprache.

[Problem am Rande: Wo setzt man nun das "&" fuer die SR-Expansion
der mittels find gebildeten Ergebnismenge hin?]


| Etwas genauer: der erste Eintrag ist derjenige, der
| exakt A lautet, der letzte derjenige, der exakt B
| lautet. Ein Eintrag, der mit A beginnt (und laenger
| ist als A) gehoert dazu, ein Eintrag, der mit B
| beginnt und laenger ist als B, gehoert nicht dazu.
|
| Will man, dass der exakt A lautende Eintrag nicht
| dazugehoert, muss man z.B. A0 schreiben. Soll der
| exakt B lautende Eintrag nicht dazugehoeren, muss
| man fuer B eine Zeichenfolge waehlen, die ganz dicht
| vor B laege (und u.U. gar nicht vorkommt). Wenn also
| z.B.  B = Dri waere, muesste man etwa  B = Drhzzz
| waehlen.
| (Haette man, um diese Komplikation zu meiden, die
| Logik ein wenig geaendert, ergaebe sich ein
| entsprechendes Problem fuer andere Sonderfaelle.)

Eine inifinitesimal groessere Zeichenkette zu bilden,
ist schon schwierig genug ("A0" ist z.B. zu gross,
wenn auch noch "A z" im Register steht. Mangels
String-Arithmetik in Avanti ist das Bilden einer
infinitesimal kleineren Zeichenkette sogar noch viel
schwieriger. Liesse sich nicht mit einem zusaetzlichen
Syntaxelement angeben, ob man die exakten Treffer
mit im Ergebnis haben moechte oder nicht, also etwa

find XYZ "=A" - "<B"


| Die Wahl von --- als Syntaxzeichen mag willkuerlich
| erscheinen, wurde jedoch nach einiger Diskussion
| als am wenigsten problembehaftet eingestuft (wenn
| man z.B. an CGI-Uebermittlung denkt).

Daran (an CGI-Uebermittlung) sollte man aber keinesfalls
denken: Jede Anwendung (auch CGI-Skripte) *muss* die
Eingaben zunaechst unschaedlich machen, d.h. jeglicher
Steuerfunktion berauben und dann avanti-Suchbegriffe
mit Steuerfunktion zusammenbauen. Sonst kann ein
Anwender Suchbegriffe erzeugen, die Avanti zum Absturz
bringen und/oder das Zielsystem ausspaehen koennen.
Beispiele fuer diese sogenannte "code injection" gibt
es zuhauf.

viele Gruesse
Thomas Berger
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.3-nr1 (Windows XP)
Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org

iD8DBQFAvDaBENVh3bB0lwMRAt8lAJwNe37qyGy6iADhjhsJpXZmrDz87QCeLFc6
B2K5Y/JItYu9wMdr+UPDolQ=
=mhuJ
-----END PGP SIGNATURE-----




Mehr Informationen über die Mailingliste Allegro