/*
Allgemeine Routinen zur Aufbereitung von Suchanfragen
Exportiert werden folgende Prozeduren:
NormStr(searchstring : STRING; s_m : STRING) : STRING
searchstr : User-Eingabe
s_m : ',' = fehlende Operatoren werden AND
'+' = fehlende Operatoren werden OR
Ergebnis: String, der direkt in MarkTable verwendet werden kann.
Dazu wird der Ausgangsstring in einzelne Komponenten zerlegt und diesen
ein '*' hinzugefügt.
Beispiele: mode=0; s_m='2'
hans -> hans*
hans otto -> hans*,otto*
hans OR otto -> hans*+otto*
"hans" -> hans
"hans" und "otto" -> hans,otto
Name:hans -> Name:hans*
AndStr(searchstr : STRING) : STRING
searchstr : beliebiger String
Ergebnis : String, bei dem alle Wörter durch ',' verbunden sind
encode_url(s : STRING) : STRING
beliebiger String
Ergebnis: URL-Codierung von s
Damit werden Umlaute und Sonderzeichen (wie Leerzeichen) in
URLs richtig übergeben.
*/
PROCEDURE AndStr(S : STRING) : STRING
VAR i,l,d : INTEGER
VAR r,v,c : STRING
S:=S+" "; l:=length(S); i:=0; d:=0;
WHILE i:=i+1<=l
IF upper(S[i]) von "A" bis "Z" OR S[i]="'" OR S[i] von "0" bis "9" THEN v:=v+S[i]
ELSE
IF v THEN
c:=","
IF S[i]="," THEN c:="+" END
IF d THEN r:=r+',' END
r:=r+v; v:=""; d:=1
END
IF S[i]="," THEN r:=r+"+"; d:=0 END
END
END
RETURN r
ENDPROC
PROCEDURE NormStr(s, s_m : STRING) : STRING
VAR s_chars : STRING = ',+-()".'
VAR result, ident : STRING
VAR c : CHAR
VAR state : INTEGER
// 0 : skip, 1 : readident
VAR i, first : INTEGER
s:=s+' '
WHILE i++<=length(s) DO
IF upper(c:=s[i]) FROM 'A' TO 'Z' OR upper(c) FROM '0' TO '9' THEN
IF state=0 THEN ident:=c; state:=1 ELSE ident:=ident+c END
ELSIF c=' ' OR pos(c,s_chars) THEN
IF state=1 THEN
IF ident IN ['AND','UND'] THEN result:=result+','
ELSIF ident IN ['OR','ODER'] THEN result:=result+'+'
ELSIF ident IN ['NOT','NICHT'] THEN result:=result+'-'
ELSIF ident THEN
IF result,pos(result[length(result)],s_chars+':')=0 THEN result:=result+s_m END
IF c='.' THEN result:=result+ident
ELSE result:=result+ident+'*'
END
END
ident:=''; state:=0
ELSIF state=2,c<>'"' THEN ident:=ident+c
END
IF c='"' THEN
IF state=0 THEN state:=2
ELSE result:=result+'('+AndStr(ident)+')'; ident:=''; state:=0
END
ELSIF pos(c,',+-()') THEN result:=result+c
END
ELSIF c=':' THEN
IF state=1 THEN
IF result,pos(result[length(result)],s_chars)=0 THEN result:=result+s_m END
result:=result+ident+':'; state:=0
END
END
END
RETURN result
ENDPROC
PROCEDURE hexstr(x : REAL) : STRING
VARDEF hs : STRING
hs:='0123456789ABCDEF'
RETURN hs[1+x DIV 16]+hs[1+x MOD 16]
ENDPROC
PROCEDURE encode_url(ll : STRING) : STRING
VARDEF ln : STRING
VARDEF i : REAL
ll:=oemtoansi(ll)
WHILE i++<=length(ll) DO
IF ll[i]=' ' THEN ln:=ln+'+'
ELSIF asc(ll[i])>=128 THEN ln:=ln+'%'+hexstr(asc(ll[i]))
ELSE ln:=ln+ll[i]
END
END
RETURN ln
ENDPROC