/* $Id$ */ #include "bbs.h" #define MAX_SONGS 300 #define QCAST int (*)(const void *, const void *) typedef struct songcmp_t { char name[100]; char cname[100]; int count; } songcmp_t; static int totalcount = 0; static int count_cmp(songcmp_t * b, songcmp_t * a) { return (a->count - b->count); } int topsong(void) { more(FN_TOPSONG, YEA); return 0; } void sortsong(void) { FILE *fo, *fp = fopen(BBSHOME "/" FN_USSONG, "r"); songcmp_t songs[MAX_SONGS + 1]; int n; char buf[256], cbuf[256]; memset(songs, 0, sizeof(songs)); if (!fp) return; if (!(fo = fopen(FN_TOPSONG, "w"))) { fclose(fp); return; } totalcount = 0; /* XXX: ���F�e MAX_SONGS ��, �ѤU���|�Ƨ� */ while (fgets(buf, 200, fp)) { chomp(buf); strip_blank(cbuf, buf); if (!cbuf[0] || !isprint2((int)cbuf[0])) continue; for (n = 0; n < MAX_SONGS && songs[n].name[0]; n++) if (!strcmp(songs[n].cname, cbuf)) break; strlcpy(songs[n].name, buf, sizeof(songs[n].name)); strlcpy(songs[n].cname, cbuf, sizeof(songs[n].cname)); songs[n].count++; totalcount++; } qsort(songs, MAX_SONGS, sizeof(songcmp_t), (QCAST) count_cmp); fprintf(fo, " " ANSI_COLOR(36) "�w�w" ANSI_COLOR(37) "�W��" ANSI_COLOR(36) "�w�w�w�w�w�w" ANSI_COLOR(37) "�q" " �W" ANSI_COLOR(36) "�w�w�w�w�w�w�w�w�w�w�w" ANSI_COLOR(37) "����" ANSI_COLOR(36) "" "�w�w" ANSI_COLOR(32) "�@%d��" ANSI_COLOR(36) "�w�w" ANSI_RESET "\n", totalcount); for (n = 0; n < 100 && songs[n].name[0]; n++) { fprintf(fo, " %5d. %-38.38s %4d " ANSI_COLOR(32) "[%.2f]" ANSI_RESET "\n", n + 1, songs[n].name, songs[n].count, (float)songs[n].count / totalcount); } fclose(fp); fclose(fo); }