|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 2999 (0xbb7) Types: TextFile Names: »score.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Cent/score.c«
#include "cent.h" struct score { char name[10]; long score; int board; }; err() { perror("bad score file"); exit(-1); } doscores() { register int fd,wr,numscores,i,putin = 0,rank = 0; struct stat buf; struct score *scores, myscore; FILE *morefp; if (stat(scorefile,&buf) == -1) err(); lockscore(); if (buf.st_size % sizeof(struct score) != 0) { printf("Bad score file format\n"); exit(-1); } numscores = buf.st_size / sizeof(struct score); scores = (struct score *)malloc(buf.st_size); strcpy(myscore.name,name); myscore.score = score; myscore.board = board; if ((fd = open(scorefile,0)) == -1) err(); if (read(fd,scores,buf.st_size) == -1) err(); close(fd); if (wr = needtowrite(scores,numscores,&myscore)) if ((fd = creat(scorefile,0600)) == -1) err(); if ((morefp = popen("/usr/ucb/more","w")) == NULL) { perror("Error popen'ing more"); exit(1); } printf("Centipede Hall of Fame\n"); signal(SIGPIPE,SIG_IGN); fprintf(morefp,"Rank Score Board Name\n"); for (i = 0; i < numscores; i++) { if (!putin && score > scores[i].score) { putin = 1; prscore(&myscore,++rank,wr,fd,morefp); } if (!putin || strcmp(scores[i].name,myscore.name)) { prscore(&scores[i],++rank,wr,fd,morefp); if (!strcmp(scores[i].name,myscore.name)) putin = 1; } } if (!putin) prscore(&myscore,++rank,wr,fd,morefp); close(fd); pclose(morefp); signal(SIGPIPE,SIG_DFL); unlockscore(); } prscore(sc,rank,wr,fd,morefp) struct score *sc; int rank,wr,fd; FILE *morefp; { if (wr) write(fd,sc,sizeof(struct score)); fprintf(morefp,"%-4d %-10s %-5d %-s\n",rank,addcommas(sc->score),sc->board, sc->name); } needtowrite(sc,num,myscore) struct score *sc, *myscore; int num; { for (; num--; sc++) if (!strcmp(sc->name,myscore->name)) return(score > sc->score); return(1); } showscores() { struct score sc; register int fd,rank = 0; FILE *morefp; lockscore(); if ((fd = open(scorefile,0)) == -1) err(); if ((morefp = popen("/usr/ucb/more","w")) == NULL) { perror("Error popen'ing more"); exit(1); } printf("Centipede Hall of Fame\n"); fprintf(morefp,"Rank Score Board Name\n"); while (read(fd,&sc,sizeof(struct score))) prscore(&sc,++rank,0,0,morefp); close(fd); pclose(morefp); unlockscore(); exit(0); } /* lockscore and unlockscore: routines for controlling access to score file */ int lockfd; lockscore() { struct stat buf; while (stat(lockfile,&buf) != -1) { char ch; printf("Score file busy. Wait? "); scanf("%c",&ch); if (ch == 'n' || ch == 'N') exit(-1); sleep(1); } if ((lockfd = creat(lockfile,0444)) == -1) { perror("Error opening lockfile"); exit(-1); } } unlockscore() { close(lockfd); if (unlink(lockfile) == -1) { perror("Error removing lockfile"); exit(-1); } }