From: George <greerga@miavx1.acs.muohio.edu>
Subject: Sorted do_who


The basic idea is to add to a linked list only when it finds the current
person is higher level then the lower person on the chain.

--------------------------------------------------------------------------
Add somewhere:

struct who_list {
  char *name;
  int level;
  struct who_list *next;
};

--------------------------------------------------------------------------
in do_who:
Add to definitions:
	struct who_list *who_head = NULL;

Near bottom replace:
	send_to_char(buf, ch);
with:
	who_head = add_to_who(who_head, buf, tch);
(at the place where the sprintf'd string is sent to the user per pc)

Also insert:
  if (short_list && (num_can_see % 4))
    send_to_char("\r\n", ch);
>  if (who_head)
>    output_who(who_head, ch);
  if (num_can_see == 0)
    sprintf(buf, "\r\nNo-one at all!\r\n");

--------------------------------------------------------------------------
Add anywhere:

struct who_list *add_to_who(struct who_list *head, char *str,
        struct char_data *ch)
{
  struct who_list *tmp, *prev = NULL, *to_add = NULL;

  if (str && ch) {
    CREATE(to_add, struct who_list, 1);
    to_add->name = str_dup(str);
    to_add->level = GET_LEVEL(ch);
    to_add->next = NULL;
  } else {
    log("SYSERR: NULL str or ch in add_to_who");
    return NULL;
  }

  if (!head)
    return to_add;

  for (tmp = head; tmp; tmp = tmp->next) {
    if (to_add->level > tmp->level) {   /* ok, add record */
      if (prev)
        prev->next = to_add;
      if (head == tmp)
        head = to_add;
      to_add->next = tmp;
      return head;
    }
    prev = tmp;
  }
  prev->next = to_add;
  return head;
}

void output_who(struct who_list *head, struct char_data *ch)
{
  struct who_list *tmp, *next;

  if (!head) {
    log("SYSERR: output_who: hey, no head?");
    return;
  }

  for (tmp = head; tmp; tmp = next) {
    next = tmp->next;
    send_to_char(tmp->name, ch);

    if (!tmp || !tmp->name)
      log("SYSERR: output_who: trying to free invalid tmp->name");
    else {
      free(tmp->name);
    }
    if (!tmp)
      log("SYSERR: output_who: trying to free invalid tmp struct");
    else {
      free(tmp);
    }
  }
}

That should be everything...I've murdered my do_who with additions.
