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 l

⟦81fb96aa4⟧ TextFile

    Length: 6257 (0x1871)
    Types: TextFile
    Names: »logging.c«

Derivation

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

TextFile

#include "challenge.h"

record(player, card)
    int player, card;
{
    int i;

    if(move_logged == 0) {
	record_start();
	if(start_player == HUMAN) {
	    fprintf(logfile, "\nH:");
	    for(i = 0; i < size2; i++) {
		record_card(s_human[i]);
	    }
	    fprintf(logfile, "\nC:");
	    for(i = 0; i < size2; i++) {
		record_card(s_computer[i]);
	    }
	} else {
	    fprintf(logfile, "\nC:");
	    for(i = 0; i < size2; i++) {
		record_card(s_computer[i]);
	    }
	    fprintf(logfile, "\nH:");
	    for(i = 0; i < size2; i++) {
		record_card(s_human[i]);
	    }
	}
    }
    for(i = move_logged; i < nr_moves; i++) {
	if((i & 1) == 0) {
	    fprintf(logfile, "\n%3d.", i / 2 + 1);
	}
	record_card(moves[i]);
    }
    move_logged = nr_moves;
    if(((player == COMPUTER) && (nr_computer == 1)) ||
       ((player == HUMAN ) && (nr_human == 1))) {
	if(moves[nr_moves - 1] != PICK_UP) {
	    fprintf(logfile, " and wins");
	}
    }
}

record_card(card)
    int card;
{
    int value, suit;

    if(card == PICK_UP) {
	fprintf(logfile, " pu");
	return(0);
    }
    if(card == PASS) {
	fprintf(logfile, " --");
	return(0);
    }
    if(card == RESIGN) {
	fprintf(logfile, " resigns");
	return(0);
    }
    if(card == DRAWN) {
	fprintf(logfile, " draw");
	return(0);
    }
    if(card == WIN) {
	fprintf(logfile, " wins");
	return(0);
    }
    value = VALUE(card);
    suit = SUIT(card);
    fprintf(logfile, " %c%c", "AKQJX98765432"[value], "scdh"[suit]);
}

record_start()
{
    fprintf(logfile, "*S%d,D%d*", size, depth);
}

record_end()
{
    fprintf(logfile, "\n*E*\n");
}

record_stop()
{
    if(move_logged != 0) {
	fprintf(logfile, "\n*X*\n");
    }
    logfile = NULL;
}

open_log()
{
    if(old_logfile == NULL) {
	logfile = fopen("challenge.log", "w");
	old_logfile = logfile;
    } else {
	logfile = old_logfile;
    }
}

read_game()
{
    int c, c1, player;

again:
    nr_moves = 0;
    c = fgetc(logfile);
    if(c == EOF) {
	move(COMMAND_LINE, 1);
	printw("no more games on this file");
	quit();
    }
    if(c != '*') {
	invalid_file();
    }
    c = fgetc(logfile);
    if(c != 'S') {
	invalid_file();
    }
    c = fgetc(logfile);
    if(c < '1' || c > '8') {
	invalid_file();
    }
    size = c - '0';
    c = fgetc(logfile);
    if(c != ',') {
	invalid_file();
    }
    c = fgetc(logfile);
    if(c != 'D') {
	invalid_file();
    }
    c = fgetc(logfile);
    depth = 0;
    while(c >= '0' && c <= '9') {
	depth = depth * 10 + depth;
	c = fgetc(logfile);
    }
    if(c != '*') {
	invalid_file();
    }
    c = fgetc(logfile);
    if(c != '\n') {
	invalid_file();
    }
    c = fgetc(logfile);
    if(c != 'C' && c != 'H') {
	invalid_file();
    }
    c1 = fgetc(logfile);
    if(c1 != ':') {
	invalid_file();
    }
    nr_human = 0;
    nr_computer = 0;
    nr_table = 0;
    top = -1;
    if(c == 'C') {
	read_hand(computer, &nr_computer);
	c = fgetc(logfile);
	if(c != 'H') {
	    invalid_file();
	}
	c = fgetc(logfile);
	if(c != ':') {
	    invalid_file();
	}
	read_hand(human, &nr_human);
	start_player = COMPUTER;
    } else {
	read_hand(human, &nr_human);
	c = fgetc(logfile);
	if(c != 'C') {
	    invalid_file();
	}
	c = fgetc(logfile);
	if(c != ':') {
	    invalid_file();
	}
	read_hand(computer, &nr_computer);
	start_player = COMPUTER;
    }
    player = start_player;
    for(;;) {
	if(fgetc(logfile) == '*') {
	    break;
	}
	while((c = fgetc(logfile)) != '.') {
	    if(c == '*') {
		break;
	    }
	    if(c == '\n' || c == EOF) {
		invalid_file();
	    }
	}
	while((c = fgetc(logfile)) == ' ') {
	    if(c == '\n' || c == EOF) {
		invalid_file();
	    }
	}
	if(c == '*') {
	    break;
	}
	ungetc(c, logfile);
	c = read_card();
	if(c < 0) {
	    break;
	}
	step(player, c);
	interchange(&player);
	while((c = fgetc(logfile)) == ' ') {
	    if(c == '\n' || c == EOF) {
		invalid_file();
	    }
	}
	ungetc(c, logfile);
	c = read_card();
	if(c < 0) {
	    break;
	}
	step(player, c);
	interchange(&player);
	if(fgetc(logfile) != '\n') {
	    invalid_file();
	}
    }
    c = fgetc(logfile);
    while(fgetc(logfile) != '\n') ;
    if(c == 'X') {
	goto again;
    }
    if(c != 'E') {
	invalid_file();
    }
    if(player != HUMAN) {
	step(HUMAN, PASS);
    }
}

invalid_file()
{
    move(COMMAND_LINE - 1, 1);
    printw("gamefile is invalid");
    quit();
}

read_hand(hand, nr_hand)
    char *hand;
    int *nr_hand;
{
    char c;

    *nr_hand = 0;
    for(;;) {
	while((c = fgetc(logfile)) == ' ') ;
	if(c == '\n') {
	    return;
	}
	ungetc(c, logfile);
	hand[(*nr_hand)++] = read_card();
    }
}

read_card()
{
    char c;
    int value, suit;

    c = fgetc(logfile);
    switch(c) {
    case 'A':
	value = 0;
	break;
    case 'K':
	value = 1;
	break;
    case 'Q':
	value = 2;
	break;
    case 'J':
	value = 3;
	break;
    case 'X':
	value = 4;
	break;
    case '9':
	value = 5;
	break;
    case '8':
	value = 6;
	break;
    case '7':
	value = 7;
	break;
    case '6':
	value = 8;
	break;
    case '5':
	value = 9;
	break;
    case '4':
	value = 10;
	break;
    case '3':
	value = 11;
	break;
    case '2':
	value = 12;
	break;
    case 'p':
	value = -1;
	break;
    default:
	while((c = fgetc(logfile)) != '\n') {
	    if(c == EOF) {
		invalid_file();
	    }
	}
	c = fgetc(logfile);
	if(c != '*') {
	    invalid_file();
	}
	return(-1);
    }
    c = fgetc(logfile);
    switch(c) {
    case 's':
	suit = 0;
	break;
    case 'c':
	suit = 1;
	break;
    case 'd':
	suit = 2;
	break;
    case 'h':
	suit = 3;
	break;
    case 'u':
	if(value != -1) {
	    invalid_file();
	}
	return(PICK_UP);
    default:
	invalid_file();
    }
    if(value == -1) {
	invalid_file();
    }
    return(value * 4 + suit);
}

step(player, card)
{
    int i;

    i = card;
    if(i != PASS) {
	if(i != PICK_UP) {
	    if((i = have(player, card)) < 0) {
		invalid_file();
	    }
	} else {
	    save_pick_up();
	}
	if(!valid(player, i)) {
	    invalid_file();
	}
	do_move(player, i);
    }
    moves[nr_moves++] = card;
}

have(player, card)
    int player, card;
{
    char *deck;
    int nr_deck, i;

    if(player == COMPUTER) {
	deck = &computer[0];
	nr_deck = nr_computer;
    } else {
	deck = &human[0];
	nr_deck = nr_human;
    }
    for(i = 0; i < nr_deck; i++) {
	if(deck[i] == card) {
	    return(i);
	}
    }
    return(-1);
}