test.c-Dateireferenz

#include <defines.h>
#include <properties.h>
#include <wizlevels.h>
#include <terminal.h>
Include-Abhängigkeitsdiagramm für test.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define DATAFILE   "test.dat"
#define DEFAULT_DATA   "/obj/tools/tester/test.dat"
#define P_OTEST_TYP   "ob-test:typ"
#define P_OTEST_SPL   "ob-test:spalten"
#define T_ROCHUS   1
#define T_RIKUS   2
#define T_PAUSE   4

Funktionen

string x_long ()
void create ()
void init ()
void Output (string text)
int removen ()
string * gross (string s)
string * det_auswerten (string input)
varargs mixed test_details (string str, string def)
string * eval_detail_entry (mixed key)
int search_d (object r)
int search_sense (object r, int sense)
int search_n (object r)
int search_m (object r)
int search (string arg)
int scanart (string arg)
int spaltenzahl (string arg)
int dirtesten (string arg)
void x_heart_beat ()

Variablen

inherit std thing
int scantyp
int spalten
mapping all_dets
mixed output
object master
int scanrun
int scancount
int scanpause
int * scanerr
string scandir
string * scanfiles
object testob

Makro-Dokumentation

#define DATAFILE   "test.dat"

Definiert in Zeile 98 der Datei test.c.

#define DEFAULT_DATA   "/obj/tools/tester/test.dat"

Definiert in Zeile 99 der Datei test.c.

#define P_OTEST_SPL   "ob-test:spalten"

Definiert in Zeile 102 der Datei test.c.

Wird benutzt von spaltenzahl().

#define P_OTEST_TYP   "ob-test:typ"

Definiert in Zeile 101 der Datei test.c.

Wird benutzt von scanart().

#define T_PAUSE   4

Definiert in Zeile 107 der Datei test.c.

Wird benutzt von dirtesten(), x_heart_beat() und x_long().

#define T_RIKUS   2

Definiert in Zeile 105 der Datei test.c.

Wird benutzt von scanart().

#define T_ROCHUS   1

Definiert in Zeile 104 der Datei test.c.

Wird benutzt von create(), scanart() und x_long().


Dokumentation der Funktionen

void create (  ) 

Definiert in Zeile 167 der Datei test.c.

Benutzt all_dets, create(), ME, output, P_LONG, P_SHORT, scancount, scandir, scanerr, scanfiles, scanpause, scanrun, scantyp, Set(), SetProp(), spalten und T_ROCHUS.

00168 {
00169     if (!clonep(ME))
00170         return;
00171 
00172     ::create();
00173 
00174 // Allgemeine globale Variablen initialisieren
00175 
00176     scantyp   = T_ROCHUS;
00177     spalten   = 4;
00178     all_dets  = ([]);
00179     output    = 0;
00180 
00181 // Globale Variablen fuer den Directoryscan initialisieren
00182 
00183     scandir   = 0;
00184     scanrun   = 0;
00185     scanfiles = ({});
00186     scancount = 0;
00187     scanpause = 0;
00188     scanerr   = ({0,0});
00189 
00190 // Properties
00191 
00192     SetProp(P_SHORT,"Ein Objektpruefer") ;
00193     Set(P_LONG,#'x_long,F_QUERY_METHOD);
00194     SetProp(P_NAME,"Objektpruefer");
00195     SetProp(P_GENDER,MALE);
00196     SetProp(P_AUTOLOADOBJ,1);
00197     SetProp(P_VALUE,0);
00198     SetProp(P_WEIGHT,0);
00199     SetProp(P_NODROP,1);
00200     SetProp(P_NEVERDROP,1);
00201 
00202     AddId( ({"pruefer","objektpruefer"}) );
00203 
00204     AddCmd( "otest","search" );
00205     AddCmd( "otype","scanart" );
00206     AddCmd( "ocolm","spaltenzahl" );
00207     AddCmd( "otdir","dirtesten" );
00208 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string* det_auswerten ( string  input  ) 

Definiert in Zeile 254 der Datei test.c.

00255 {   string *words,str,*re;
00256     int    anf,n,i;
00257 
00258     if (scantyp==T_RIKUS)
00259         return gross(input);
00260 
00261     re = ({});
00262     if (!input || !stringp(input))
00263         return re;
00264 
00265     words=regexplode(input,"[^A-Za-z0-9]");
00266         n=sizeof(words);
00267     if (!n)
00268         return re;
00269 
00270     anf=1;
00271     for (i=0;i<n;i++)
00272     {
00273         str=words[i];
00274         if (str=="" || str==" ")
00275             continue;
00276         if (str=="." || str==":" || str=="?" || str=="!")
00277         {
00278             anf=1;
00279             continue;
00280         }
00281         if (sizeof(regexp(({str}),"[^A-Za-z0-9]")))
00282             continue;
00283         if (sizeof(regexp(({str}),"\\<[0-9]*\\>")))
00284             continue;
00285         if (str!=capitalize(str))
00286             continue;
00287         if (anf)
00288         {
00289             anf=0;
00290             continue;
00291         }
00292         re += ({ str });
00293     }
00294     return re;
00295 }

int dirtesten ( string  arg  ) 

Definiert in Zeile 940 der Datei test.c.

Benutzt break_string(), call_out(), dtime(), IS_LEARNER, master, ME, notify_fail(), output, P_TESTPLAYER, PL, removen(), scancount, scandir, scanerr, scanfiles, scanrun, T_PAUSE und time2string().

00941 {   string vz,af,u,*dir;
00942     int    i,si;
00943 
00944     if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
00945         return removen();
00946 
00947     if (scanrun)
00948     {
00949         write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
00950         return 1;
00951     }
00952 
00953     if (object_name(ME)[0..2]=="/p/")
00954     {
00955         write(break_string("Ein Dirscan kann nur durchgefuehrt werden, "+
00956               "wenn man den Pruefer in sein /players/-Verzeichnis kopiert "+
00957               "hat oder von einem dort liegenden Objekt inherited.",78,
00958               "OTEST: "));
00959         return 1;
00960     }
00961 
00962     notify_fail("OTEST-Syntax: otdir <verzeichnis> <ausgabefile>\n");
00963     if (!arg || !stringp(arg) || sscanf(arg,"%s %s",vz,af)!=2)
00964         return 0;
00965 
00966 // Zielfilename testen/festlegen.
00967 
00968     u=getuid(PL);
00969     if (file_size("/log/"+u+"/")!=-2)
00970     {
00971         printf("OTEST: Es existiert kein Verzeichnis '/log/%s/'\n",u);
00972         return 1;
00973     }
00974     for (i=strlen(af)-1;i>=0;i--)
00975         if (((si=af[i])<48 && si!=46) || (si>57 && si<65) || si>122 ||
00976             (si>90 && si<97))
00977         {
00978             write("OTEST: Illegaler Filename fuer Ausgabefile.\n");
00979             return 1;
00980         }
00981     u=sprintf("/log/%s/%s",u,af);
00982 
00983 // Zu untersuchendes Verzeichnis pruefen/einlesen.
00984 
00985     if (!vz || !stringp(vz) || strlen(vz)<3 || vz[0]!='/' || vz[<1]!='/')
00986     {
00987         write("OTEST: Verzeichnisname muss mit '/' beginnen und aufhoeren.\n");
00988         return 1;
00989     }
00990     for (i=strlen(af)-1;i>=0;i--)
00991         if (((si=af[i])<46) || (si>57 && si<65) || si>122 || (si>90 && si<97))
00992         {
00993             write("OTEST: Illegaler Filename fuer Verzeichnis.\n");
00994             return 1;
00995         }
00996     dir = get_dir(vz+"*.c");
00997     if ((si=sizeof(dir))<1)
00998     {
00999         write("OTEST: Das gewuenschte Verzeichnis existiert nicht oder ist "+
01000               "leer.\n");
01001         return 1;
01002     }
01003 
01004     output    = u;
01005 
01006     if (u=catch(write_file(output,
01007         sprintf("Teststart: %s\n\n",dtime(time())))) && stringp(u))
01008     {
01009         write(break_string(
01010             sprintf("Fehler beim Schreiben in das File %s:\n%sAborting.",
01011                 output,u),78,"OTEST: ",1));
01012         output = 0;
01013         return 1;
01014     }
01015 
01016     scanrun   = si+1;
01017     scanfiles = dir;
01018     scandir   = vz;
01019     scancount = 0;
01020     master    = PL;
01021     scanerr   = ({0,0});
01022 
01023     call_out("x_heart_beat",T_PAUSE);
01024 
01025     printf("OTEST: Scanne %d Files:\n"+
01026            "       %s => %s\n"+
01027            "Zeit:  etwa %s\n",si,vz,output,
01028                time2string("%h:%02m:%02s",si*4*T_PAUSE));
01029 
01030     return 1;
01031 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string* eval_detail_entry ( mixed  key  ) 

Definiert in Zeile 331 der Datei test.c.

00332 {   mixed  re,h;
00333     string *ra;
00334     int    i;
00335 
00336     if (!key || !stringp(key) || !mappingp(all_dets) || !member(all_dets,key))
00337         return ({});
00338 
00339     re=all_dets[key];
00340     if (closurep(re))
00341         re=funcall(re,key);
00342     if (mappingp(re))
00343     {
00344         ra=filter(m_indices(re),#'stringp);
00345         for ( h=({ re[0] }),i=sizeof(ra)-1 ; i>=0 ; i-- )
00346             if (stringp(re[ra[i]]))
00347                 h += ({ re[ra[i]] });
00348             else if (pointerp(re[ra[i]]))
00349                 h += re[ra[i]];
00350         re=h;
00351     }
00352     if (pointerp(re))
00353         return filter(re,#'stringp);
00354     if (stringp(re))
00355         return ({ re });
00356     return ({});
00357 }

string* gross ( string  s  ) 

Definiert in Zeile 249 der Datei test.c.

00250 {
00251     return regexp(regexplode(s,"[^A-Za-z0-9]"),"\\<[A-Z]");
00252 }

void init (  ) 

Definiert in Zeile 210 der Datei test.c.

00211 {
00212     ::init();
00213     if (PL->QueryProp(P_TESTPLAYER) || IS_LEARNER(PL))
00214     {
00215         scantyp=(PL->QueryProp(P_OTEST_TYP)||T_ROCHUS);
00216         spalten=(PL->QueryProp(P_OTEST_SPL)||4);
00217         return;
00218     }
00219     if (find_call_out("removen") == -1)
00220       call_out("removen",0);
00221 }

void Output ( string  text  ) 

Definiert in Zeile 230 der Datei test.c.

Wird benutzt von x_heart_beat().

00231 {
00232     if (!text || !stringp(text))
00233         return;
00234     if (objectp(output))
00235         output->More(text);
00236     else if (stringp(output))
00237         write_file(output,text);
00238     else
00239         write(text);
00240 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int removen (  ) 

Definiert in Zeile 242 der Datei test.c.

Wird benutzt von dirtesten(), scanart(), search() und spaltenzahl().

00243 {
00244     write("Dieses Tool ist nur fuer Testies und Magier!\n");
00245     remove();
00246     return 1;
00247 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int scanart ( string  arg  ) 

Definiert in Zeile 838 der Datei test.c.

Benutzt F_MODE_AS, h, IS_LEARNER, notify_fail(), P_OTEST_TYP, P_TESTPLAYER, PL, removen(), SAVE, scanrun, scantyp, T_RIKUS und T_ROCHUS.

00839 {   int h;
00840 
00841     if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
00842         return removen();
00843 
00844     if (scanrun)
00845     {
00846         write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
00847         return 1;
00848     }
00849 
00850     notify_fail("OTEST-Syntax: otype [rikus|rochus]\n");
00851     if (!arg || !stringp(arg))
00852     {
00853         if (h=PL->QueryProp(P_OTEST_TYP))
00854             scantyp=h;
00855         if (!h)
00856         {
00857             PL->SetProp(P_OTEST_TYP,scantyp);
00858             PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS);
00859         }
00860         printf("OTEST: Eingestellter Scantyp ist '%s'\n",
00861             (scantyp==T_ROCHUS?"ROCHUS":"RIKUS"));
00862         return 1;
00863     }
00864     if (member(({"rikus","rochus"}),arg)==-1)
00865         return 0;
00866     if (arg=="rochus")
00867     {
00868         scantyp=T_ROCHUS;
00869         PL->SetProp(P_OTEST_TYP,scantyp);
00870         PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS);
00871         write("OTEST: Eingestellter Scantyp ist 'ROCHUS'\n");
00872         return 1;
00873     }
00874     scantyp=T_RIKUS;
00875     PL->SetProp(P_OTEST_TYP,scantyp);
00876     PL->Set(P_OTEST_TYP,SAVE,F_MODE_AS);
00877     write("OTEST: Eingestellter Scantyp ist 'RIKUS'\n");
00878     return 1;
00879 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

int search ( string  arg  ) 

Definiert in Zeile 752 der Datei test.c.

Benutzt IS_LEARNER, master, notify_fail(), old_explode(), output, P_TESTPLAYER, PL, removen(), scanrun, search_d(), search_m() und search_n().

Wird benutzt von eval_command().

00753 {   string *in,dum;
00754     object targ;
00755     int    wo;
00756 
00757     if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
00758         return removen();
00759 
00760     if (scanrun)
00761     {
00762         write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
00763         return 1;
00764     }
00765 
00766     notify_fail("OTEST-Syntax: otest [detail|smell|sound] "+
00767                  "{<objekt>[in mir|im raum]|hier}\n");
00768 
00769     if (!arg || !stringp(arg) || sizeof(in=old_explode(arg," "))<1)
00770     {
00771         output=PL;
00772         scanrun=0;
00773         master=PL;
00774         return search_d(environment(PL));
00775     }
00776 
00777     if (sizeof(in)>1)
00778     {
00779         arg=implode(in[1..]," ");
00780         if (member(({"hier","raum",""}),arg)!=-1)
00781             targ=environment(PL);
00782         else
00783         {
00784             if (sscanf(arg,"%s in mir",dum))
00785             {
00786                 wo=1;
00787                 arg=dum;
00788             }
00789             else if (sscanf(arg,"%s im raum",dum))
00790             {
00791                 wo=-1;
00792                 arg=dum;
00793             }
00794             else wo=0;
00795             if (wo!=-1)
00796                 targ=present(arg,PL);
00797             if (!objectp(targ) && wo!=1)
00798                 targ=present(arg,environment(PL));
00799         }
00800     }
00801     else
00802         targ=environment(PL);
00803     if (!objectp(targ))
00804     {
00805         write("OTEST-ERROR: Gewuenschtes Ziel nicht gefunden.\n");
00806         return 0;
00807     }
00808 
00809     output=PL;
00810     scanrun=0;
00811     master=PL;
00812 
00813     switch(in[0])
00814     {
00815         case "de" :
00816         case "detail" :
00817         case "details" :
00818             return search_d(targ);
00819         case "sm" :
00820         case "smell" :
00821         case "smells" :
00822             return search_m(targ);
00823         case "so" :
00824         case "sound" :
00825         case "sounds" :
00826             return search_n(targ);
00827     }
00828     return 0;
00829 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int search_d ( object  r  ) 

Definiert in Zeile 366 der Datei test.c.

Wird benutzt von search() und x_heart_beat().

00367 {   int     i,j,room;
00368     mapping m;
00369     string  *s,s1,*s2,PRE,END,*special,*zufinden,*details,re,*uebergehen;
00370     mixed   mi;
00371 
00372     if (!r || !objectp(r))
00373     {
00374         write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
00375         return 1;
00376     }
00377 
00378 // Die Ausgaben erfolgen zunaechst in einen String.
00379 
00380     re="\n";
00381 
00382 // Handelt es sich um einen Raum?
00383 
00384     room = (function_exists("int_long",r) ? 1 : 0 );
00385 
00386 // Terminaltyp des Magiers feststellen.
00387 
00388     if (objectp(output))
00389         switch (output->QueryProp(P_TTY))
00390         {
00391             case "ansi"  :
00392             case "vt100" : PRE=BOLD; END=NORMAL; break;
00393             default      : PRE="";   END="";     break;
00394         }
00395     else
00396     {
00397         PRE="";
00398         END="";
00399     }
00400 
00401 //  Liste der zu uebergehenden Details erzeugen. Die verwendete Methode hat den
00402 //  Vorteil, dass man nach einer Ergaenzung der Liste nicht das Tool neu laden
00403 //  und clonen muss. Das Tool erwartet, die Liste DATAFILE im gleichen
00404 //  Verzeichnis zu finden, in dem auch das Tool liegt.
00405 
00406     s1=implode(explode(old_explode(object_name(ME),"#")[0],"/")[0..<2],"/")+"/"
00407        DATAFILE;
00408     if (file_size(s1)<1)
00409         s1=DEFAULT_DATA;
00410 
00411     uebergehen = regexp(regexplode(read_file(s1),"[^A-Za-z0-9]"),"\\<[a-z]");
00412 
00413 // Satz an Details, die auf jeden Fall vorhanden sein sollten, je nachdem
00414 // ob P_INDOORS gesetzt ist oder nicht.
00415 
00416     if (room && r->QueryProp(P_INDOORS))
00417         zufinden = ({"Boden","Decke","Wand","Waende","Raum"});
00418     else if (room)
00419         zufinden = ({"Boden","Himmel","Sonne","Wolke","Wolken"});
00420     else
00421         zufinden = ({});
00422 
00423 // Alle vorhandenen Details anzeigen.
00424 
00425 //    details = sort_array(m_indices(r->_query_details()||([])),#'<);
00426     details = sort_array(m_indices(r->QueryProp(P_DETAILS)||([])),#'<);
00427 
00428     if (scanrun<1)
00429     {
00430         if ((i=sizeof(details))>0)
00431         {
00432             for ( s1="",--i; i>=0 ; i-- )
00433                 s1 += (details[i]+(i?"\n":""));
00434 
00435             re += sprintf(sprintf("%sListe der vorhandenen Details:%s\n\n"+
00436                           "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
00437                           sprintf(".%d",spalten))+"s")),s1);
00438         }
00439         else
00440             re += sprintf("%sKeine Details gefunden.%s\n\n",PRE,END);
00441     }
00442 
00443 // Alle vorhandenen SpecialDetails anzeigen.
00444 
00445 //    special=sort_array(m_indices(r->_query_special_details()||([])),#'<);
00446     special=sort_array(m_indices(r->QueryProp(P_SPECIAL_DETAILS)||([])),#'<);
00447 
00448     if (scanrun<1)
00449     {
00450         if ((i=sizeof(special))>0)
00451         {
00452             for ( s1="",--i ; i>=0 ; i-- )
00453                 s1 += (special[i]+(i?"\n":""));
00454 
00455             re += sprintf(sprintf(
00456                           "%sListe der vorhandenen SpecialDetails:%s\n\n"+
00457                           "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
00458                           sprintf(".%d",spalten))+"s")),s1);
00459         }
00460         else
00461             re += sprintf("%sKeine SpecialDetails gefunden.%s\n\n",PRE,END);
00462     }
00463 
00464 //  Die Listen der vorhandenen Details und SpecialDetails vereinigen.
00465 
00466     details += special;
00467 
00468 //  Details und SpecialDetails auswerten - gar nicht so einfach.
00469 
00470     all_dets = r->Query(P_DETAILS);
00471 
00472     for ( s=({}),i=sizeof(details)-1 ; i>=0 ; i--)
00473         s += eval_detail_entry(details[i]);
00474 
00475     for ( s2=({}),i=sizeof(s)-1 ; i>=0 ; i-- )
00476         if (stringp(s[i]))
00477             if (member(s2,s[i])==-1)
00478             {
00479                 s2 += ({ s[i] });
00480                 zufinden+=det_auswerten(s[i]);
00481             }
00482 
00483 //  Grossgeschriebene Woerter aus der Langbeschreibung hinzufuegen.
00484 
00485     if (function_exists("int_long",r))
00486         zufinden += det_auswerten(
00487             old_explode(r->int_long(master,master),"Es gibt ")[0]);
00488     else
00489         zufinden += det_auswerten(old_explode(r->long(),"enthaelt:")[0]);
00490 
00491 // Doppelte Eintraege eliminieren.
00492 
00493     for ( s2=({}), i=sizeof(zufinden)-1 ; i>=0 ; i--)
00494         if (member(s2,zufinden[i])==-1)
00495             s2 += ({ zufinden[i] });
00496 
00497 // Alles klein machen.
00498 
00499     zufinden=map(s2,#'lower_case);
00500 
00501 // Bei NPCs/Objekten die IDs rausfiltern.
00502 
00503     if (!room)
00504         zufinden -= r->QueryProp(P_IDS);
00505 
00506 // Die zu uebergehenden Details rausfiltern.
00507 
00508     zufinden=filter((zufinden-uebergehen),#'stringp);
00509 
00510 // Schauen, welche Details fehlen und diese Ausgeben.
00511 
00512     for ( s=({}),s2=({}),i=sizeof(zufinden)-1;i>=0;i--)
00513     {
00514         if (!(mi=test_details(zufinden[i])))
00515             continue;
00516         if (pointerp(mi))
00517         {
00518            for (j=sizeof(mi)-1 ; j>=0 ; j--)
00519                if (member(s,mi[j])==-1)
00520                    s += ({ mi[j] });
00521         }
00522         else if (stringp(mi) && member(s2,mi)==-1)
00523             s2 += ({ mi });
00524     }
00525 
00526     s  = sort_array(s, #'<);
00527     s2 = sort_array(s2,#'<);
00528 
00529     if (scanrun<1)
00530     {
00531         if ((i=sizeof(s))>0)
00532         {
00533             for ( s1="",--i ; i>=0 ; i-- )
00534                 s1 += (s[i]+(i?"\n":""));
00535 
00536             re += sprintf(sprintf("%sListe der gefundenen Details:%s\n\n"+
00537                           "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
00538                           sprintf(".%d",spalten))+"s")),s1);
00539         }
00540         else
00541             re += sprintf("%sEs gibt keine Details.%s\n\n",PRE,END);
00542     }
00543 
00544     if ((i=sizeof(s2))>0)
00545     {
00546         for ( s1="",--i ; i>=0 ; i-- )
00547            s1 += (s2[i]+(i?"\n":""));
00548 
00549         re += sprintf(sprintf("%sListe der fehlenden Details:%s\n\n"+
00550                       "%s\n\n",PRE,END,("%-#78"+(spalten<1?"":
00551                       sprintf(".%d",spalten))+"s")),s1);
00552     }
00553     else
00554         re += sprintf("%sEs fehlen keine Details.%s\n\n",PRE,END);
00555 
00556     if (scanrun<1)
00557         re += sprintf("%sFERTIG.%s\n",PRE,END);
00558 
00559 // Die eigentliche Textausgabe.
00560 
00561     Output(re);
00562 
00563     return 1;
00564 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int search_m ( object  r  ) 

Definiert in Zeile 734 der Datei test.c.

Benutzt search_sense() und SENSE_SMELL.

Wird benutzt von search().

00735 {
00736     if (!r || !objectp(r))
00737     {
00738         write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
00739         return 1;
00740     }
00741 
00742     return search_sense(r,SENSE_SMELL);
00743 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int search_n ( object  r  ) 

Definiert in Zeile 716 der Datei test.c.

Benutzt search_sense() und SENSE_SOUND.

Wird benutzt von search().

00717 {
00718     if (!r || !objectp(r))
00719     {
00720         write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
00721         return 1;
00722     }
00723 
00724     return search_sense(r,SENSE_SOUND);
00725 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int search_sense ( object  r,
int  sense 
)

Definiert in Zeile 573 der Datei test.c.

Wird benutzt von search_m(), search_n() und x_heart_beat().

00574 {   string re,PRE,END,WAS,*senses,s1,*zufinden,*s2,*s3,def;
00575     int    i,j;
00576     mixed  mi;
00577 
00578     if (!r || !objectp(r))
00579     {
00580         write("OTEST-ERROR: Kein (existierendes) Zielobjekt gefunden!\n");
00581         return 1;
00582     }
00583     if (sense==SENSE_SMELL)
00584     {
00585         all_dets=r->Query(P_SMELLS)||([]);
00586         WAS="Gerueche";
00587     }
00588     else if (sense==SENSE_SOUND)
00589     {
00590         all_dets=r->Query(P_SOUNDS)||([]);
00591         WAS="Geraeusche";
00592     }
00593     else
00594     {
00595         write("OTEST-ERROR: Illegaler sense-Wert in search_sense()\n");
00596         return 1;
00597     }
00598 
00599     re = "\n";
00600 
00601     zufinden = ({SENSE_DEFAULT});
00602 
00603     def = all_dets[SENSE_DEFAULT];
00604 
00605 // Terminaltyp des Magiers feststellen.
00606 
00607     if (objectp(output))
00608         switch (output->QueryProp(P_TTY))
00609         {
00610             case "ansi"  :
00611             case "vt100" : PRE=BOLD; END=NORMAL; break;
00612             default      : PRE="";   END="";     break;
00613         }
00614     else
00615     {
00616         PRE="";
00617         END="";
00618     }
00619 
00620     senses = sort_array(m_indices(all_dets),#'<);
00621 
00622 // Alle vorhandenen Sense-Details anzeigen.
00623 
00624     if (scanrun<1)
00625     {
00626         if ((i=sizeof(senses))>0)
00627         {
00628             for ( s1="",--i; i>=0 ; i-- )
00629                 s1 += ((senses[i]==SENSE_DEFAULT?"DEFAULT":
00630                         senses[i])+(i?"\n":""));
00631 
00632             re += sprintf(sprintf("%sListe der vorhandenen %s:%s\n\n"+
00633                           "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"":
00634                           sprintf(".%d",spalten))+"s")),s1);
00635         }
00636         else
00637             re += sprintf("%sKeine %s gefunden.%s\n\n",PRE,WAS,END);
00638     }
00639 
00640 
00641 //  Sense-Details auswerten - geht wie bei Details.
00642 
00643     for ( s2=({}),i=sizeof(senses)-1 ; i>=0 ; i--)
00644         s2 += eval_detail_entry(senses[i]);
00645 
00646     for ( s3=({}),i=sizeof(s2)-1 ; i>=0 ; i-- )
00647         if (stringp(s2[i]))
00648             if (member(s3,s2[i])==-1)
00649             {
00650                 s3 += ({ s2[i] });
00651                 zufinden+=det_auswerten(s2[i]);
00652             }
00653 
00654 // Testen, welche Sense-Details fehlen und anzeigen
00655 
00656     for ( s2=({}),s3=({}),i=sizeof(zufinden)-1;i>=0;i--)
00657     {
00658         if (!(mi=test_details(zufinden[i],def)))
00659             continue;
00660         if (pointerp(mi))
00661         {
00662             for (j=sizeof(mi)-1 ; j>=0 ; j--)
00663                 if (member(s2,mi[j])==-1)
00664                     s2 += ({ mi[j] });
00665         }
00666         else if (stringp(mi) && member(s3,mi)==-1)
00667             s3 += ({ mi });
00668     }
00669     s2 = sort_array(s2,#'<);
00670     s3 = sort_array(s3,#'<);
00671 
00672     if (scanrun<1)
00673     {
00674         if ((i=sizeof(s2))>0)
00675         {
00676             for ( s1="",--i ; i>=0 ; i-- )
00677                 s1 += ((s2[i]==SENSE_DEFAULT?"DEFAULT":s2[i])+(i?"\n":""));
00678 
00679             re += sprintf(sprintf("%sListe der gefundenen %s:%s\n\n"+
00680                           "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"":
00681                           sprintf(".%d",spalten))+"s")),s1);
00682         }
00683         else
00684             re += sprintf("%sEs gibt keine %s.%s\n\n",PRE,WAS,END);
00685     }
00686 
00687     if ((i=sizeof(s3))>0)
00688     {
00689         for ( s1="",--i ; i>=0 ; i-- )
00690            s1 += ((s3[i]==SENSE_DEFAULT?"DEFAULT":s3[i])+(i?"\n":""));
00691 
00692         re += sprintf(sprintf("%sListe der fehlenden %s:%s\n\n"+
00693                       "%s\n\n",PRE,WAS,END,("%-#78"+(spalten<1?"":
00694                       sprintf(".%d",spalten))+"s")),s1);
00695     }
00696     else
00697         re += sprintf("%sEs fehlen keine %s.%s\n\n",PRE,WAS,END);
00698 
00699     if (scanrun<1)
00700         re += sprintf("%sFERTIG.%s\n",PRE,END);
00701 
00702 // Die eigentliche Textausgabe.
00703 
00704     Output(re);
00705 
00706     return 1;
00707 }

Hier ist ein Graph der zeigt, wo diese Funktion aufgerufen wird:

int spaltenzahl ( string  arg  ) 

Definiert in Zeile 888 der Datei test.c.

Benutzt F_MODE_AS, h, IS_LEARNER, notify_fail(), P_OTEST_SPL, P_TESTPLAYER, PL, removen(), SAVE, scanrun und spalten.

00889 {   int h;
00890 
00891     if (!(PL->QueryProp(P_TESTPLAYER)) && !IS_LEARNER(PL))
00892         return removen();
00893 
00894     if (scanrun)
00895     {
00896         write("Derzeit wird ein Verzeichnis gescanned. Bitte warten.\n");
00897         return 1;
00898     }
00899 
00900     notify_fail("OTEST-Syntax: ocolm [1|2|3|4|5|6|7|8|auto]\n");
00901 
00902     if (!arg || !stringp(arg))
00903     {
00904         if (h=PL->QueryProp(P_OTEST_SPL))
00905             spalten=h;
00906         if (!h)
00907         {
00908             PL->SetProp(P_OTEST_SPL,spalten);
00909             PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS);
00910         }
00911         printf("OTEST: Eingestellte Spaltenzahl ist '%s'\n",
00912             (spalten>0?sprintf("%d",spalten):"'AUTO'"));
00913         return 1;
00914     }
00915     if (arg=="auto")
00916     {
00917         spalten=-1;
00918         PL->SetProp(P_OTEST_SPL,spalten);
00919         PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS);
00920         write("OTEST: Eingestellte Spaltenzahl ist 'AUTO'\n");
00921         return 1;
00922     }
00923     h = to_int(arg);
00924     if (h<1 || h>8)
00925         return 0;
00926     spalten=h;
00927     PL->SetProp(P_OTEST_SPL,spalten);
00928     PL->Set(P_OTEST_SPL,SAVE,F_MODE_AS);
00929     printf("OTEST: Eingestellte Spaltenzahl ist %d\n",spalten);
00930     return 1;
00931 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

varargs mixed test_details ( string  str,
string  def 
)

Definiert in Zeile 297 der Datei test.c.

00298 {   string *strs,ostr,*strs2,suf;
00299     int    i;
00300 
00301     if (!str || !stringp(str) || !mappingp(all_dets))
00302         return 0;
00303 
00304     strs = ({str});
00305     ostr = str;
00306 
00307     if ((suf=extract(str,-1,-1))=="s" || suf=="n" || suf=="e")
00308     {
00309         ostr  = extract(str,0,-2);
00310         strs += ({ ostr });
00311         ostr += ("("+suf+")");
00312     }
00313     if ((suf=extract(str,-2,-1))=="es" || suf=="en")
00314     {
00315         ostr  = extract(str,0,-3);
00316         strs += ({ ostr });
00317         ostr += ("("+suf+")");
00318     }
00319     for ( strs2=({}),i=sizeof(strs)-1 ; i>=0 ; i--)
00320         if (member(all_dets,strs[i]))
00321         {
00322             if (stringp(def) && all_dets[strs[i]]==def && str!=SENSE_DEFAULT)
00323                 continue;
00324             strs2 += ({ strs[i] });
00325                 }
00326     if (sizeof(strs2)>0)
00327         return strs2;
00328     return ostr;
00329 }

void x_heart_beat (  ) 

Definiert in Zeile 1040 der Datei test.c.

Benutzt break_string(), call_out(), MSGFLAG_TELL, Output(), output, scancount, scandir, scanerr, scanfiles, scanrun, search_d(), search_sense(), SENSE_SMELL, SENSE_SOUND, T_PAUSE und testob.

01041 {   int    nr;
01042     string fn,er;
01043 
01044     call_out("x_heart_beat",T_PAUSE);
01045 
01046     if ((++scancount)>4)
01047     {
01048         scancount = 1;
01049         testob    = 0;
01050         scanrun--;
01051     }
01052 
01053     nr=scanrun-2;
01054     if (nr<0)
01055     {
01056         if (environment() && interactive(environment()))
01057             environment()->Message(break_string("'otdir' beendet.\n"+
01058                 sprintf("Files: %d - Fehler: %d - Skips: %d",
01059                 sizeof(scanfiles),scanerr[0],scanerr[1]),
01060                 78,"OTEST: ",1),MSGFLAG_TELL);
01061 
01062         scanrun   = 0;
01063         scancount = 0;
01064         output    = 0;
01065         scanfiles = ({});
01066         scandir   = 0;
01067         testob    = 0;
01068         scanerr   = ({0,0});
01069 
01070         while(remove_call_out("x_heart_beat")!=-1);
01071 
01072         return;
01073     }
01074     fn=scandir+scanfiles[nr];
01075     if (fn[<2..]==".c")
01076         fn=fn[0..<3];
01077 
01078     if (scancount==1) // Testen, ob File ladbar
01079     {
01080         Output(sprintf("File: %s\n\n",fn));
01081         er=catch(call_other(fn,"???"));
01082         if (er && stringp(er))
01083         {
01084             Output(sprintf("Error: %s->Abort@Load\n\n",er));
01085             scanrun--;
01086             scancount  = 0;
01087             testob     = 0;
01088             scanerr[0] = scanerr[0]+1;
01089         }
01090         else
01091             testob = find_object(fn);
01092         return;
01093     }
01094     if (!objectp(testob))
01095     {
01096         Output("Objekt nicht gefunden\n-> Abort@Object.\n\n");
01097         scanrun--;
01098         scancount  = 0;
01099         scanerr[0] = scanerr[0]+1;
01100         return;
01101     }
01102     if (!function_exists("int_long",testob))
01103     {
01104         Output("Objekt ist kein Raum -> SKIPPING.\n\n");
01105         scanrun--;
01106         scancount  = 0;
01107         testob     = 0;
01108         scanerr[1] = scanerr[1]+1;
01109         return;
01110     }
01111     switch(scancount)
01112     {
01113         case 2 :
01114             if ((er=catch(search_d(testob))) && stringp(er))
01115             {
01116                 Output(sprintf("Error: %s-> Abort@Detail.\n\n",er));
01117                 scanrun--;
01118                 scancount  = 0;
01119                 testob     = 0;
01120                 scanerr[0] = scanerr[0]+1;
01121             }
01122             return;
01123         case 3 :
01124             if ((er=catch(search_sense(testob,SENSE_SMELL))) && stringp(er))
01125             {
01126                 Output(sprintf("Error: %s-> Abort@Smell.\n\n",er));
01127                 scanrun--;
01128                 scancount  = 0;
01129                 testob     = 0;
01130                 scanerr[0] = scanerr[0]+1;
01131             }
01132             return;
01133         case 4 :
01134             if ((er=catch(search_sense(testob,SENSE_SOUND))) && stringp(er))
01135             {
01136                 Output(sprintf("Error: %s-> Abort@Sound.\n\n",er));
01137                 scanrun--;
01138                 scancount  = 0;
01139                 testob     = 0;
01140                 scanerr[0] = scanerr[0]+1;
01141             }
01142             return;
01143     }
01144     return;
01145 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:

string x_long (  ) 

Definiert in Zeile 126 der Datei test.c.

Benutzt BOLD, break_string(), END, NORMAL, P_TTY, PL, scandir, scanerr, scanfiles, scanrun, scantyp, spalten, T_PAUSE, T_ROCHUS und time2string().

00127 {   string re,PRE,END;
00128 
00129     switch (PL->QueryProp(P_TTY))
00130     {
00131         case "ansi"  :
00132         case "vt100" : PRE=BOLD; END=NORMAL; break;
00133         default      : PRE="";   END="";     break;
00134     }
00135 
00136     re = break_string(
00137          "Mit diesem Objektpruefer kannst Du feststellen, welche Details, "+
00138          "Gerueche oder Geraeusche in einem Raum bzw an einem Objekt noch "+
00139          "nicht beschrieben sind.",78)+
00140          "\n"+
00141          "Syntax: %sotest [detail|smell|sound] {<objekt>[in mir|im raum]|"+
00142              "hier}\n\n"+
00143          "        otype [rikus|rochus]\n\n"+
00144          "        ocolm [1|2|3|4|5|6|7|8|auto]\n\n"+
00145          "        otdir <verzeichnis> <ausgabefile>%s\n\n"+
00146          break_string(
00147          "Mit %sotype%s kann man festlegen, ob man im 'Rikus'- oder im "+
00148          "'Rochus'-Modus scannen will, mit %socolm%s die anzahl der Ausgabe"+
00149          "spalten und mit %sotest%s wird dann die Auswertung gestartet. "+
00150          "Mit dem Kommando %sotdir%s kann man sogar ganze Verzeichnisse "+
00151          "auf einmal testen lassen. Das dauert natuerlich eine Weile. "+
00152          "Ausserdem muss ein Verzeichnis '/log/<magiername>/' bestehen.",78)+
00153          "Derzeitiger Scantyp:    %s'"+(scantyp==T_ROCHUS?"ROCHUS":"RIKUS")+
00154          "'%s\n"+
00155          "Derzeitige Spaltenzahl: %s%s%s\n%s";
00156     return sprintf(re,PRE,END,PRE,END,PRE,END,PRE,END,PRE,END,PRE,END,PRE,
00157            (spalten>0?sprintf("%d",spalten):"'AUTO'"),END,
00158            (scanrun?sprintf(
00159                "\nDerzeit Dirscan in:     %s%s%s\n"+
00160                "Angenommene Restzeit:   %s(%s) [Fi:%d/%d|Er:%d|Sk:%d]%s\n",
00161                PRE,scandir,END,PRE,
00162                time2string("%h:%02m:%02s",(scanrun-1)*4*T_PAUSE),
00163                (sizeof(scanfiles)-scanrun+1),(sizeof(scanfiles)),
00164                scanerr[0],scanerr[1],END):""));
00165 }

Hier ist ein Graph der zeigt, was diese Funktion aufruft:


Variablen-Dokumentation

mapping all_dets

Definiert in Zeile 116 der Datei test.c.

Wird benutzt von create().

object master
static nomask public string output
int scancount

Definiert in Zeile 122 der Datei test.c.

Wird benutzt von create(), dirtesten() und x_heart_beat().

string scandir

Definiert in Zeile 123 der Datei test.c.

Wird benutzt von create(), dirtesten(), x_heart_beat() und x_long().

int * scanerr

Definiert in Zeile 122 der Datei test.c.

Wird benutzt von create(), dirtesten(), x_heart_beat() und x_long().

string * scanfiles

Definiert in Zeile 123 der Datei test.c.

Wird benutzt von create(), dirtesten(), x_heart_beat() und x_long().

int scanpause

Definiert in Zeile 122 der Datei test.c.

Wird benutzt von create().

int scanrun

Definiert in Zeile 122 der Datei test.c.

Wird benutzt von create(), dirtesten(), scanart(), search(), spaltenzahl(), x_heart_beat() und x_long().

int scantyp

Definiert in Zeile 115 der Datei test.c.

Wird benutzt von create(), scanart() und x_long().

int spalten

Definiert in Zeile 115 der Datei test.c.

Wird benutzt von create(), spaltenzahl() und x_long().

object testob

Definiert in Zeile 124 der Datei test.c.

Wird benutzt von x_heart_beat().

inherit std thing

Definiert in Zeile 111 der Datei test.c.

Erzeugt am Thu Jun 3 14:40:28 2010 für MorgenGrauen Mudlib von  doxygen 1.6.3