ackmud/
ackmud/area/imc/
ackmud/npcs/a/
ackmud/npcs/c/
ackmud/npcs/d/
ackmud/npcs/e/
ackmud/npcs/f/
ackmud/npcs/h/
ackmud/npcs/i/
ackmud/npcs/k/
ackmud/npcs/l/
ackmud/npcs/n/
ackmud/npcs/o/
ackmud/npcs/p/
ackmud/npcs/r/
ackmud/npcs/s/
ackmud/npcs/w/
ackmud/player/c/
ackmud/player/s/
ackmud/player/z/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/*  Output a list of type-frequency pairs from a packet log input.
 *  Currently assumes everything is protocol version 2 (fixme: put in a hook
 *  in imc.c:forward() to pass all packets received to a higher layer)
 */

typedef struct _nametag {
  char *name;
  int freq;
  struct _nametag *next;
} nametag;

nametag *taglist;

/* add a name to taglist, or increase it's frequency */
void addname(const char *name)
{
  nametag *p;

  for (p=taglist; p; p=p->next)
    if (!strcasecmp(p->name, name))
      break;

  if (!p)
  {
    /* allocate new entry */

    p=malloc(sizeof(nametag));
    p->next=taglist;
    p->name=strdup(name);
    p->freq=1;
    taglist=p;
  }
  else
  {
    /* increment freq on existing entry */
    p->freq++;
  }
}

/* Parse a log line */

void parseline(const char *line)
{
  char type[100];

  /*  Format: mudname[desc] dirchar packet
   *
   *  eg:     BV[0] > ....
   *
   *  We want the 4th field in the packet data (packet type)
   */

  sscanf(line, "%*s %*s %*s %*s %*s %99s", type);
  if (type[0])
    addname(type);
}

/* dump nametag list and free it */

void dump(void)
{
  nametag *p, *p_next;

  for (p=taglist; p; p=p_next)
  {
    p_next=p->next;
    printf("%s %d\n", p->name, p->freq);
    free(p->name);
    free(p);
  }
}

int main(int argc, char *argv[])
{
  char line[16000];

  /* read lines from stdin and process them until we run out */

  fgets(line, 16000, stdin);
  while(!feof(stdin))
  {
    parseline(line);
    fgets(line, 16000, stdin);
  }

  /* dump results */

  dump();

  return 0;
}