DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T s

⟦89406cc34⟧ TextFile

    Length: 5703 (0x1647)
    Types: TextFile
    Names: »scores.c«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Wanderer/scores.c« 

TextFile

#include "wand_head.h"

#ifdef	MSDOS	/* M001	*/
#define	LOCK
#define	UNLOCK
#else
#define LOCK while((lock = creat(LOCKPATH,0)) < 0)
#define UNLOCK (void) unlink(LOCKPATH)
#endif

#define ENTRIES 15

#ifndef	MSDOS	/* M001 */
extern int getuid();
#else
#define	 getuid()	0
#endif

extern int saved_game;  /* prevent recording of hiscore if  */
			/* NO_RESTORED_GAME_HISCORES is #def'd */

typedef struct
    {
    char howdead[25];
    char name[20];
    int  score;
    int  level;
    int  uid;
    } score_entry;

#ifdef	LINT_ARGS	/* M001	*/
void show_scores(score_entry *,int );
int readtable(score_entry *);
#else
void show_scores();
int readtable();
#endif

void show_scores(table,num)
score_entry *table;
int         num;
{
int tot = num;
printf("\nNo. Score Level           Names                 How they died\n");
printf("=============================================================================\n");
while(num > 0)
    {
    num--;
    printf("%2d %5d %3d      %-20s     killed by %-s\n",(tot - num),table->score,table->level,table->name,table->howdead);
    table++;
    }
printf("\n\n");
}

int readtable(table_ptr)
score_entry *table_ptr;
{
FILE *fp;
int  numread;
if((fp = fopen(HISCOREPATH,R_BIN)) == NULL)
    {
    numread = 0;
    }
else
    {
    numread = fread( VOIDSTAR table_ptr, sizeof(score_entry), ENTRIES, fp);
    fclose(fp);
    }
return numread;
}

int  savescore(howdead,score,level,name)
char *howdead, *name;
int  score,level;
{
score_entry table[ENTRIES + 2],
	    *table_ptr = table,new_entry,temp_entry;
int  numread,index = 1, numsaved, lock, already = 0, output_value = 1,
     user_id;
FILE *fp;
#ifdef NO_RESTORED_GAME_HISCORES
if(saved_game) {
	printf("No hiscores recorded from restored games.\n");
        printf("\nWanderer (C) 1988  S.Shipway.\n\n");
	return 1;
}
#endif
user_id = getuid();
strncpy(new_entry.howdead,howdead,25);
new_entry.howdead[24] = '\0';	/* M002 strncpy does not null terminate */
strncpy(new_entry.name,name,20);
new_entry.name[19] = '\0';	/* M002 strncpy does not null terminate */
new_entry.score = score;
new_entry.level = level;
new_entry.uid = user_id;
LOCK;
numread = readtable(table_ptr);
if (numread > 0)
    if(table[numread-1].score > 99999)     /* stop system errors messing it up*/
        {
        numread--;
        printf("Erasing spurious entry in table.\n");
        }
if(score == 0)
    {
    show_scores(table,numread);
    UNLOCK;
    return 0;
    }
if (numread > 0)
    {
    numread++; /* scan through until correct insertion point */
    /* pass table entries with higher scores */
    while((table_ptr->score > score)&&(index < numread))
	{
#ifdef	COMPARE_BY_NAME
#define	SAMEUSER(p)	(strcmp((p)->name, name) == 0)
#else
#define	SAMEUSER(p)	((p)->uid == user_id)
#endif
	if(SAMEUSER(table_ptr))
	    {
	    already = 1;
	    break;
	    }
	table_ptr++;
	index++;
	}
    /* pass table entries with equal score but higher or equal level */
    while((table_ptr->level>=level)&&(index<numread)&&(table_ptr->score==score))
	{
	if(SAMEUSER(table_ptr))
	    {
	    already = 1;
	    break;
	    }
	table_ptr++;
	index++;
	}
    /* if already found: done */
    if(already == 1)
	{
	numread--;
	show_scores(table,numread);
	UNLOCK;
	return numread;
	}
    /* shift down score list */
    while(index < numread)
	{
	/* swap *table_ptr and new_entry */
	temp_entry = *table_ptr;
	*table_ptr = new_entry;
	new_entry = temp_entry;
	if(SAMEUSER(&new_entry))
	    {
	    already = 1;
	    numread--; /* an older entry found */
	    break;
	    }
	table_ptr++;
	index++;
	}
    /* if all shifted without finding an older entry */
    if(already==0)
	*table_ptr = new_entry;
    }
else
    {
    printf("\nCreating new hiscore table.\n\n");
    *table_ptr = new_entry;
    numread++;
    }
numread = ( (numread > ENTRIES) ? ENTRIES : numread );
fp = fopen(HISCOREPATH,W_BIN);
table_ptr = table;
numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
chmod(HISCOREPATH,0666);
if(numsaved < numread)
    {
    printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
    output_value = 0;
    }
fclose(fp);
UNLOCK;
show_scores(table,numsaved);
return output_value;
}

void delete_entry(num)
int num;
{
score_entry table[ENTRIES + 22],
	    *table_ptr = table,
	    new_entry,temp_entry;
int  numread,index = 1, numsaved, lock, output_value = 1;
FILE *fp;
LOCK;
numread = readtable(table_ptr);
if (numread == 0) {
    printf("Missing or unreadable hiscore table.\n\n");
    UNLOCK;
    exit(1);
}
if (num > numread) {
    printf("Invalid entry, choose again\n");
    UNLOCK;
    return;
}
while(index < num)
    {
    index++;
    table_ptr++;
    }
while(index < numread)
    {
    index++;
    *table_ptr = *(table_ptr+1);
    table_ptr++;
    }
numread--;
fp = fopen(HISCOREPATH,W_BIN);
table_ptr = table;
numsaved = fwrite( VOIDSTAR table_ptr, sizeof(score_entry), numread, fp);
chmod(HISCOREPATH,0666);
if(numsaved < numread)
    {
    printf("ERROR! Only %d items saved from %d !\n",numsaved,numread);
    output_value = 0;
    }
fclose(fp);
UNLOCK;
show_scores(table,numsaved);
}

erase_scores()
{
int erasenum,numread,index = 0;
char correct[20],c;
score_entry table[ENTRIES + 2],
	    *table_ptr = table;
printf("Please enter password:");
while((c = getchar()) != '\n' && index <19) {
    correct[index++] = c;
    }
correct[index] = 0;
if(strcmp(correct,MASTERPASSWORD))
    {
    printf("\nFoo, charlatan!\n");
    return 0;
    }
numread = readtable(table_ptr);
show_scores(table,numread);
printf("\n");
for(;;)
{
printf("Number to erase (0 to exit): ");
scanf("%d",&erasenum);
printf("\n");
if(erasenum == 0)
    break;
delete_entry(erasenum);
printf("\n");
}
printf("Byee!\n");
}