/* $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: 除了前 MAX_SONGS 首, 剩下不會排序 */ 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) "──" ANSI_COLOR(37) "名次" ANSI_COLOR(36) "──────" ANSI_COLOR(37) "歌" " 名" ANSI_COLOR(36) "───────────" ANSI_COLOR(37) "次數" ANSI_COLOR(36) "" "──" ANSI_COLOR(32) "共%d次" ANSI_COLOR(36) "──" 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); }