#include <magier.h>#include <player.h>#include <debug_info.h>#include <wizlevels.h>#include <moving.h>#include <properties.h>#include <logging.h>
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) |
| 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 }


| 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 }


| 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 }

| 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 }


| 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 }

| 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 }

| static mixed _save | ( | object | obj, | |
| object | inv_saver | |||
| ) | [static] |
| 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 }

| 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 }


1.6.3