diff options
Diffstat (limited to 'mbbsd/topsong.c')
-rw-r--r-- | mbbsd/topsong.c | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/mbbsd/topsong.c b/mbbsd/topsong.c new file mode 100644 index 00000000..d3a65447 --- /dev/null +++ b/mbbsd/topsong.c @@ -0,0 +1,79 @@ +/* $Id: topsong.c,v 1.1 2002/03/07 15:13:48 in2 Exp $ */ +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <sys/types.h> +#include "config.h" +#include "pttstruct.h" +#include "common.h" +#include "proto.h" + +#define MAX_SONGS 300 +#define QCAST int (*)(const void *, const void *) + +typedef struct songcmp_t { + char name[100]; + char cname[100]; + long int count; +} songcmp_t; + +static long int totalcount=0; + +static int count_cmp(songcmp_t *b, songcmp_t *a) { + return (a->count - b->count); +} + +int topsong() { + more(FN_TOPSONG,YEA); + return 0; +} + +static int strip_blank(char *cbuf, char *buf) { + for(; *buf; buf++) + if(*buf != ' ') + *cbuf++ = *buf; + *cbuf = 0; + return 0; +} + +void sortsong() { + 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; + while(fgets(buf, 200, fp)) { + strtok(buf, "\n\r"); + strip_blank(cbuf, buf); + if(!cbuf[0] || !isprint2(cbuf[0])) + continue; + + for(n = 0; n < MAX_SONGS && songs[n].name[0]; n++) + if(!strcmp(songs[n].cname,cbuf)) + break; + strcpy(songs[n].name, buf); + strcpy(songs[n].cname, cbuf); + songs[n].count++; + totalcount++; + } + qsort(songs, MAX_SONGS, sizeof(songcmp_t), (QCAST)count_cmp); + fprintf(fo, + " \033[36m──\033[37m名次\033[36m──────\033[37m歌" + " 名\033[36m───────────\033[37m次數\033[36m" + "──\033[32m共%ld次\033[36m──\033[m\n", totalcount); + for(n = 0; n < 100 && songs[n].name[0]; n++) { + fprintf(fo, " %5d. %-38.38s %4ld \033[32m[%.2f]\033[m\n", n + 1, + songs[n].name, songs[n].count, + (float)songs[n].count/totalcount); + } + fclose(fp); + fclose(fo); +} |