On Tue, 6 Apr 1999, Richard P. Bandura wrote: > My coders are attempting to order out wholist by level, higher levs > being on top, sorting down to lower levs. We're unsure of how to do it > really, and we're just screwing around with stuff that works, > forgetting about efficiency (yes, i know, *shudder*). It's not my > project, really, so I can't modify the files, but the constant > crashing of the mud is beginnning to annoy me greatly...so I'm trying > to help out. Here it is, hacky as can be. Ugh. That's a headache. I would just build a sorted array from the linked list using qsort(). int level_comp(const void * a, const void * b) { struct descriptor_data * ap = (struct descriptor_data *) a; struct descriptor_data * bp = (struct descriptor_data *) b; struct char_data * char_a = ap->character; struct char_data * char_b = bp->character; /* Sorts from lowest -> highest, make this "<" to reverse */ if (GET_LEVEL(char_a) > GET_LEVEL(char_b)) return 1; return -1; } . . . int num_connections = 0, i; struct descriptor_data * d, * array; int (*sort_func)(const void *, const void *); for (d = descriptor_list; d; d = d->next) if (!d->connected) /* if they show-up on the who list */ num_connections++; CREATE(array, struct descriptor_data, num_connections); for (d = descriptor_list, i = 0; d; d = d->next, i++) if (!d->connected) /* if they show-up on the who list */ array[i] = *d; if (sort_func) qsort(array, num_connections, sizeof(struct descriptor_list), sort_func); /* display who list from array[] */ . . . This is entirely ugly mailer code, of course. The sort_func variable is used to point to a function we want to use to sort. This allows us to VERY easily change how we sort. For instance, if we had the following sort functions: int who_sort_alphabetical(const void *, const void *); int who_sort_alphabetical_reverse(const void *, const void *); int who_sort_level(const void *, const void *); int who_sort_level_reverse(const void *, const void *); int who_sort_class(const void *, const void *); int who_sort_class_reverse(const void *, const void *); and we wanted to change how we sort based upon arguments given to do_who() we might have, . . . case 's': /* sort */ char blah = *(arg + 2); switch (blah) { case 'a': sort_func = who_sort_alphabetical; break; case 'A': sort_func = who_sort_alphabetical_reverse; break; case 'l': sort_func = who_sort_level; break; case 'L': sort_func = who_sort_level_reverse; break; case 'c': sort_func = who_sort_class; break; case 'C': sort_func = who_sort_class_reverse; break; default: /* report usage message/error */ return; } break; All of this is 100% untested. Use at your own risk. No need to credit me, just please don't take discredit me (that is, don't claim you wrote it). -dak +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST