00001
00002
00003
00004
00005 #include "copyright.h"
00006 #include "config.h"
00007
00008 #include "mudconf.h"
00009 #include "config.h"
00010 #include "db.h"
00011 #include "interface.h"
00012 #include "match.h"
00013 #include "externs.h"
00014 #include "command.h"
00015 #include "flags.h"
00016 #include "powers.h"
00017 #include "misc.h"
00018 #include "alloc.h"
00019
00020 #ifdef MCHECK
00021 #endif
00022
00027 static void bind_and_queue(dbref player, dbref cause, char *action,
00028 char *argstr, char *cargs[], int ncargs,
00029 int number)
00030 {
00031 char *command, *command2;
00032
00033
00034
00035
00036 command = replace_string(BOUND_VAR, argstr, action), command2 =
00037 replace_string(LISTPLACE_VAR, tprintf("%d", number), command);
00038 wait_que(player, cause, 0, NOTHING, 0, command2, cargs, ncargs,
00039 mudstate.global_regs);
00040 free_lbuf(command);
00041 free_lbuf(command2);
00042 }
00043
00047 void do_dolist(dbref player, dbref cause, int key, char *list, char *command,
00048 char *cargs[], int ncargs)
00049 {
00050 char *curr, *objstring, delimiter = ' ';
00051 int number = 0;
00052
00053 if(!list || *list == '\0') {
00054 notify(player,
00055 "That's terrific, but what should I do with the list?");
00056 return;
00057 }
00058 curr = list;
00059
00060 if(key == DOLIST_DELIMIT) {
00061 char *tempstr;
00062
00063 if(strlen((tempstr = parse_to(&curr, ' ', EV_STRIP))) > 1) {
00064 notify(player, "The delimiter must be a single character!");
00065 return;
00066 }
00067 delimiter = *tempstr;
00068 }
00069 while (curr && *curr) {
00070 while (*curr == delimiter)
00071 curr++;
00072 if(*curr) {
00073 number++;
00074 objstring = parse_to(&curr, delimiter, EV_STRIP);
00075 bind_and_queue(player, cause, command, objstring, cargs,
00076 ncargs, number);
00077 }
00078 }
00079 }
00080
00084 void do_find(dbref player, dbref cause, int key, char *name)
00085 {
00086 dbref i, low_bound, high_bound;
00087 char *buff;
00088
00089 if(!payfor(player, mudconf.searchcost)) {
00090 notify_quiet(player, tprintf("You don't have enough %s.",
00091 mudconf.many_coins));
00092 return;
00093 }
00094 parse_range(&name, &low_bound, &high_bound);
00095 for(i = low_bound; i <= high_bound; i++) {
00096 if((Typeof(i) != TYPE_EXIT) && controls(player, i) && (!*name ||
00097 string_match
00098 (PureName(i),
00099 name))) {
00100 buff = unparse_object(player, i, 0);
00101 notify(player, buff);
00102 free_lbuf(buff);
00103 }
00104 }
00105 notify(player, "***End of List***");
00106 }
00107
00111 int get_stats(dbref player, dbref who, STATS * info)
00112 {
00113 dbref i;
00114
00115 info->s_total = 0;
00116 info->s_rooms = 0;
00117 info->s_exits = 0;
00118 info->s_things = 0;
00119 info->s_players = 0;
00120 info->s_garbage = 0;
00121
00122
00123
00124
00125
00126 if(Good_obj(who) && !Controls(player, who) && !Stat_Any(player)) {
00127 notify(player, "Permission denied.");
00128 return 0;
00129 }
00130
00131
00132
00133
00134 if(!payfor(player, mudconf.searchcost)) {
00135 notify_printf(player, "You don't have enough %s.",
00136 mudconf.many_coins);
00137 return 0;
00138 }
00139 DO_WHOLE_DB(i) {
00140 if((who == NOTHING) || (who == Owner(i))) {
00141 info->s_total++;
00142 if(Going(i) && (Typeof(i) != TYPE_ROOM)) {
00143 info->s_garbage++;
00144 continue;
00145 }
00146 switch (Typeof(i)) {
00147 case TYPE_ROOM:
00148 info->s_rooms++;
00149 break;
00150 case TYPE_EXIT:
00151 info->s_exits++;
00152 break;
00153 case TYPE_THING:
00154 info->s_things++;
00155 break;
00156 case TYPE_PLAYER:
00157 info->s_players++;
00158 break;
00159 default:
00160 info->s_garbage++;
00161 }
00162 }
00163 }
00164 return 1;
00165 }
00166
00167
00168
00169
00170 void do_stats(dbref player, dbref cause, int key, char *name)
00171 {
00172 dbref owner;
00173 STATS statinfo;
00174
00175 switch (key) {
00176 case STAT_ALL:
00177 owner = NOTHING;
00178 break;
00179 case STAT_ME:
00180 owner = Owner(player);
00181 break;
00182 case STAT_PLAYER:
00183 if(!(name && *name)) {
00184 notify_printf(player, "The universe contains %d objects.",
00185 mudstate.db_top);
00186 return;
00187 }
00188 owner = lookup_player(player, name, 1);
00189 if(owner == NOTHING) {
00190 notify(player, "Not found.");
00191 return;
00192 }
00193 break;
00194 default:
00195 notify(player, "Illegal combination of switches.");
00196 return;
00197 }
00198
00199 if(!get_stats(player, owner, &statinfo))
00200 return;
00201 notify_printf(player,
00202 "%d objects = %d rooms, %d exits, %d things, %d players. (%d garbage)",
00203 statinfo.s_total, statinfo.s_rooms, statinfo.s_exits,
00204 statinfo.s_things, statinfo.s_players, statinfo.s_garbage);
00205
00206 #ifdef TEST_MALLOC
00207 if(Wizard(player))
00208 notify_printf(player, "Malloc count = %d.", malloc_count);
00209 #endif
00210
00211
00212 #ifdef MCHECK
00213 if(Wizard(player)) {
00214 struct mstats mval;
00215
00216 mval = mstats();
00217 notify_printf(player, "Total size of the heap: %d", mval.bytes_total);
00218 notify_printf(player,
00219 "Chunks allocated: %d -- Total size of allocated chunks: %d",
00220 mval.chunks_used, mval.bytes_used);
00221 notify_printf(player,
00222 "Chunks free: %d -- Total size of free chunks: %d",
00223 mval.chunks_free, mval.bytes_free);
00224 }
00225 #endif
00226
00227
00228 }
00229
00233 int chown_all(dbref from_player, dbref to_player)
00234 {
00235 int i, count, quota_out, quota_in;
00236
00237 if(Typeof(from_player) != TYPE_PLAYER)
00238 from_player = Owner(from_player);
00239 if(Typeof(to_player) != TYPE_PLAYER)
00240 to_player = Owner(to_player);
00241 count = 0;
00242 quota_out = 0;
00243 quota_in = 0;
00244 DO_WHOLE_DB(i) {
00245 if((Owner(i) == from_player) && (Owner(i) != i)) {
00246 switch (Typeof(i)) {
00247 case TYPE_PLAYER:
00248 s_Owner(i, i);
00249 quota_out += mudconf.player_quota;
00250 break;
00251 case TYPE_THING:
00252 s_Owner(i, to_player);
00253 quota_out += mudconf.thing_quota;
00254 quota_in -= mudconf.thing_quota;
00255 break;
00256 case TYPE_ROOM:
00257 s_Owner(i, to_player);
00258 quota_out += mudconf.room_quota;
00259 quota_in -= mudconf.room_quota;
00260 break;
00261 case TYPE_EXIT:
00262 s_Owner(i, to_player);
00263 quota_out += mudconf.exit_quota;
00264 quota_in -= mudconf.exit_quota;
00265 break;
00266 default:
00267 s_Owner(i, to_player);
00268 }
00269 s_Flags(i, (Flags(i) & ~(CHOWN_OK | INHERIT)) | HALT);
00270 count++;
00271 }
00272 }
00273 add_quota(from_player, quota_out);
00274 add_quota(to_player, quota_in);
00275 return count;
00276 }
00277
00282 void do_chownall(dbref player, dbref cause, int key, char *from, char *to)
00283 {
00284 int count;
00285 dbref victim, recipient;
00286
00287 init_match(player, from, TYPE_PLAYER);
00288 match_neighbor();
00289 match_absolute();
00290 match_player();
00291 if((victim = noisy_match_result()) == NOTHING)
00292 return;
00293
00294 if((to != NULL) && *to) {
00295 init_match(player, to, TYPE_PLAYER);
00296 match_neighbor();
00297 match_absolute();
00298 match_player();
00299 if((recipient = noisy_match_result()) == NOTHING)
00300 return;
00301 } else {
00302 recipient = player;
00303 }
00304
00305 count = chown_all(victim, recipient);
00306 if(!Quiet(player)) {
00307 notify_printf(player, "%d objects @chowned.", count);
00308 }
00309 }
00310
00311 #define ANY_OWNER -2
00312
00313 void er_mark_disabled(dbref player)
00314 {
00315 notify(player,
00316 "The mark commands are not allowed while DB cleaning is enabled.");
00317 notify(player,
00318 "Use the '@disable cleaning' command to disable automatic cleaning.");
00319 notify(player,
00320 "Remember to '@unmark_all' before re-enabling automatic cleaning.");
00321 }
00322
00327 int search_setup(dbref player, char *searchfor, SEARCH * parm)
00328 {
00329 char *pname, *searchtype, *t;
00330 int err;
00331
00332
00333
00334
00335
00336 pname = parse_to(&searchfor, '=', EV_STRIP_TS);
00337 if(!pname || !*pname) {
00338 pname = (char *) "me";
00339 } else
00340 for(t = pname; *t; t++) {
00341 if(isupper(*t))
00342 *t = tolower(*t);
00343 }
00344
00345 if(searchfor && *searchfor) {
00346 searchtype = (char *) rindex(pname, ' ');
00347 if(searchtype) {
00348 *searchtype++ = '\0';
00349 } else {
00350 searchtype = pname;
00351 pname = (char *) "";
00352 }
00353 } else {
00354 searchtype = (char *) "";
00355 }
00356
00357
00358
00359
00360
00361 if(*pname == '\"') {
00362 err = strlen(pname) - 1;
00363 if(pname[err] == '"') {
00364 pname[err] = '\0';
00365 pname++;
00366 }
00367 }
00368
00369
00370
00371
00372 parse_range(&searchfor, &parm->low_bound, &parm->high_bound);
00373
00374
00375
00376
00377
00378 parm->s_owner = Owner(player);
00379 parm->s_wizard = Search(player);
00380 parm->s_rst_owner = NOTHING;
00381 if(!*pname) {
00382 parm->s_rst_owner = parm->s_wizard ? ANY_OWNER : player;
00383 } else if(pname[0] == '#') {
00384 parm->s_rst_owner = atoi(&pname[1]);
00385 if(!Good_obj(parm->s_rst_owner))
00386 parm->s_rst_owner = NOTHING;
00387 else if(Typeof(parm->s_rst_owner) != TYPE_PLAYER)
00388 parm->s_rst_owner = NOTHING;
00389
00390 } else if(strcmp(pname, "me") == 0) {
00391 parm->s_rst_owner = player;
00392 } else {
00393 parm->s_rst_owner = lookup_player(player, pname, 1);
00394 }
00395
00396 if(parm->s_rst_owner == NOTHING) {
00397 notify_printf(player, "%s: No such player", pname);
00398 return 0;
00399 }
00400
00401
00402
00403
00404 err = 0;
00405 parm->s_rst_name = NULL;
00406 parm->s_rst_eval = NULL;
00407 parm->s_rst_type = NOTYPE;
00408 parm->s_parent = NOTHING;
00409 parm->s_zone = NOTHING;
00410 parm->s_fset.word1 = 0;
00411 parm->s_fset.word2 = 0;
00412 parm->s_fset.word3 = 0;
00413 parm->s_pset.word1 = 0;
00414 parm->s_pset.word2 = 0;
00415
00416 switch (searchtype[0]) {
00417 case '\0':
00418
00419
00420 break;
00421 case 'e':
00422 if(string_prefix("exits", searchtype)) {
00423 parm->s_rst_name = searchfor;
00424 parm->s_rst_type = TYPE_EXIT;
00425 } else if(string_prefix("evaluate", searchtype)) {
00426 parm->s_rst_eval = searchfor;
00427 } else if(string_prefix("eplayer", searchtype)) {
00428 parm->s_rst_type = TYPE_PLAYER;
00429 parm->s_rst_eval = searchfor;
00430 } else if(string_prefix("eroom", searchtype)) {
00431 parm->s_rst_type = TYPE_ROOM;
00432 parm->s_rst_eval = searchfor;
00433 } else if(string_prefix("eobject", searchtype)) {
00434 parm->s_rst_type = TYPE_THING;
00435 parm->s_rst_eval = searchfor;
00436 } else if(string_prefix("ething", searchtype)) {
00437 parm->s_rst_type = TYPE_THING;
00438 parm->s_rst_eval = searchfor;
00439 } else if(string_prefix("eexit", searchtype)) {
00440 parm->s_rst_type = TYPE_EXIT;
00441 parm->s_rst_eval = searchfor;
00442 } else {
00443 err = 1;
00444 }
00445 break;
00446 case 'f':
00447 if(string_prefix("flags", searchtype)) {
00448
00449
00450
00451
00452
00453
00454 if(!convert_flags(player, searchfor, &parm->s_fset,
00455 &parm->s_rst_type))
00456 return 0;
00457 } else {
00458 err = 1;
00459 }
00460 break;
00461 case 'n':
00462 if(string_prefix("name", searchtype)) {
00463 parm->s_rst_name = searchfor;
00464 } else {
00465 err = 1;
00466 }
00467 break;
00468 case 'o':
00469 if(string_prefix("objects", searchtype)) {
00470 parm->s_rst_name = searchfor;
00471 parm->s_rst_type = TYPE_THING;
00472 } else {
00473 err = 1;
00474 }
00475 break;
00476 case 'p':
00477 if(string_prefix("players", searchtype)) {
00478 parm->s_rst_name = searchfor;
00479 parm->s_rst_type = TYPE_PLAYER;
00480 if(!*pname)
00481 parm->s_rst_owner = ANY_OWNER;
00482 } else if(string_prefix("parent", searchtype)) {
00483 parm->s_parent = match_controlled(player, searchfor);
00484 if(!Good_obj(parm->s_parent))
00485 return 0;
00486 if(!*pname)
00487 parm->s_rst_owner = ANY_OWNER;
00488 } else if(string_prefix("power", searchtype)) {
00489 if(!decode_power(player, searchfor, &parm->s_pset))
00490 return 0;
00491 } else {
00492 err = 1;
00493
00494 }
00495 break;
00496 case 'r':
00497 if(string_prefix("rooms", searchtype)) {
00498 parm->s_rst_name = searchfor;
00499 parm->s_rst_type = TYPE_ROOM;
00500 } else {
00501 err = 1;
00502 }
00503 break;
00504 case 't':
00505 if(string_prefix("type", searchtype)) {
00506 if(searchfor[0] == '\0')
00507 break;
00508 if(string_prefix("rooms", searchfor))
00509 parm->s_rst_type = TYPE_ROOM;
00510 else if(string_prefix("exits", searchfor))
00511 parm->s_rst_type = TYPE_EXIT;
00512 else if(string_prefix("objects", searchfor))
00513 parm->s_rst_type = TYPE_THING;
00514 else if(string_prefix("things", searchfor))
00515 parm->s_rst_type = TYPE_THING;
00516 else if(string_prefix("garbage", searchfor))
00517 parm->s_rst_type = TYPE_GARBAGE;
00518 else if(string_prefix("players", searchfor)) {
00519 parm->s_rst_type = TYPE_PLAYER;
00520 if(!*pname)
00521 parm->s_rst_owner = ANY_OWNER;
00522 } else {
00523 notify_printf(player, "%s: unknown type", searchfor);
00524 return 0;
00525 }
00526 } else if(string_prefix("things", searchtype)) {
00527 parm->s_rst_name = searchfor;
00528 parm->s_rst_type = TYPE_THING;
00529 } else {
00530 err = 1;
00531 }
00532 break;
00533 case 'z':
00534 if(string_prefix("zone", searchtype)) {
00535 parm->s_zone = match_controlled(player, searchfor);
00536 if(!Good_obj(parm->s_zone))
00537 return 0;
00538 if(!*pname)
00539 parm->s_rst_owner = ANY_OWNER;
00540 } else {
00541 err = 1;
00542
00543 }
00544 break;
00545 default:
00546 err = 1;
00547 }
00548
00549 if(err) {
00550 notify_printf(player, "%s: unknown class", searchtype);
00551 return 0;
00552 }
00553
00554
00555
00556
00557 if(!parm->s_wizard && (parm->s_rst_type != TYPE_PLAYER) &&
00558 (parm->s_rst_owner != player) && (parm->s_rst_owner != ANY_OWNER)) {
00559 notify(player, "You need a search warrant to do that!");
00560 return 0;
00561 }
00562
00563
00564
00565
00566 if(!payfor(player, mudconf.searchcost)) {
00567 notify_printf(player,
00568 "You don't have enough %s to search. (You need %d)",
00569 mudconf.many_coins, mudconf.searchcost);
00570 return 0;
00571 }
00572 return 1;
00573 }
00574
00575 void search_perform(dbref player, dbref cause, SEARCH * parm)
00576 {
00577 FLAG thing1flags, thing2flags, thing3flags;
00578 POWER thing1powers, thing2powers;
00579 dbref thing;
00580 char *buff, *buff2, *result, *bp, *str;
00581 int save_invk_ctr;
00582
00583 buff = alloc_sbuf("search_perform.num");
00584 save_invk_ctr = mudstate.func_invk_ctr;
00585
00586 for(thing = parm->low_bound; thing <= parm->high_bound; thing++) {
00587 mudstate.func_invk_ctr = save_invk_ctr;
00588
00589
00590
00591
00592
00593 if((parm->s_rst_type != NOTYPE) &&
00594 (parm->s_rst_type != Typeof(thing)))
00595 continue;
00596
00597
00598
00599
00600
00601 if((parm->s_rst_owner != ANY_OWNER) &&
00602 (parm->s_rst_owner != Owner(thing)))
00603 continue;
00604
00605
00606
00607
00608
00609 if((parm->s_parent != NOTHING) && (parm->s_parent != Parent(thing)))
00610 continue;
00611
00612
00613
00614
00615
00616 if((parm->s_zone != NOTHING) && (parm->s_zone != Zone(thing)))
00617 continue;
00618
00619
00620
00621
00622
00623 thing3flags = Flags3(thing);
00624 thing2flags = Flags2(thing);
00625 thing1flags = Flags(thing);
00626 if((thing1flags & parm->s_fset.word1) != parm->s_fset.word1)
00627 continue;
00628 if((thing2flags & parm->s_fset.word2) != parm->s_fset.word2)
00629 continue;
00630 if((thing3flags & parm->s_fset.word3) != parm->s_fset.word3)
00631 continue;
00632
00633
00634
00635
00636
00637 thing1powers = Powers(thing);
00638 thing2powers = Powers2(thing);
00639 if((thing1powers & parm->s_pset.word1) != parm->s_pset.word1)
00640 continue;
00641 if((thing2powers & parm->s_pset.word2) != parm->s_pset.word2)
00642 continue;
00643
00644
00645
00646
00647
00648 if(parm->s_rst_name != NULL) {
00649 if(!string_prefix((char *) PureName(thing), parm->s_rst_name))
00650 continue;
00651 }
00652
00653
00654
00655
00656 if(parm->s_rst_eval != NULL) {
00657 if(Typeof(thing) == TYPE_GARBAGE)
00658 continue;
00659 sprintf(buff, "#%d", thing);
00660 buff2 = replace_string(BOUND_VAR, buff, parm->s_rst_eval);
00661 result = bp = alloc_lbuf("search_perform");
00662 str = buff2;
00663 exec(result, &bp, 0, player, cause,
00664 EV_FCHECK | EV_EVAL | EV_NOTRACE, &str, (char **) NULL, 0);
00665 *bp = '\0';
00666 free_lbuf(buff2);
00667 if(!*result || !xlate(result)) {
00668 free_lbuf(result);
00669 continue;
00670 }
00671 free_lbuf(result);
00672 }
00673
00674
00675
00676
00677 olist_add(thing);
00678 }
00679 free_sbuf(buff);
00680 mudstate.func_invk_ctr = save_invk_ctr;
00681 }
00682
00683 void do_search(dbref player, dbref cause, int key, char *arg)
00684 {
00685 int flag, destitute;
00686 int rcount, ecount, tcount, pcount, gcount;
00687 char *buff, *outbuf, *bp;
00688 dbref thing, from, to;
00689 SEARCH searchparm;
00690
00691 if(!search_setup(player, arg, &searchparm))
00692 return;
00693 olist_push();
00694 search_perform(player, cause, &searchparm);
00695 destitute = 1;
00696
00697 outbuf = alloc_lbuf("do_search.outbuf");
00698
00699 rcount = ecount = tcount = pcount = gcount = 0;
00700
00701
00702
00703
00704 if(searchparm.s_rst_type == TYPE_ROOM || searchparm.s_rst_type == NOTYPE) {
00705 flag = 1;
00706 for(thing = olist_first(); thing != NOTHING; thing = olist_next()) {
00707 if(Typeof(thing) != TYPE_ROOM)
00708 continue;
00709 if(flag) {
00710 flag = 0;
00711 destitute = 0;
00712 notify(player, "\nROOMS:");
00713 }
00714 buff = unparse_object(player, thing, 0);
00715 notify(player, buff);
00716 free_lbuf(buff);
00717 rcount++;
00718 }
00719 }
00720
00721
00722
00723 if(searchparm.s_rst_type == TYPE_EXIT || searchparm.s_rst_type == NOTYPE) {
00724 flag = 1;
00725 for(thing = olist_first(); thing != NOTHING; thing = olist_next()) {
00726 if(Typeof(thing) != TYPE_EXIT)
00727 continue;
00728 if(flag) {
00729 flag = 0;
00730 destitute = 0;
00731 notify(player, "\nEXITS:");
00732 }
00733 from = Exits(thing);
00734 to = Location(thing);
00735
00736 bp = outbuf;
00737 buff = unparse_object(player, thing, 0);
00738 safe_str(buff, outbuf, &bp);
00739 free_lbuf(buff);
00740
00741 safe_str((char *) " [from ", outbuf, &bp);
00742 buff = unparse_object(player, from, 0);
00743 safe_str(((from == NOTHING) ? "NOWHERE" : buff), outbuf, &bp);
00744 free_lbuf(buff);
00745
00746 safe_str((char *) " to ", outbuf, &bp);
00747 buff = unparse_object(player, to, 0);
00748 safe_str(((to == NOTHING) ? "NOWHERE" : buff), outbuf, &bp);
00749 free_lbuf(buff);
00750
00751 safe_chr(']', outbuf, &bp);
00752 *bp = '\0';
00753 notify(player, outbuf);
00754 ecount++;
00755 }
00756 }
00757
00758
00759
00760 if(searchparm.s_rst_type == TYPE_THING || searchparm.s_rst_type == NOTYPE) {
00761 flag = 1;
00762 for(thing = olist_first(); thing != NOTHING; thing = olist_next()) {
00763 if(Typeof(thing) != TYPE_THING)
00764 continue;
00765 if(flag) {
00766 flag = 0;
00767 destitute = 0;
00768 notify(player, "\nOBJECTS:");
00769 }
00770 bp = outbuf;
00771 buff = unparse_object(player, thing, 0);
00772 safe_str(buff, outbuf, &bp);
00773 free_lbuf(buff);
00774
00775 safe_str((char *) " [owner: ", outbuf, &bp);
00776 buff = unparse_object(player, Owner(thing), 0);
00777 safe_str(buff, outbuf, &bp);
00778 free_lbuf(buff);
00779
00780 safe_chr(']', outbuf, &bp);
00781 *bp = '\0';
00782 notify(player, outbuf);
00783 tcount++;
00784 }
00785 }
00786
00787
00788
00789 if(searchparm.s_rst_type == TYPE_GARBAGE ||
00790 searchparm.s_rst_type == NOTYPE) {
00791 flag = 1;
00792 for(thing = olist_first(); thing != NOTHING; thing = olist_next()) {
00793 if(Typeof(thing) != TYPE_GARBAGE)
00794 continue;
00795 if(flag) {
00796 flag = 0;
00797 destitute = 0;
00798 notify(player, "\nGARBAGE:");
00799 }
00800 bp = outbuf;
00801 buff = unparse_object(player, thing, 0);
00802 safe_str(buff, outbuf, &bp);
00803 free_lbuf(buff);
00804
00805 safe_str((char *) " [owner: ", outbuf, &bp);
00806 buff = unparse_object(player, Owner(thing), 0);
00807 safe_str(buff, outbuf, &bp);
00808 free_lbuf(buff);
00809
00810 safe_chr(']', outbuf, &bp);
00811 *bp = '\0';
00812 notify(player, outbuf);
00813 gcount++;
00814 }
00815 }
00816
00817
00818
00819 if(searchparm.s_rst_type == TYPE_PLAYER ||
00820 searchparm.s_rst_type == NOTYPE) {
00821 flag = 1;
00822 for(thing = olist_first(); thing != NOTHING; thing = olist_next()) {
00823 if(Typeof(thing) != TYPE_PLAYER)
00824 continue;
00825 if(flag) {
00826 flag = 0;
00827 destitute = 0;
00828 notify(player, "\nPLAYERS:");
00829 }
00830 bp = outbuf;
00831 buff = unparse_object(player, thing, 0);
00832 safe_str(buff, outbuf, &bp);
00833 free_lbuf(buff);
00834 if(searchparm.s_wizard) {
00835 safe_str((char *) " [location: ", outbuf, &bp);
00836 buff = unparse_object(player, Location(thing), 0);
00837 safe_str(buff, outbuf, &bp);
00838 free_lbuf(buff);
00839 safe_chr(']', outbuf, &bp);
00840 }
00841 *bp = '\0';
00842 notify(player, outbuf);
00843 pcount++;
00844 }
00845 }
00846
00847
00848
00849
00850 if(destitute) {
00851 notify(player, "Nothing found.");
00852 } else {
00853 sprintf(outbuf,
00854 "\nFound: Rooms...%d Exits...%d Objects...%d Players...%d Garbage...%d",
00855 rcount, ecount, tcount, pcount, gcount);
00856 notify(player, outbuf);
00857 }
00858 free_lbuf(outbuf);
00859 olist_pop();
00860 }
00861
00870 void olist_push(void)
00871 {
00872 OLSTK *ol;
00873
00874 ol = (OLSTK *) XMALLOC(sizeof(OLSTK), "olist_push");
00875 ol->next = mudstate.olist;
00876 mudstate.olist = ol;
00877
00878 ol->head = NULL;
00879 ol->tail = NULL;
00880 ol->cblock = NULL;
00881 ol->count = 0;
00882 ol->citm = 0;
00883 }
00884
00888 void olist_pop(void)
00889 {
00890 OLSTK *ol;
00891 OBLOCK *op, *onext;
00892
00893 ol = mudstate.olist->next;
00894
00895 for(op = mudstate.olist->head; op != NULL; op = onext) {
00896 onext = op->next;
00897 free_lbuf(op);
00898 }
00899 XFREE(mudstate.olist, "olist_pop");
00900 mudstate.olist = ol;
00901 }
00902
00906 void olist_add(dbref item)
00907 {
00908 OBLOCK *op;
00909
00910 if(!mudstate.olist->head) {
00911 op = (OBLOCK *) alloc_lbuf("olist_add.first");
00912 mudstate.olist->head = mudstate.olist->tail = op;
00913 mudstate.olist->count = 0;
00914 op->next = NULL;
00915 } else if(mudstate.olist->count >= OBLOCK_SIZE) {
00916 op = (OBLOCK *) alloc_lbuf("olist_add.next");
00917 mudstate.olist->tail->next = op;
00918 mudstate.olist->tail = op;
00919 mudstate.olist->count = 0;
00920 op->next = NULL;
00921 } else {
00922 op = mudstate.olist->tail;
00923 }
00924 op->data[mudstate.olist->count++] = item;
00925 }
00926
00930 dbref olist_first(void)
00931 {
00932 if(!mudstate.olist->head)
00933 return NOTHING;
00934 if((mudstate.olist->head == mudstate.olist->tail) &&
00935 (mudstate.olist->count == 0))
00936 return NOTHING;
00937 mudstate.olist->cblock = mudstate.olist->head;
00938 mudstate.olist->citm = 0;
00939 return mudstate.olist->cblock->data[mudstate.olist->citm++];
00940 }
00941
00942 dbref olist_next(void)
00943 {
00944 dbref thing;
00945
00946 if(!mudstate.olist->cblock)
00947 return NOTHING;
00948 if((mudstate.olist->cblock == mudstate.olist->tail) &&
00949 (mudstate.olist->citm >= mudstate.olist->count))
00950 return NOTHING;
00951 thing = mudstate.olist->cblock->data[mudstate.olist->citm++];
00952 if(mudstate.olist->citm >= OBLOCK_SIZE) {
00953 mudstate.olist->cblock = mudstate.olist->cblock->next;
00954 mudstate.olist->citm = 0;
00955 }
00956 return thing;
00957 }