|
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: 7080 (0x1ba8) Types: TextFile Names: »see.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Spacewar/see.c«
/* * Spacewar - let users see the standings * shows crafts in dbm(3) order, then * shows players and their standings in dbm(3) order * * Copyright 1985 obo Systems, Inc. * Copyright 1985 Dan Rosenblatt */ #ifndef VMS #include <sys/types.h> #include <dbm.h> #else /* BSD SYSIII SYSV */ #include <types.h> #include "dbm.h" #endif /* VMS */ #include "spacewar.h" #include "universe.h" #include "login.h" #include "sys.h" #include "crft.h" #include "plyr.h" struct sstat { char ss_stat; /* C(raft) or P(layer) */ char ss_savkey[32]; /* for nextkey(dbm); kludge */ int ss_savsiz; /* for nextkey(dbm); kludge */ struct pst *ss_lst; /* list of player statistics */ }; struct pst { struct pst *ps_nxt; /* next player */ char ps_name[8+1]; /* player's name */ long ps_tpnts,ps_mpnts; /* total,max points */ time_t ps_ttm,ps_mtm; /* total,max time */ short ps_tkls,ps_mkls; /* total,max kills */ short ps_opnts,ps_otm,ps_okls;/* ordering for points, time, kills */ short ps_ncrfts; /* number of crafts (for avg) */ }; static struct pst zpst; char *malloc(); VOID see(plogin) register struct login *plogin; { struct sstat *psstat; register struct pst *ppst; struct pst *nxtpst; int nlines=6,nc; char buf[80+1]; datum dbmkey,dbmdata; struct crftkey getcrkey; struct crft getcrdat; struct plyrkey getplkey; struct plyr getpldat; #ifdef DEBUG DBG("see(#%d/%s)\n",plogin-loginlst,plogin->ln_name); #endif /**************/ /* first time */ /**************/ if (!(psstat = (struct sstat *)plogin->ln_substat)) { /* allocate and init subtask status structure */ if (!(psstat = (struct sstat *)malloc(sizeof(struct sstat)))) { perror("see: out of memory for sstat"); goto done; } binit((char *)psstat,sizeof(*psstat)); psstat->ss_stat = CRAFT; plogin->ln_substat = (char *)psstat; sprintf(buf,"Output is in groups of %d lines. ",nlines); output(plogin,'C',0,buf); output(plogin,'C',0,"Hit return when ready for more.\n"); output(plogin,'C',0, "A single dot (.) on a line by itself terminates See.\n\n"); plogin->ln_iomode = 'm'; dbmkey = firstkey(); /****************/ /* continuation */ /****************/ } else { dbmkey.dptr = ((dbmkey.dsize = psstat->ss_savsiz) > 0) ? psstat->ss_savkey : NULL; } #ifdef DEBUG VDBG("see: stat '%c'\n",psstat->ss_stat); #endif /* terminate */ if (!strcmp(plogin->ln_input,".")) goto done; /* horrendous */ /*********************************************************/ /* keep getting and displaying the current_state records */ /*********************************************************/ again: while (dbmkey.dptr) { if (dbmkey.dptr[0] == CRAFT && psstat->ss_stat == CRAFT) { bcopy((char *)&getcrkey,dbmkey.dptr,sizeof(getcrkey)); dbmdata = fetch(dbmkey); if (!dbmdata.dptr) { perror("see: can't fetch craft"); goto done; } bcopy((char *)&getcrdat,dbmdata.dptr,dbmdata.dsize); /* find/create player statistics structure */ for (ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) if (!strcmp(ppst->ps_name,getcrkey.cr_plyr)) break; if (!ppst) { if (!(ppst = (struct pst *)malloc(sizeof(struct pst)))) { perror("see: out of memory for pst"); goto done; } binit((char *)ppst,sizeof(*ppst)); ppst->ps_nxt = psstat->ss_lst; psstat->ss_lst = ppst; strcpy(ppst->ps_name,getcrkey.cr_plyr); } /* accumulate statistics */ ppst->ps_tpnts += getcrdat.cr_pnts; ppst->ps_ttm += getcrdat.cr_time; ppst->ps_tkls += getcrdat.cr_kill; if (getcrdat.cr_pnts > ppst->ps_mpnts) ppst->ps_mpnts = getcrdat.cr_pnts; if (getcrdat.cr_time > ppst->ps_mtm) ppst->ps_mtm = getcrdat.cr_time; if (getcrdat.cr_kill > ppst->ps_mkls) ppst->ps_mkls = getcrdat.cr_kill; ppst->ps_ncrfts += 1; /* show */ sprintf(buf,"%-8s %-12s %14ld %14ld %8d\n", getcrkey.cr_plyr,getcrkey.cr_name,getcrdat.cr_pnts, getcrdat.cr_time,getcrdat.cr_kill); output(plogin,'C',0,buf); nlines -= 1; } else if (dbmkey.dptr[0] == PLYR && psstat->ss_stat == PLYR) { bcopy((char *)&getplkey,dbmkey.dptr,sizeof(getplkey)); dbmdata = fetch(dbmkey); if (!dbmdata.dptr) { perror("see: can't fetch plyr"); goto done; } bcopy((char *)&getpldat,dbmdata.dptr,sizeof(getpldat)); /* find player statistics structure */ for (ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) if (!strcmp(ppst->ps_name,getplkey.pl_name)) break; if (!ppst) ppst = &zpst; /* show */ if (!(nc = ppst->ps_ncrfts)) nc = 1; sprintf(buf, "\n%-8s %12d %5ld/%5ld/%2d %5ld/%5ld/%2d %2d/%2d/%2d\n", getplkey.pl_name,ppst->ps_ncrfts, ppst->ps_tpnts/nc,ppst->ps_mpnts,ppst->ps_opnts, ppst->ps_ttm/nc,ppst->ps_mtm,ppst->ps_otm, ppst->ps_tkls/nc,ppst->ps_mkls,ppst->ps_okls); output(plogin,'C',0,buf); sprintf(buf,"%8s (%10d) (%12ld) (%12ld) (%6d)\n","", getpldat.pl_slst,getpldat.pl_plst,getpldat.pl_tlst, getpldat.pl_klst); output(plogin,'C',0,buf); nlines -= 3; } dbmkey = nextkey(dbmkey); /* if output linecount reached, save state */ if (nlines <= 0) { output(plogin,0,0,0); psstat->ss_savsiz = (dbmkey.dptr) ? dbmkey.dsize : 0; bcopy(psstat->ss_savkey,dbmkey.dptr,psstat->ss_savsiz); #ifdef DEBUG VDBG("see return\n"); #endif return; } } /*************************************************/ /* no more dbm records, (possibly) switch states */ /*************************************************/ if (psstat->ss_stat == CRAFT) { /* reset state */ psstat->ss_stat = PLYR; dbmkey = firstkey(); /*************************************************************/ /* compute player's ordering for each of points, time, kills */ /*************************************************************/ nc = 0; do { for (nxtpst=NULL,ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) { if (!ppst->ps_opnts) if (!nxtpst || ppst->ps_mpnts > nxtpst->ps_mpnts) nxtpst = ppst; } if (nxtpst) nxtpst->ps_opnts = ++nc; } while (nxtpst); nc = 0; do { for (nxtpst=NULL,ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) { if (!ppst->ps_otm) if (!nxtpst || ppst->ps_mtm > nxtpst->ps_mtm) nxtpst = ppst; } if (nxtpst) nxtpst->ps_otm = ++nc; } while (nxtpst); nc = 0; do { for (nxtpst=NULL,ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) { if (!ppst->ps_okls) if (!nxtpst || ppst->ps_mkls > nxtpst->ps_mkls) nxtpst = ppst; } if (nxtpst) nxtpst->ps_okls = ++nc; } while (nxtpst); goto again; /* horrendous */ } /*************************************/ /* cleanup - free up allocated space */ /*************************************/ done: for (nxtpst=ppst=psstat->ss_lst;ppst;ppst=nxtpst) { nxtpst = nxtpst->ps_nxt; free((char *)ppst); } free((char *)psstat); plogin->ln_iomode = NULL; plogin->ln_stat = NULL; plogin->ln_substat = NULL; output(plogin,'C',0,PROMPT); output(plogin,0,0,0); #ifdef DEBUG VDBG("see return\n"); #endif }