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

⟦10c74ef4a⟧ TextFile

    Length: 3305 (0xce9)
    Types: TextFile
    Names: »score.c.orig«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/Sun/Qix/score.c.orig« 

TextFile

/*  SCORE.C  */

#include "qix.h"
#include <sys/fcntl.h>

#define NAMELEN		3

struct scores {
    int score;
    char initials[NAMELEN+1];
    char login[9];
}   top_ten[10];

extern int errno;
extern char *sys_errlist[];
extern char *sprintf();

score_board(Read, names)
{
    struct scores *scp, *temp;
    char buf[BUFSIZ];
    int fd;

    clear_board();

    for (scp = top_ten; scp < &top_ten[10]; scp++) {
	(void) strcpy(scp->initials, "Qix");
	scp->initials[3] = 0;
	(void) strcpy(scp->login, "computer");
#ifdef DEBUG
	scp->score = 0;
#else DEBUG
	scp->score = 30000;
#endif DEBUG
    }

    /* read the top ten file into the array and close the file */
    if ((fd = open(SCOREFILE, O_RDWR)) == -1 ||
	read(fd, (char *) top_ten, sizeof(top_ten)) == -1) {
	msg("No score file:\n%s", sys_errlist[errno]);
	sleep(2);
	remove_msgs(0);
	return;
    }

    /* Print the list */
    if (Read) {
	msg("Top Players:\nScore%24cName\n", ' ');
	for (scp = top_ten; scp < &top_ten[10] && scp->score; scp++) {
	    (void) sprintf(buf, "%7.d%24c%c%c%c  ", scp->score, ' ',
		scp->initials[0], scp->initials[1], scp->initials[2]);
	    if (names)
		(void) strcat(buf, scp->login);
	    msg(buf);
	}
    }
    /* check to see if current score made it */
    else {
	int pos;
	for (pos = 1, scp = top_ten; pos <= 10; scp++, pos++)
	    if (scp->score < score)
		break;
	if (pos <= 10) {
	    char *getlogin(), *login = getlogin();

	    for (temp = &top_ten[9]; temp > scp; temp--)
		*temp = *(temp - 1);
	    scp->score = score;
	    (void) strcpy(scp->login, login);
	    prompt_initials(pos, scp->initials);
	    if (strlen(scp->initials) > 1) {
		(void) lseek(fd, (long)0, 0);
		(void) write(fd, (char *)top_ten, sizeof top_ten);
	    }
	}
    }
    (void) close(fd);
}

char *
ordinate(n)
{
    if (n == 1)
	return "st";
    if (n == 2)
	return "nd";
    if (n == 3)
	return "rd";
    return "th";
}

prompt_initials(pos, buf)
register char *buf;
{
    Event event;
    int x = MID_X - 15 * l_width(big_font);
    int y = 19 * l_height(big_font), len;
    char s[16];

    msg("You attained the %d%s position", pos, ordinate(pos));
    msg("Type initials or use:\nLEFT button to advance one character.");
    msg("MIDDLE button to decrement one character.\n");
    msg("Use RETURN or RIGHT button to enter each letter.");
    msg("Use <backspace> key to go back one position.");
    pw_text(draw_win, x, y, PIX_SRC, big_font, sprintf(s, "%d", score));
    x += 25 * l_width(big_font);
    (void) strcpy(buf, "AAA");

    for (len = 0; len < 3;) {
	pw_text(draw_win, x - len*l_width(big_font), y, PIX_SRC, big_font, buf);
	pw_char(draw_win, x, y, PIX_SRC|PIX_DST, big_font, '_');

	do window_read_event(Draw, &event);
	while (event.ie_code == LOC_MOVE || event.ie_code == LOC_DRAG ||
	       event_is_up(&event));

	switch (event.ie_code) {
	    when 8 : case 127 :
		if (len > 0)
		    len--, x -= l_width(big_font);
	    when '\n' : case '\r' : case MS_RIGHT :
		len++, x += l_width(big_font);
	    when MS_LEFT :
		if (++(buf[len]) < 'A' || buf[len] > 'z')
		    buf[len] = 'A';
	    when MS_MIDDLE :
		if (--(buf[len]) < 'A' || buf[len] > 'z')
		    buf[len] = 'z';
	    otherwise :
		if (isascii(event.ie_code))
		    buf[len] = (char)event.ie_code;
		else
		    printf("%d ", event.ie_code);
	}
    }
}