/* SillyMUD Distribution V1.1b (c) 1993 SillyMUD Developement See license.doc for distribution terms. SillyMUD is based on DIKUMUD */ #include <stdio.h> #define TRUE 1 #define FALSE 0 #include "protos.h" void SmartStrCpy(char *s1, const char *s2) /* ignore trailing spaces and \n */ { int i; i = strlen(s2); while (s2[i] <= ' ') i--; /* null terminate s1 */ s1[i+1]='\0'; while (i>=0) { s1[i] = s2[i]; i--; } } void StringHeap(char *string, struct StrHeap *Heap) { unsigned char found=FALSE; int i; if (!string || !*string) { return; /* don't bother adding if null string */ } for (i=0;i<Heap->uniq&&!found;i++) { if (!strcmp(string, Heap->str[i].string)) { Heap->str[i].total++; found=TRUE; } } if (!found) { if (Heap->str) { /* increase size by 1 */ Heap->str = (struct StrHeapList *) realloc(Heap->str, sizeof(struct StrHeapList)*Heap->uniq+1); } else { Heap->str = (struct StrHeapList *)malloc(sizeof(struct StrHeapList)); } Heap->str[Heap->uniq].string = (char *)malloc(strlen(string)+1); SmartStrCpy(Heap->str[Heap->uniq].string, string); Heap->str[Heap->uniq].total=1; Heap->uniq++; } } struct StrHeap *InitHeap() { struct StrHeap *Heap=0; Heap = (struct StrHeap *)malloc(sizeof(struct StrHeap)); Heap->str=0; /* Heap->str = (struct StrHeapList *)malloc(sizeof(struct StrHeapList)); Heap->str[0].string=0; Heap->str[0].total=0; */ Heap->uniq=0; return(Heap); } void DisplayStringHeap (struct StrHeap *Heap, struct char_data *ch, int type, int destroy) { char buf[256]; int i; for (i=0; i<Heap->uniq; i++) { if (type != TO_CHAR) { if (Heap->str[i].total > 1) { sprintf(buf, "%s [%d]", Heap->str[i].string, Heap->str[i].total); } else { sprintf(buf, "%s", Heap->str[i].string); } } else { if (Heap->str[i].total > 1) { sprintf(buf, "%s [%d]\n\r", Heap->str[i].string, Heap->str[i].total); } else { sprintf(buf, "%s\n\r", Heap->str[i].string); } } if (type == TO_CHAR) { send_to_char(buf, ch); } else { if (ch->in_room > -1) { act(buf, FALSE, ch, 0, 0, TO_ROOM); } } if (destroy) { /* free everything */ free(Heap->str[i].string); } } if (destroy) { free(Heap->str); free(Heap); } } #if 0 main() { struct StrHeap *H; int i; char buf[256]; H = InitHeap(); for (i=1;i<10;i++) { scanf("%s", buf); StringHeap(buf, H); } DisplayStringHeap(H,0,TRUE); } #endif