src/chess/pgn.c

changeset 142
780337e5cf6a
parent 140
e92ffe046659
child 143
e9159c70ff9e
equal deleted inserted replaced
141:0d6bb8b21193 142:780337e5cf6a
63 struct pgn_input { 63 struct pgn_input {
64 union { 64 union {
65 FILE *f; 65 FILE *f;
66 const char *s; 66 const char *s;
67 } data; 67 } data;
68 union { 68 int (*getc)(struct pgn_input *);
69 int (*f)(FILE*);
70 int (*s)(const char*);
71 } getc;
72 void (*backc)(struct pgn_input *); 69 void (*backc)(struct pgn_input *);
73 }; 70 };
74 71
75 static int pgngetc(struct pgn_input *pgndata) { 72 static int pgngetc(struct pgn_input *pgn) {
76 return pgndata->getc.f(pgndata->data.f); 73 return pgn->getc(pgn);
77 } 74 }
78 75
79 static void pgnbackc(struct pgn_input *pgndata) { 76 static void pgnbackc(struct pgn_input *pgn) {
80 pgndata->backc(pgndata); 77 pgn->backc(pgn);
81 } 78 }
82 79
83 static void fbackc(struct pgn_input *pgn) { 80 static int pgnfgetc(struct pgn_input *pgn) {
81 return fgetc(pgn->data.f);
82 }
83
84 static void pgnfbackc(struct pgn_input *pgn) {
84 fseek(pgn->data.f, -1, SEEK_CUR); 85 fseek(pgn->data.f, -1, SEEK_CUR);
85 } 86 }
86 87
87 static void sbackc(struct pgn_input *pgn) { 88 static void pgnsbackc(struct pgn_input *pgn) {
88 --(pgn->data.s); 89 --(pgn->data.s);
89 } 90 }
90 91
91 static int sgetc(const char *s) { 92 static int pgnsgetc(struct pgn_input *pgn) {
92 return *s; 93 int c = *(unsigned char *) pgn->data.s;
94 pgn->data.s++;
95 return c;
93 } 96 }
94 97
95 static int read_pgn_(struct pgn_input pgndata, GameState *gamestate) { 98 static int read_pgn_(struct pgn_input pgndata, GameState *gamestate) {
96 int c, i; 99 int c, i;
97 100
231 234
232 int read_pgn(FILE *stream, GameState *gamestate) { 235 int read_pgn(FILE *stream, GameState *gamestate) {
233 return read_pgn_( 236 return read_pgn_(
234 (struct pgn_input){ 237 (struct pgn_input){
235 {.f = stream}, 238 {.f = stream},
236 {.f = fgetc}, 239 pgnfgetc,
237 fbackc 240 pgnfbackc
238 }, gamestate); 241 }, gamestate);
239 } 242 }
240 243
241 int parse_pgn(const char *data, GameState *gamestate) { 244 int parse_pgn(const char *data, GameState *gamestate) {
242 return read_pgn_( 245 return read_pgn_(
243 (struct pgn_input){ 246 (struct pgn_input){
244 {.s = data}, 247 {.s = data},
245 {.s = sgetc}, 248 pgnsgetc,
246 sbackc 249 pgnsbackc
247 }, gamestate); 250 }, gamestate);
248 } 251 }
249 252
250 static void pgn_insert_newlines(char *block) { 253 static void pgn_insert_newlines(char *block) {
251 size_t pos = 0; 254 size_t pos = 0;

mercurial