QueryValidObject()

FUNKTION:
     public int QueryValidObject(string oname);

DEFINIERT IN:
     /std/virtual/v_compiler.c

ARGUMENTE:
     oname
       Objektname, der geprueft werden soll (kompletter Pfad mit / am Anfang) 

RUeCKGABEWERT:
     <=0 - falls VC nicht zustaendig ist.
     >0 - falls der VC sich fuer das Objekt zustaendig erklaert.

BESCHREIBUNG:
     Ueber die Funktion laesst sich herausfinden, ob ein VC sich fuer das
     gewuenschte Objekt zustaendig fuehlt. Dabei wird Validate(),
     P_COMPILER_PATH, NoParaObjects() und P_PARA im VC ausgewertet:
     1. Zuerst wird mit Validate() geprueft, ob der Filename (ohne Pfad) ok ist.
     2. wird geguckt, ob das angefragte Objekt im richtigen Pfad liegt 
        (P_COMPILER_PATH).
     3. wenn das angefragte Objekt ein Para-Objekt ist:
       a) wird NoParaObjects() geprueft, wenn das !=0 ist, sind gar keine Para-
          Objekte erlaubt.
       b) wird P_PARA _im VC_ abgefragt, dort kann man ein Array aller 
          erlaubten Para-Dimensionen reinschreiben. Fuer alle anderen erklaert 
          sich der VC fuer nicht zustaendig. Wenn P_PARA nicht gesetzt ist, 
          sind alle erlaubt. Ein leeres Array ({}) wuerde einem 
          NoParaObjects() {return 1;} entsprechen.

BEMERKUNGEN:
     Diese Funktion wird vom move abgefragt. Bitte auf jeden Fall P_PARA oder
     NoParaObjects() passend definieren, sonst buggts.

     Wenn jemand mit dem oben beschrieben Standardverhalten nicht gluecklich
     ist, kann man die Funktion passend ueberschreiben.


SIEHE AUCH:
     virtual_compiler
     CustomizeObject(), Validate(), NoParaObjects(), 
     P_COMPILER_PATH, P_PARA
     /std/virtual/v_compiler.c
----------------------------------------------------------------------------
21.10.2007, Zesstra
