upd.c-Dateireferenz

#include <magier.h>
#include <player.h>
#include <debug_info.h>
#include <wizlevels.h>
#include <moving.h>
#include <properties.h>
#include <logging.h>
Include-Abhängigkeitsdiagramm für upd.c:

gehe zum Quellcode dieser Datei

Makrodefinitionen

#define NEED_PROTOTYPES

Funktionen

static varargs int _make (string file, int flags, int recursive)
static mixed * _query_localcmds ()
static mixed _save (object obj, object inv_saver)
private object _reload (string file, int clone, int flags, string err)
private varargs int _update (string file, int dummy, int flags)
private void _instance_upd (string file, int flags, mixed obj, int instances, int firstcall)
varargs private int _do_make (string file, int clone, int flags, string *dep, string *ready)
private string _make_dep (mixed dep, string prefix)
private int _illegal_closure (mixed arg)
static int _upd (string cmdline)
static int _load (string cmdline)

Makro-Dokumentation

#define NEED_PROTOTYPES

Definiert in Zeile 12 der Datei upd.c.


Dokumentation der Funktionen

varargs private int _do_make ( string  file,
int  clone,
int  flags,
string *  dep,
string *  ready 
)

Definiert in Zeile 203 der Datei upd.c.

Benutzt _make(), _reload(), err, file_time(), UPD_I, UPD_M und UPD_V.

Wird benutzt von _make().

00205 {
00206   object obj;
00207   string *ilist, err, *down;
00208   int ret;
00209   
00210   if (!pointerp(ready)) ready = ({});
00211   ready += ({ file });
00212   
00213   if ( !(obj = _reload(file,clone,flags,&err)))
00214   {
00215     dep += ({ err });
00216     return 0;
00217   }
00218   
00219   ilist = inherit_list(obj)-ready;
00220   
00221   down = ({});
00222   
00223   while (sizeof(ilist))
00224   {
00225     ret = _do_make( ilist[0],0,flags, &down, &ready )||ret;
00226     ilist[0..0] = ({});
00227     ilist -= ready;
00228   }
00229   
00230   if ( ret||file_time(file)>program_time(obj)||(flags &UPD_I))
00231     if ( _make( file, flags & ~(UPD_M|UPD_I) ,1) < 0 ) 
00232       dep = ({ "{" + explode(file,"/")[<1] + "}", down });
00233     else{
00234       dep = ({ "[" + explode(file,"/")[<1] + "]", down });
00235       ret = 1;
00236     }
00237   else if (flags&UPD_V) dep += ({ explode(file,"/")[<1], down });
00238   return ret;
00239 }

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

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

private int _illegal_closure ( mixed  arg  ) 

Definiert in Zeile 272 der Datei upd.c.

Benutzt i und query_closure_object().

Wird benutzt von _make().

00273 {
00274   int i, j;
00275   string *indices;
00276   
00277   if ( closurep(arg) && !objectp(query_closure_object(arg)) )
00278     return 1;
00279   
00280   if ( pointerp(arg) ){
00281     for ( i = sizeof(arg); i--; )
00282       if ( _illegal_closure(arg[i]) )
00283         return 1;
00284   }
00285   else if ( mappingp(arg) ){
00286     indices = m_indices(arg);
00287     for ( i = sizeof(indices); i--; )
00288       for ( j = get_type_info( arg, 1 ); j--; )
00289         if ( _illegal_closure(arg[indices[i], j]) )
00290           return 1;
00291   }
00292   return 0;
00293 }

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

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

private void _instance_upd ( string  file,
int  flags,
mixed  obj,
int  instances,
int  firstcall 
)

Definiert in Zeile 162 der Datei upd.c.

Benutzt _make(), call_out(), i, UPD_A, UPD_F und UPD_S.

00164 {
00165  int i;
00166  if (firstcall)
00167     printf("upd: %s: %s Instanzen.\n",file,flags&UPD_A?"Aktualisiere":"Suche");
00168   
00169   while (get_eval_cost()>220000 && i < sizeof(obj))
00170   {
00171     if (!objectp(obj[i]))
00172       instances--;
00173     else
00174     {
00175       if (flags&UPD_F&&!(flags&UPD_S))
00176         printf( "upd: %O gefunden in %s\n", obj[i],
00177                 environment(obj[i])?object_name(environment(obj[i])) 
00178                 : "keiner Umgebung" );
00179       if (flags&UPD_A) _make(object_name(obj[i]), flags & ~(UPD_A|UPD_F),1 );
00180     }
00181     i++;
00182   }
00183   if (i < sizeof(obj)) 
00184     call_out( #'_instance_upd/*'*/,2,file,flags,obj[i..],instances,0);
00185   else
00186     printf( "upd: %s: %d Instanzen %s\n", file, instances,
00187             (flags & UPD_A) ? "aktualisiert" : "gefunden" );
00188   return;
00189 }

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

static int _load ( string  cmdline  )  [static]

Definiert in Zeile 495 der Datei upd.c.

00496 {
00497   int flags;
00498   mixed *args;
00499 
00500   cmdline=_unparsed_args();
00501   args=parseargs(cmdline,&flags,"",1);
00502   if(flags==-1||!sizeof(args))
00503     return USAGE("load <datei> [<datei> ..]");
00504   args=file_list(args,MODE_UPD,0,"/");
00505   if(!sizeof(args)) return printf("load: Keine passende Datei gefunden!\n"),1;
00506   args=map(args,(: (($1[FILESIZE]!=-2||find_object($1[FULLNAME]))?
00507                           $1[FULLNAME]:0) :))-({0});
00508 
00509   if(!sizeof(args))
00510     return printf("load: Verzeichnisse koennen nicht geladen werden!\n"),1;
00511   asynchron(args,#'_make,UPD_LOAD,0,0);
00512   return 1;
00513 }

static varargs int _make ( string  file,
int  flags,
int  recursive 
) [static]

Definiert in Zeile 301 der Datei upd.c.

Benutzt _do_make(), _illegal_closure(), _make_dep(), _reload(), _update(), call_out(), env(), err, F_QUERY_METHOD, F_SET_METHOD, F_VALUE, i, inv(), INV_SAVE, items, m_delete(), msg(), NO_CHECK, P_ITEMS, RET_FAIL, RET_OK, UPD_A, UPD_C, UPD_D, UPD_F, UPD_I, UPD_L, UPD_LOAD, UPD_M, UPD_R und UPD_S.

Wird benutzt von _do_make() und _instance_upd().

00302 {
00303   string msg, err, blue;
00304   int inst;
00305   object obj, inv_saver;
00306   mixed tmp;
00307   
00308   msg = "";
00309 
00310   if (!file) return printf( "upd: Kein Filename uebergeben!\n" ), RET_FAIL;
00311     
00312 // Filename in Blue, Objektname in blue, Instanznummer in inst
00313 
00314   if (sscanf(file,"%s#%d",blue,inst)==2) blue += ".c";
00315   else blue = file + (file[<2..]==".c" ? "" : ".c");
00316 
00317 // Alle Instanzen durchsuchen im Falle von -a oder -f 
00318 
00319   if ((flags & UPD_LOAD)&&find_object(file))
00320     return printf("load: %s: Objekt ist schon geladen.\n",file),RET_OK;
00321   
00322   if ( flags & (UPD_F|UPD_A))
00323   {
00324     if (inst) return printf( "upd: %s: Eine Instanz kann keine " +
00325                              "Clones haben.\n",file ), RET_FAIL;
00326     if ((tmp=_update(file, 1,flags))==-1) 
00327       return printf( "upd: %s: Kein Vollzugriff auf die " +
00328                      "Datei erlaubt.\n",file), RET_FAIL;
00329     if (tmp==0) return RET_FAIL;
00330 
00331    tmp=clones(blue[0..<3],2);
00332     if (sizeof(tmp))
00333       call_out( #'_instance_upd/*'*/, 0, file,flags,tmp,sizeof(tmp),1);
00334     else
00335       printf( "upd: %s: Keine Clones vorhanden!\n", blue[0..<3]);
00336 
00337     if ( (flags & UPD_F) && !(flags &(UPD_R|UPD_L|UPD_LOAD))) return RET_OK; 
00338     // Nichts laden -> Auch kein Backup
00339   }
00340 
00341 // Backupraum festlegen
00342    
00343   if( blue==INV_SAVE ) {
00344                                 printf("upd: Achtung: Raum zum Zwischenspeichern soll geladen werden?!\n");
00345                 } 
00346   if ( !(inv_saver=load_object(INV_SAVE)) )
00347   {
00348     printf("upd: %s: Raum zum Zwischenspeichern des " +
00349            "Rauminhalts ist nicht ladbar.\n" +
00350            "         %s\n",file,INV_SAVE);
00351     return RET_FAIL;
00352   }
00353 
00354 // Wenn das Objekt existiert bzw. Deep aktualisiert werden soll
00355 
00356   if ( (!(flags&UPD_LOAD))&&
00357        ((obj = find_object(file)) || (flags & (UPD_M|UPD_I))))
00358   {
00359     object *inv, env, *pl_inv;
00360     mapping pro;
00361     int i;
00362 
00363 // Wenn Objekt existiert, dann Inhalt sichern:
00364     if (obj)  
00365     {
00366       if (!(flags&UPD_D)&&(flags&(UPD_L|UPD_R)))
00367       {
00368         if (i=sizeof(inv=(all_inventory(obj)-({0}))))
00369                 {
00370                   mixed items;
00371                   // Herausbekommen, ob hier Items existieren, die per AddItem 
00372                   // erzeugt werden. Die duerfen nicht gesichert werden.
00373                   items=(mixed)obj->QueryProp(P_ITEMS); // mixed, da array of arrays
00374                   if (pointerp(items)&&sizeof(items))
00375                   {
00376                     items=transpose_array(items)[0];
00377                     while (i--)
00378               if (member(items, inv[i])==-1)
00379                                     inv[i]->move(inv_saver,NO_CHECK);
00380                   }
00381                   else // In diesem Objekt sind keine Items gesetzt.
00382             while (i--) inv[i]->move(inv_saver,NO_CHECK);
00383                 }
00384       }
00385       else
00386         inv=map( deep_inventory(obj), #'_save/*'*/, inv_saver )-({0});
00387       env = environment(obj);
00388       if ( flags & UPD_C ) pro = (mapping)(obj->QueryProperties());
00389     }
00390     else inv = ({});
00391 
00392 // Ererbte Objekte durchsuchen.
00393     if ( flags & (UPD_M|UPD_I) )
00394     {
00395       string *dep;
00396       dep = ({});
00397       _do_make( blue, inst, flags & ~(UPD_M|UPD_L|UPD_R|UPD_F|UPD_A), &dep );
00398       printf( _make_dep( dep, "" ) + "\n" );
00399     }
00400    
00401 // Tatsaechlichen Update durchfuehren
00402    
00403     if ( _update(file, 0, flags)< 0) return RET_FAIL;
00404     msg += (inst ? "zerstoert" : "aktualisiert");
00405     
00406 // Neu laden ??
00407     if ( flags & (UPD_R|UPD_L) )
00408     {
00409       if ( obj = _reload( blue,inst,flags, &err ) )
00410         msg += ", " + (inst ? "neu geclont" : "neu geladen");
00411      
00412 // Neu geladen: Properties wiederherstellen, Closures filtern 
00413       if (!err)
00414       {
00415         if (!obj) obj = find_object(file);
00416         
00417         if ( pro && (flags & UPD_C) )
00418         {
00419           string *names;
00420           
00421           names = m_indices(pro);
00422           
00423           // Closures in (mittlerweile) zerstoerten Objekten
00424           // rausfiltern, damit die (hoffentlich korrekten) Closures
00425           // im neu geclonten Objekt erhalten bleiben
00426           for ( i = sizeof(names); i--; )
00427             if ( _illegal_closure(pro[names[i], F_VALUE]) ||
00428                  _illegal_closure(pro[names[i], F_QUERY_METHOD]) ||
00429                  _illegal_closure(pro[names[i], F_SET_METHOD]) )
00430               efun::m_delete( pro, names[i] );
00431           
00432           obj->SetProperties(pro);
00433           msg += ", Properties gesetzt";
00434         }
00435         
00436         if (env) 
00437           if ( obj->move( env, NO_CHECK ) <= 0 )
00438             printf( "upd: /%O konnte nicht in /%O zurueckbewegt werden\n",
00439                     obj, env );
00440           else
00441             msg += ", bewegt";
00442         
00443         if (i=sizeof(inv))
00444         {
00445           while(i--) if (inv[i]) inv[i]->move(obj, NO_CHECK );
00446           msg += ", Inhalt zurueckbewegt";
00447         }
00448       }
00449       else 
00450         return printf( "upd: %s: %s", file, err ), RET_FAIL;
00451     }
00452   }
00453   else 
00454     if ( !_update(file, 0, flags) && (flags & (UPD_L|UPD_LOAD)) )
00455       if ( !_reload( blue, inst, flags, &err ) )
00456         return printf( "%s: %s: %s", (flags&UPD_LOAD?"load":"upd"),file, err ),
00457           RET_FAIL;
00458       else
00459         msg += "geladen";
00460   
00461   if ( strlen(msg)&&!(flags&UPD_S&&recursive) )
00462     printf("%s: %s: %s.\n",(flags&UPD_LOAD?"load":"upd"),file,msg);
00463   return RET_OK;
00464 }

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

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

private string _make_dep ( mixed  dep,
string  prefix 
)

Definiert in Zeile 249 der Datei upd.c.

Benutzt i.

Wird benutzt von _make().

00250 {
00251   string ret;
00252   int i, size;
00253   
00254   ret="";
00255   size=sizeof(dep);
00256   for (i=0; i<size;i++)
00257     if (pointerp(dep[i]))
00258       ret += _make_dep(dep[i],prefix + (i < (size-1) ? "| ":" "));
00259     else 
00260       ret += prefix + "+-" + dep[i] + "\n";
00261   return ret;
00262 }

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

static mixed* _query_localcmds (  )  [static]

Definiert in Zeile 25 der Datei upd.c.

Benutzt LEARNER_LVL.

00026 {
00027   return ({({"upd","_upd",0,LEARNER_LVL}),
00028            ({"update","_upd",0,LEARNER_LVL}),
00029            ({"Update","_upd",0,LEARNER_LVL}),
00030            ({"load","_load",0,LEARNER_LVL})});
00031 }

private object _reload ( string  file,
int  clone,
int  flags,
string  err 
)

Definiert in Zeile 64 der Datei upd.c.

Benutzt UPD_B.

Wird benutzt von _do_make() und _make().

00065 {
00066   object obj;
00067   
00068   if (!obj=find_object(file[0..<3]+(clone?("#"+clone):"")))
00069   {
00070     int pos,pos2;
00071     string bt;
00072 
00073     if(file_size(file)<0)
00074     {
00075       if (file_size(file)==-1)
00076         err = sprintf("upd: %s: Datei existiert nicht.\n", file);
00077       else // directory
00078         err = sprintf("upd: %s: Verzeichnisse koennen nicht geladen "
00079                       "werden.\n",file);
00080       return obj; // 0
00081     }
00082     pos = max(file_size(__DEBUG_LOG__),0);
00083 
00084     if ((err = (clone?catch(obj = clone_object(file)):
00085                 catch(load_object(file)) )) && (flags & UPD_B)) 
00086     {     
00087       if (( pos2=file_size(__DEBUG_LOG__)) > pos )
00088         err+=sprintf("\nBacktrace:\n%s",
00089                      read_bytes(__DEBUG_LOG__,pos, pos2-pos ));
00090       else
00091         err+=sprintf("\nKEIN BACKTRACE VERFUEGBAR!\n");
00092     }
00093     if (!err&&!obj&&(!obj = find_object(file[0..<3])))
00094       err += sprintf( "upd: %s: Blueprint nach dem Laden zerstoert.\n",file );
00095   }
00096   else
00097     err=sprintf("upd: Objekt existiert schon: %O\n",obj);
00098   return obj;
00099 }

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

static mixed _save ( object  obj,
object  inv_saver 
) [static]

Definiert in Zeile 41 der Datei upd.c.

Benutzt NO_CHECK.

00042 { 
00043     if ( query_once_interactive(obj) )
00044       { 
00045         obj->move( inv_saver, NO_CHECK );
00046         return obj;
00047       }
00048     return 0;
00049 }

static int _upd ( string  cmdline  )  [static]

Definiert in Zeile 470 der Datei upd.c.

Benutzt _unparsed_args(), asynchron(), file_list(), flags, FULLNAME, MODE_UPD, parseargs(), UPD_H, UPD_OPTS und USAGE.

00471 {
00472   int flags;
00473   mixed *args;
00474 
00475   cmdline=_unparsed_args();
00476   args=parseargs(cmdline,&flags,UPD_OPTS,1);
00477   if(flags==-1||!sizeof(args))
00478     return USAGE("upd [-"+UPD_OPTS+"] <datei> [<datei> ..]");
00479   args=file_list(args,MODE_UPD,0,"/");
00480   if(!sizeof(args)) return printf("upd: Keine passende Datei gefunden!\n"),1;
00481 
00482   args=map(args,(: $1[FULLNAME] :))-({0});
00483   
00484   if(!sizeof(args))
00485     return printf("upd: Verzeichnisse koennen nicht aktualisiert werden!\n"),1;
00486   if (query_verb()=="Update") flags|=UPD_H;
00487   asynchron(args,#'_make,flags,0,0);
00488   return 1;
00489 }

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

private varargs int _update ( string  file,
int  dummy,
int  flags 
)

Definiert in Zeile 112 der Datei upd.c.

Benutzt destruct(), err, inv(), IS_ARCH, MAY_READ, MAY_WRITE, ob(), UPD_D und UPD_H.

Wird benutzt von _make().

00113 {
00114   object obj;
00115   string err;
00116   if (!dummy&&!objectp(obj = find_object(file))) return 0;
00117   if (!IS_ARCH(this_object()))
00118   {
00119     if(!MAY_WRITE(file))
00120       return (printf("upd: %s: Keine Schreibrechte!\n",file), -1);
00121     if(!MAY_READ(file)) 
00122       return (printf("upd: %s: Keine Leserechte!\n", file), -1);
00123   }
00124   if (dummy) return 1;
00125   
00126   if ( flags & UPD_D )
00127   {
00128     object *inv;
00129     if (sizeof(inv = deep_inventory(obj)))
00130     {
00131       printf("upd: %s: Entferne Objekte im Inventar\n", file );
00132       if (!(flags&UPD_H))
00133       {
00134         if(err=catch(filter_objects( inv, "remove", 1 )))
00135           printf("upd: %s: Fehlgeschlagen. Grund:\n%s\n",
00136                  file,err);
00137       }
00138       if (sizeof(inv = deep_inventory(obj)))
00139                 filter(inv, function void (object ob)
00140                     {destruct(ob);});
00141     }
00142   }
00143   if (!(flags&UPD_H))
00144   {
00145     if(err = catch(obj->remove()))
00146       printf("upd: %s: remove() fehlgeschlagen. Aufruf von " +
00147              "destruct().\n",file);
00148   }
00149   if(objectp(obj)) destruct(obj);
00150   return 1;
00151 }

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

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

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