/*

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