| 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 |