This is igsparse.c in view mode; [Download] [Up]
#include "comment.header" /* $Id: igsparse.c,v 1.3 1997/07/06 19:35:01 ergo Exp $ */ /* * $Log: igsparse.c,v $ * Revision 1.3 1997/07/06 19:35:01 ergo * actual version * * Revision 1.3 1997/05/04 18:57:06 ergo * added time control for moves * */ #include "igs.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #define prompts Prompts #include "shared.h" extern char *getloginname(); extern char *getpassword(); int loggedon; int repeatpass, repeatlogin; State state_t; int verts[3][MAX_BRD_SZ+1], num_ranks; char *ranks[50]; #ifdef STRSTR char *strstr(); #endif #ifdef STRTOL long strtol(); #endif char *Prompts[] = { "Login: ", "Password: ", "Password: ", "Enter Your Password Again: ", "Enter your e-mail address (None): ", "#> ", "#> ", "Enter Dead Group: ", "#> ", "#> ", }; void initparser() { loggedon = 0; repeatpass = 0; repeatlogin = 0; } int DoState(char *s) { if (strncmp(s, Prompts[LOGON], strlen(Prompts[LOGON])) == 0) return LOGON; if (strncmp(s, "1 1", 3) == 0) return PASSWORD; if (strncmp(s, "1 0", 3) == 0) return LOGON; if (strncmp(s, Prompts[PASSWORD], strlen(Prompts[PASSWORD])) == 0) return PASSWORD; if (strncmp(s, Prompts[PASSWD_NEW], strlen(Prompts[PASSWD_NEW])) == 0) return PASSWD_NEW; if (strncmp(s, Prompts[PASSWD_CONFIRM], strlen(Prompts[PASSWD_CONFIRM])) == 0) return PASSWD_CONFIRM; if (strncmp(s, Prompts[WAITING], strlen(Prompts[WAITING])) == 0) return WAITING; return -1; } static long appending = 0; char retbuf[1000]; int idle; int getmessage(message *mess, int uninitiated) { char mesg[2000]; int ret; char *textpart; idle = 0; if (!uninitiated) { pollserver(); } strcpy(mesg, retbuf); switch (DoState(mesg)) { case PASSWD_NEW: case PASSWD_CONFIRM: case PASSWORD: sendstr(getpassword(repeatpass++)); sendstr("\n"); break; case WAITING: sendstr("toggle client true\n"); mess->id = ONSERVER; loggedon = 1; sendstr("chars #O.?-++\n"); return 1; case LOGON: { int needlogin; needlogin = 1; do { if (needlogin == 1) { sendstr(getloginname(repeatlogin++)); sendstr("\n"); needlogin = -1; } ret = pollserver(); strcpy(mesg, retbuf); if (ret < 0) return ret; if (!strncmp(mesg, "Password:", 9) || (!strncmp(mesg, "1 1", 3))) needlogin = 0; else if (!strncmp(mesg, "Sorry", 5)) { puts(mesg); return 0; } else if (strlen(mesg)>2 && strncmp(mesg,"Login",5)) puts(mesg); } while (needlogin); sendstr(getpassword(repeatpass++)); sendstr("\n"); do { ret = pollserver(); strcpy(mesg, retbuf); if (ret < 0) return ret; if (!strncmp(mesg, "Enter", 5)) { sendstr(getpassword(repeatpass++)); sendstr("\n"); } if (!strncmp(mesg, "9 File", 6)) needlogin = -1; if (!strncmp(mesg, "To get", 6)) needlogin = 1; if (!strncmp(mesg, "#>", 2)) { sendstr("toggle client true\n"); mess->id = ONSERVER; loggedon = 1; sendstr("chars #O.?-++\n"); return 1; } if (!strncmp(mesg, "Invalid", 7)) { puts(mesg); needlogin = 1; } } while (!needlogin); if (needlogin > 0) break; } /* intentional fall through occurs here */ default: mess->id = strtol(mesg, &textpart, 10); textpart++; if (mess->id == 2 && (strstr(textpart, "Game") || strstr(textpart, "min"))) mess->id = TIMEREP; if (appending == -1) { if (mess->id && !strncmp(textpart, "File", 4)) { appending = 0; if (!strncmp(mess->text, " *=============", 29)) mess->id = QUITMESG; return 1; } if (strlen(mess->text)) strcat(mess->text, "\n"); { int len; char *pt; len = strlen(mesg); pt = mesg; while (len > 0) { strncat(mess->text, pt, 79); len -= 79; pt += 79; mess->lines++; if (len > 0) strcat(mess->text, "\n"); } } return 0; } if (mess->id == PROMPT) { if (*textpart == '5' && !loggedon) loggedon = 1; if (appending == LOOK_M) { mess->id = LOOK_M; appending = 0; return 1; } if (appending && !(appending == SCORE && mess->bscore == -10000)) { mess->id = appending; appending = 0; return 1; } mess->prompttype = atoi(textpart); } if (!strcmp(textpart, "File" /* , 4 */ )) { appending = -1; strcpy(mess->text, ""); mess->lines = 0; return 0; } if (mess->id == BEEP) { mess->beep = (*textpart == 7); } if (mess->id == KIBITZ) { if (parsekibitz(textpart, mess)) return 0; } if (mess->id == UNDO) if (ret = parseundo(textpart, &(mess->gamenum))) { if (ret < 0) return ret; return 0; } if (mess->id == MOVE) { if (parsemove(textpart, &(mess->x), &(mess->y), &(mess->movenum), &(mess->gamenum), &(mess->color), &(mess->bcap), &(mess->btime), &(mess->bbyo), &(mess->wcap), &(mess->wtime), &(mess->wbyo))) { mess->id = 0; } } if (mess->id == WHO) { appending = WHO; parsewho(mess, textpart); return 0; } if (mess->id == GAMES) { appending = GAMES; parsegame(mess, textpart); return 0; } if (mess->id == LOOK_M) { appending = LOOK_M; parsescore(mess, textpart); return 0; } if (mess->id == SCORE) { appending = SCORE; parsescore(mess, textpart); return 0; } strcpy(mess->text, textpart); mess->lines = 1; if (mess->id == INFO) if (ret = parseinfo(textpart, mess)) return ret; return 1; } return 0; } #ifdef STRTOL long strtol(char *text, char **new, int dum) { long retu; retu = atol(text); for (*new = text; *new && **new <= '9' && **new >= '0'; (*new)++); return retu; } #endif #ifdef STRSTR char *strstr(char *s1, char *s2) { register char *temp; int len; temp = s1; len = strlen(s2); while (temp = strchr(temp, *s2)) { if (!strncmp(temp, s2, len)) return temp; else temp++; } return NULL; } #endif void parsescore(message *mesg, char *s) { char *bd; int i; bd = strstr(s, ">>"); if (bd) *(bd + 1) = '|'; bd = strstr(s, "<<"); if (bd) *bd = '|'; if (strstr(s, "H-cap")) { mesg->boardline = 0; mesg->bscore = -10000; } else if (bd = strchr(s, '|')) { for (bd++, i = 0; *(bd - 1) != '|' || i == 0; bd += 2, i++) { if (i >= mesg->boardsize) mesg->boardsize = i + 1; if (i < 19 && mesg->boardline < 19) switch (*bd) { case '.': mesg->board[i][mesg->boardline] = EMPTY; break; case '#': mesg->board[i][mesg->boardline] = BLACK; break; case 'O': mesg->board[i][mesg->boardline] = WHITE; break; case '-': mesg->board[i][mesg->boardline] = WTERR; break; case '+': mesg->board[i][mesg->boardline] = BTERR; break; case '?': mesg->board[i][mesg->boardline] = DAME; break; } } mesg->boardline++; } else sscanf(s, "%*[^ ] (W:O): %f to %*[^ ] (B:#): %f", &(mesg->wscore), &(mesg->bscore)); if (bd = strstr(s, "Captured by #")) mesg->wcap = atoi(bd + strlen("Captured by #: ")); if (bd = strstr(s, "Captured by O")) mesg->bcap = atoi(bd + strlen("Captured by O: ")); } void parsewho(message *mesg, char *str) { if (!strncmp(str, "Info", 4)) { strcpy(mesg->text, str); mesg->lines = 1; } else { strcat(mesg->text, "\n"); strcat(mesg->text, str); mesg->lines++; } } void parsegame(message *mesg, char *str) { int fieldcount; char *br, *wr, blackrank[10], whiterank[10]; int obcount; if (str[1] == '#') { mesg->gamecount = 0; strcpy(mesg->text, str); mesg->lines = 1; } else { strcat(mesg->text, "\n"); strcat(mesg->text, str); mesg->lines++; /* hacked for systems that don't like %[^]] */ for (br = str; *br; br++) if (*br == ']') *br = '!'; fieldcount = sscanf(str, "[%3d!%12s [%[^!]! vs.%12s [%[^!]! (%3d %d %d %f %d%*c%*c%*c) ( %d)\n", &(mesg->gamelist[mesg->gamecount].gnum), mesg->gamelist[mesg->gamecount].white, whiterank, mesg->gamelist[mesg->gamecount].black, blackrank, &(mesg->gamelist[mesg->gamecount].mnum), &(mesg->gamelist[mesg->gamecount].bsize), &(mesg->gamelist[mesg->gamecount].hcap), &(mesg->gamelist[mesg->gamecount].komi), &(mesg->byo), &obcount); br = blackrank; wr = whiterank; br[5] = br[5] = 0; while (*br == ' ') br++; while (*wr == ' ') wr++; while (br[strlen(br)-1] == ' ') br[strlen(br)-1] = 0; while (wr[strlen(wr)-1] == ' ') wr[strlen(wr)-1] = 0; strcpy(mesg->gamelist[mesg->gamecount].wrank, wr); strcpy(mesg->gamelist[mesg->gamecount].brank, br); if (fieldcount == 11) (mesg->gamecount)++; } } int parseinfo(char *s, message *mess) { int ret, row; extern int MAXY; extern void igsbeep(); char col; char text[100]; if ((2 == sscanf(s, "Match[%dx%d]", &ret, &ret)) || (2 == sscanf(s, "Match [%dx%d]", &ret, &ret))) { igsbeep(); return 0; } if (1 == sscanf(s, "Match [%d]", &(mess->gamenum))) { mess->id = MATCH; return 0; } if (1 == sscanf(s, "Creating match [%d]", &(mess->gamenum))) { mess->id = MATCH; return 0; } if (2 == sscanf(s, "Removing @ %c%d", &col, &row)) { if (col > 'I') col--; mess->x = col - 'A'; mess->y = MAXY - row; mess->id = REMOVE; return 0; } if (!strncmp(s, "Board is restored", 17)) { mess->id = SCOREUNDO; return 0; } if (strstr(s, "has restored your old game.")) { mess->id = LOAD; ret = pollserver(); strcpy(text, retbuf); if (ret < 0) return ret; ret = pollserver(); strcpy(text, retbuf); if (ret < 0) return ret; ret = sscanf(text, "%*d Game %d: %*[^(](%d %d %d) vs %*[^(](%d %d %d)", &(mess->gamenum), &(mess->bcap), &(mess->btime), &(mess->bbyo), &(mess->wcap), &(mess->wtime), &(mess->wbyo) ); ret = pollserver(); strcpy(text, retbuf); if (ret < 0) return ret; return 0; } return 0; } static int gamenumber = -1; /* Undo in game 0: zzz vs anthony: D11 */ /* Game 0: testa (0 0 0) vs testb (0 0 0) with move line afterwords */ int parseundo(char *s, int *gamenum) { char mes[2000]; int count; int bogus2, ret; char bogus1; count = sscanf(s, "%*[^ ] undid the last move (%c%d).", &bogus1, &bogus2); if (count == 2) { ret = pollserver(); strcpy(mes, retbuf); if (ret < 0) return ret; ret = pollserver(); strcpy(mes, retbuf); if (ret < 0) return ret; sscanf(mes, "%*d Game %d", gamenum); ret = pollserver(); strcpy(mes, retbuf); if (ret < 0) return ret; return 0; } count = sscanf(s, "Undo in game %d", gamenum); if (count != 1) return 1; /* extra line */ return 0; } /* new format: ## game gamenum: plr (cap time byo) vs plr (cap time byo) */ int parsekibitz(char *s, message *mess) { if (1 == sscanf(s, "Kibitz %[^:]", mess->kibitzer)) return 1; while (*s == ' ') s++; strcpy(mess->kibitz, s); return 0; } int parsemove(char *s, int *x, int *y, int *mv, int *gm, int *color, int *bcap, int *btime, int *bbyo, int *wcap, int *wtime, int *wbyo) { int mc; char c, col; extern int MAXY, handicap; mc = sscanf(s, "%3d(%c): %c%d", mv, &c, &col, y); if (mc == 3) { if (3 == sscanf(s, "%3d(%c): Handicap %d", mv, &c, &mc)) { handicap = mc; *x = *y = mc + 100; *gm = gamenumber; *color = c == 'W' ? WHITE : BLACK; (*mv)++; return 0; } if (2 == sscanf(s, "%3d(%c): Pass", mv, &c)) { *x = *y = -1; *gm = gamenumber; *color = c == 'W' ? WHITE : BLACK; (*mv)++; return 0; } } if (mc != 4) { sscanf(s, "Game %d %*c: %*[^(](%d %d %d) vs %*[^(](%d %d %d)", &gamenumber, wcap, wtime, wbyo, bcap, btime, bbyo); return 1; } if (col > 'I') col--; *x = col - 'A'; *y = MAXY - *y; *color = c == 'W' ? WHITE : BLACK; *gm = gamenumber; (*mv)++; return 0; } int doneline(char *inbuf, int inptr) { return !loggedon && (inptr > 0 && inbuf[inptr - 1] == ' ') && ((inptr > 1 && inbuf[inptr - 2] == ':') || (inptr > 2 && inbuf[inptr - 2] == '>' && inbuf[inptr - 3] == '#')); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.