~ubuntu-branches/ubuntu/precise/gnome-games/precise-proposed

« back to all changes in this revision

Viewing changes to glchess/src/chess-pgn.c

  • Committer: Package Import Robot
  • Author(s): Rodrigo Moya
  • Date: 2011-05-30 13:32:04 UTC
  • mfrom: (1.3.4)
  • mto: (163.1.3 precise)
  • mto: This revision was merged to the branch mainline in revision 143.
  • Revision ID: package-import@ubuntu.com-20110530133204-celaq1v1dsxc48q1
Tags: upstream-3.0.2
ImportĀ upstreamĀ versionĀ 3.0.2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* chess-pgn.c generated by valac 0.12.0, the Vala compiler
 
2
 * generated from chess-pgn.vala, do not modify */
 
3
 
 
4
 
 
5
#include <glib.h>
 
6
#include <glib-object.h>
 
7
#include <stdlib.h>
 
8
#include <string.h>
 
9
#include <gio/gio.h>
 
10
#include <stdio.h>
 
11
#include <gobject/gvaluecollector.h>
 
12
 
 
13
 
 
14
#define TYPE_PGN_GAME (pgn_game_get_type ())
 
15
#define PGN_GAME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PGN_GAME, PGNGame))
 
16
#define PGN_GAME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PGN_GAME, PGNGameClass))
 
17
#define IS_PGN_GAME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PGN_GAME))
 
18
#define IS_PGN_GAME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PGN_GAME))
 
19
#define PGN_GAME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PGN_GAME, PGNGameClass))
 
20
 
 
21
typedef struct _PGNGame PGNGame;
 
22
typedef struct _PGNGameClass PGNGameClass;
 
23
typedef struct _PGNGamePrivate PGNGamePrivate;
 
24
#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL)))
 
25
#define __g_list_free__g_free0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__g_free0_ (var), NULL)))
 
26
#define _g_free0(var) (var = (g_free (var), NULL))
 
27
#define _g_list_free0(var) ((var == NULL) ? NULL : (var = (g_list_free (var), NULL)))
 
28
#define _g_string_free0(var) ((var == NULL) ? NULL : (var = (g_string_free (var, TRUE), NULL)))
 
29
typedef struct _ParamSpecPGNGame ParamSpecPGNGame;
 
30
 
 
31
#define TYPE_STATE (state_get_type ())
 
32
 
 
33
#define TYPE_PGN (pgn_get_type ())
 
34
#define PGN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PGN, PGN))
 
35
#define PGN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PGN, PGNClass))
 
36
#define IS_PGN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PGN))
 
37
#define IS_PGN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PGN))
 
38
#define PGN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PGN, PGNClass))
 
39
 
 
40
typedef struct _PGN PGN;
 
41
typedef struct _PGNClass PGNClass;
 
42
typedef struct _PGNPrivate PGNPrivate;
 
43
#define __g_list_free__pgn_game_unref0_0(var) ((var == NULL) ? NULL : (var = (_g_list_free__pgn_game_unref0_ (var), NULL)))
 
44
#define _pgn_game_unref0(var) ((var == NULL) ? NULL : (var = (pgn_game_unref (var), NULL)))
 
45
#define _pgn_unref0(var) ((var == NULL) ? NULL : (var = (pgn_unref (var), NULL)))
 
46
typedef struct _ParamSpecPGN ParamSpecPGN;
 
47
 
 
48
typedef enum  {
 
49
        PGN_ERROR_LOAD_ERROR
 
50
} PGNError;
 
51
#define PGN_ERROR pgn_error_quark ()
 
52
struct _PGNGame {
 
53
        GTypeInstance parent_instance;
 
54
        volatile int ref_count;
 
55
        PGNGamePrivate * priv;
 
56
        GHashTable* tags;
 
57
        GList* moves;
 
58
};
 
59
 
 
60
struct _PGNGameClass {
 
61
        GTypeClass parent_class;
 
62
        void (*finalize) (PGNGame *self);
 
63
};
 
64
 
 
65
struct _ParamSpecPGNGame {
 
66
        GParamSpec parent_instance;
 
67
};
 
68
 
 
69
typedef enum  {
 
70
        STATE_TAGS,
 
71
        STATE_MOVE_TEXT,
 
72
        STATE_LINE_COMMENT,
 
73
        STATE_BRACE_COMMENT,
 
74
        STATE_TAG_START,
 
75
        STATE_TAG_NAME,
 
76
        STATE_PRE_TAG_VALUE,
 
77
        STATE_TAG_VALUE,
 
78
        STATE_POST_TAG_VALUE,
 
79
        STATE_SYMBOL,
 
80
        STATE_PERIOD,
 
81
        STATE_NAG,
 
82
        STATE_ERROR
 
83
} State;
 
84
 
 
85
struct _PGN {
 
86
        GTypeInstance parent_instance;
 
87
        volatile int ref_count;
 
88
        PGNPrivate * priv;
 
89
        GList* games;
 
90
};
 
91
 
 
92
struct _PGNClass {
 
93
        GTypeClass parent_class;
 
94
        void (*finalize) (PGN *self);
 
95
};
 
96
 
 
97
struct _ParamSpecPGN {
 
98
        GParamSpec parent_instance;
 
99
};
 
100
 
 
101
 
 
102
static gpointer pgn_game_parent_class = NULL;
 
103
extern gchar* pgn_game_RESULT_IN_PROGRESS;
 
104
gchar* pgn_game_RESULT_IN_PROGRESS = NULL;
 
105
extern gchar* pgn_game_RESULT_DRAW;
 
106
gchar* pgn_game_RESULT_DRAW = NULL;
 
107
extern gchar* pgn_game_RESULT_WHITE;
 
108
gchar* pgn_game_RESULT_WHITE = NULL;
 
109
extern gchar* pgn_game_RESULT_BLACK;
 
110
gchar* pgn_game_RESULT_BLACK = NULL;
 
111
extern gchar* pgn_game_TERMINATE_ABANDONED;
 
112
gchar* pgn_game_TERMINATE_ABANDONED = NULL;
 
113
extern gchar* pgn_game_TERMINATE_ADJUDICATION;
 
114
gchar* pgn_game_TERMINATE_ADJUDICATION = NULL;
 
115
extern gchar* pgn_game_TERMINATE_DEATH;
 
116
gchar* pgn_game_TERMINATE_DEATH = NULL;
 
117
extern gchar* pgn_game_TERMINATE_EMERGENCY;
 
118
gchar* pgn_game_TERMINATE_EMERGENCY = NULL;
 
119
extern gchar* pgn_game_TERMINATE_NORMAL;
 
120
gchar* pgn_game_TERMINATE_NORMAL = NULL;
 
121
extern gchar* pgn_game_TERMINATE_RULES_INFRACTION;
 
122
gchar* pgn_game_TERMINATE_RULES_INFRACTION = NULL;
 
123
extern gchar* pgn_game_TERMINATE_TIME_FORFEIT;
 
124
gchar* pgn_game_TERMINATE_TIME_FORFEIT = NULL;
 
125
extern gchar* pgn_game_TERMINATE_UNTERMINATED;
 
126
gchar* pgn_game_TERMINATE_UNTERMINATED = NULL;
 
127
static gpointer pgn_parent_class = NULL;
 
128
 
 
129
gint str_index (const gchar* name);
 
130
gint compare_tag (const gchar* name0, const gchar* name1);
 
131
GQuark pgn_error_quark (void);
 
132
gpointer pgn_game_ref (gpointer instance);
 
133
void pgn_game_unref (gpointer instance);
 
134
GParamSpec* param_spec_pgn_game (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
 
135
void value_set_pgn_game (GValue* value, gpointer v_object);
 
136
void value_take_pgn_game (GValue* value, gpointer v_object);
 
137
gpointer value_get_pgn_game (const GValue* value);
 
138
GType pgn_game_get_type (void) G_GNUC_CONST;
 
139
enum  {
 
140
        PGN_GAME_DUMMY_PROPERTY
 
141
};
 
142
static void _g_free0_ (gpointer var);
 
143
static void _g_list_free__g_free0_ (GList* self);
 
144
PGNGame* pgn_game_new (void);
 
145
PGNGame* pgn_game_construct (GType object_type);
 
146
void pgn_game_write (PGNGame* self, GFile* file, GError** error);
 
147
const gchar* pgn_game_get_result (PGNGame* self);
 
148
const gchar* pgn_game_get_event (PGNGame* self);
 
149
void pgn_game_set_event (PGNGame* self, const gchar* value);
 
150
const gchar* pgn_game_get_site (PGNGame* self);
 
151
void pgn_game_set_site (PGNGame* self, const gchar* value);
 
152
const gchar* pgn_game_get_date (PGNGame* self);
 
153
void pgn_game_set_date (PGNGame* self, const gchar* value);
 
154
const gchar* pgn_game_get_time (PGNGame* self);
 
155
void pgn_game_set_time (PGNGame* self, const gchar* value);
 
156
const gchar* pgn_game_get_round (PGNGame* self);
 
157
void pgn_game_set_round (PGNGame* self, const gchar* value);
 
158
const gchar* pgn_game_get_white (PGNGame* self);
 
159
void pgn_game_set_white (PGNGame* self, const gchar* value);
 
160
const gchar* pgn_game_get_black (PGNGame* self);
 
161
void pgn_game_set_black (PGNGame* self, const gchar* value);
 
162
void pgn_game_set_result (PGNGame* self, const gchar* value);
 
163
const gchar* pgn_game_get_annotator (PGNGame* self);
 
164
void pgn_game_set_annotator (PGNGame* self, const gchar* value);
 
165
const gchar* pgn_game_get_time_control (PGNGame* self);
 
166
void pgn_game_set_time_control (PGNGame* self, const gchar* value);
 
167
gboolean pgn_game_get_set_up (PGNGame* self);
 
168
void pgn_game_set_set_up (PGNGame* self, gboolean value);
 
169
const gchar* pgn_game_get_fen (PGNGame* self);
 
170
void pgn_game_set_fen (PGNGame* self, const gchar* value);
 
171
const gchar* pgn_game_get_termination (PGNGame* self);
 
172
void pgn_game_set_termination (PGNGame* self, const gchar* value);
 
173
static void pgn_game_finalize (PGNGame* obj);
 
174
GType state_get_type (void) G_GNUC_CONST;
 
175
gpointer pgn_ref (gpointer instance);
 
176
void pgn_unref (gpointer instance);
 
177
GParamSpec* param_spec_pgn (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
 
178
void value_set_pgn (GValue* value, gpointer v_object);
 
179
void value_take_pgn (GValue* value, gpointer v_object);
 
180
gpointer value_get_pgn (const GValue* value);
 
181
GType pgn_get_type (void) G_GNUC_CONST;
 
182
enum  {
 
183
        PGN_DUMMY_PROPERTY
 
184
};
 
185
static void _pgn_game_unref0_ (gpointer var);
 
186
static void _g_list_free__pgn_game_unref0_ (GList* self);
 
187
PGN* pgn_new (void);
 
188
PGN* pgn_construct (GType object_type);
 
189
PGN* pgn_new_from_string (const gchar* data, GError** error);
 
190
PGN* pgn_construct_from_string (GType object_type, const gchar* data, GError** error);
 
191
PGN* pgn_new_from_file (GFile* file, GError** error);
 
192
PGN* pgn_construct_from_file (GType object_type, GFile* file, GError** error);
 
193
static void pgn_finalize (PGN* obj);
 
194
 
 
195
 
 
196
gint str_index (const gchar* name) {
 
197
        gint result = 0;
 
198
        g_return_val_if_fail (name != NULL, 0);
 
199
        if (g_strcmp0 (name, "Event") == 0) {
 
200
                result = 0;
 
201
                return result;
 
202
        } else {
 
203
                if (g_strcmp0 (name, "Site") == 0) {
 
204
                        result = 1;
 
205
                        return result;
 
206
                } else {
 
207
                        if (g_strcmp0 (name, "Date") == 0) {
 
208
                                result = 2;
 
209
                                return result;
 
210
                        } else {
 
211
                                if (g_strcmp0 (name, "Round") == 0) {
 
212
                                        result = 3;
 
213
                                        return result;
 
214
                                } else {
 
215
                                        if (g_strcmp0 (name, "White") == 0) {
 
216
                                                result = 4;
 
217
                                                return result;
 
218
                                        } else {
 
219
                                                if (g_strcmp0 (name, "Black") == 0) {
 
220
                                                        result = 5;
 
221
                                                        return result;
 
222
                                                } else {
 
223
                                                        if (g_strcmp0 (name, "Result") == 0) {
 
224
                                                                result = 6;
 
225
                                                                return result;
 
226
                                                        } else {
 
227
                                                                result = 7;
 
228
                                                                return result;
 
229
                                                        }
 
230
                                                }
 
231
                                        }
 
232
                                }
 
233
                        }
 
234
                }
 
235
        }
 
236
}
 
237
 
 
238
 
 
239
gint compare_tag (const gchar* name0, const gchar* name1) {
 
240
        gint result = 0;
 
241
        gint _tmp0_;
 
242
        gint str_index0;
 
243
        gint _tmp1_;
 
244
        gint str_index1;
 
245
        gboolean _tmp2_ = FALSE;
 
246
        g_return_val_if_fail (name0 != NULL, 0);
 
247
        g_return_val_if_fail (name1 != NULL, 0);
 
248
        _tmp0_ = str_index (name0);
 
249
        str_index0 = _tmp0_;
 
250
        _tmp1_ = str_index (name1);
 
251
        str_index1 = _tmp1_;
 
252
        if (str_index0 == 7) {
 
253
                _tmp2_ = str_index1 == 7;
 
254
        } else {
 
255
                _tmp2_ = FALSE;
 
256
        }
 
257
        if (_tmp2_) {
 
258
                gint _tmp3_;
 
259
                _tmp3_ = g_strcmp0 (name0, name1);
 
260
                result = _tmp3_;
 
261
                return result;
 
262
        } else {
 
263
                result = str_index0 - str_index1;
 
264
                return result;
 
265
        }
 
266
}
 
267
 
 
268
 
 
269
GQuark pgn_error_quark (void) {
 
270
        return g_quark_from_static_string ("pgn_error-quark");
 
271
}
 
272
 
 
273
 
 
274
static void _g_free0_ (gpointer var) {
 
275
        var = (g_free (var), NULL);
 
276
}
 
277
 
 
278
 
 
279
static void _g_list_free__g_free0_ (GList* self) {
 
280
        g_list_foreach (self, (GFunc) _g_free0_, NULL);
 
281
        g_list_free (self);
 
282
}
 
283
 
 
284
 
 
285
PGNGame* pgn_game_construct (GType object_type) {
 
286
        PGNGame* self = NULL;
 
287
        GHashTable* _tmp0_ = NULL;
 
288
        gchar* _tmp1_;
 
289
        gchar* _tmp2_;
 
290
        gchar* _tmp3_;
 
291
        gchar* _tmp4_;
 
292
        gchar* _tmp5_;
 
293
        gchar* _tmp6_;
 
294
        gchar* _tmp7_;
 
295
        gchar* _tmp8_;
 
296
        gchar* _tmp9_;
 
297
        gchar* _tmp10_;
 
298
        gchar* _tmp11_;
 
299
        gchar* _tmp12_;
 
300
        gchar* _tmp13_;
 
301
        gchar* _tmp14_;
 
302
        self = (PGNGame*) g_type_create_instance (object_type);
 
303
        _tmp0_ = g_hash_table_new_full (g_str_hash, g_str_equal, _g_free0_, _g_free0_);
 
304
        _g_hash_table_unref0 (self->tags);
 
305
        self->tags = _tmp0_;
 
306
        _tmp1_ = g_strdup ("Event");
 
307
        _tmp2_ = g_strdup ("?");
 
308
        g_hash_table_insert (self->tags, _tmp1_, _tmp2_);
 
309
        _tmp3_ = g_strdup ("Site");
 
310
        _tmp4_ = g_strdup ("?");
 
311
        g_hash_table_insert (self->tags, _tmp3_, _tmp4_);
 
312
        _tmp5_ = g_strdup ("Date");
 
313
        _tmp6_ = g_strdup ("????.??.??");
 
314
        g_hash_table_insert (self->tags, _tmp5_, _tmp6_);
 
315
        _tmp7_ = g_strdup ("Round");
 
316
        _tmp8_ = g_strdup ("?");
 
317
        g_hash_table_insert (self->tags, _tmp7_, _tmp8_);
 
318
        _tmp9_ = g_strdup ("White");
 
319
        _tmp10_ = g_strdup ("?");
 
320
        g_hash_table_insert (self->tags, _tmp9_, _tmp10_);
 
321
        _tmp11_ = g_strdup ("Black");
 
322
        _tmp12_ = g_strdup ("?");
 
323
        g_hash_table_insert (self->tags, _tmp11_, _tmp12_);
 
324
        _tmp13_ = g_strdup ("Result");
 
325
        _tmp14_ = g_strdup (pgn_game_RESULT_IN_PROGRESS);
 
326
        g_hash_table_insert (self->tags, _tmp13_, _tmp14_);
 
327
        return self;
 
328
}
 
329
 
 
330
 
 
331
PGNGame* pgn_game_new (void) {
 
332
        return pgn_game_construct (TYPE_PGN_GAME);
 
333
}
 
334
 
 
335
 
 
336
void pgn_game_write (PGNGame* self, GFile* file, GError** error) {
 
337
        GString* _tmp0_ = NULL;
 
338
        GString* data;
 
339
        GList* _tmp1_ = NULL;
 
340
        GList* keys;
 
341
        gint i;
 
342
        const gchar* _tmp8_ = NULL;
 
343
        GError * _inner_error_ = NULL;
 
344
        g_return_if_fail (self != NULL);
 
345
        g_return_if_fail (file != NULL);
 
346
        _tmp0_ = g_string_new ("");
 
347
        data = _tmp0_;
 
348
        _tmp1_ = g_hash_table_get_keys (self->tags);
 
349
        keys = _tmp1_;
 
350
        keys = g_list_sort (keys, (GCompareFunc) compare_tag);
 
351
        {
 
352
                GList* key_collection;
 
353
                GList* key_it;
 
354
                key_collection = keys;
 
355
                for (key_it = key_collection; key_it != NULL; key_it = key_it->next) {
 
356
                        const gchar* key;
 
357
                        key = (const gchar*) key_it->data;
 
358
                        {
 
359
                                gconstpointer _tmp2_ = NULL;
 
360
                                gchar* _tmp3_ = NULL;
 
361
                                gchar* _tmp4_;
 
362
                                _tmp2_ = g_hash_table_lookup (self->tags, key);
 
363
                                _tmp3_ = g_strdup_printf ("[%s \"%s\"]\n", key, (const gchar*) _tmp2_);
 
364
                                _tmp4_ = _tmp3_;
 
365
                                g_string_append (data, _tmp4_);
 
366
                                _g_free0 (_tmp4_);
 
367
                        }
 
368
                }
 
369
        }
 
370
        g_string_append (data, "\n");
 
371
        i = 0;
 
372
        {
 
373
                GList* move_collection;
 
374
                GList* move_it;
 
375
                move_collection = self->moves;
 
376
                for (move_it = move_collection; move_it != NULL; move_it = move_it->next) {
 
377
                        gchar* _tmp5_;
 
378
                        gchar* move;
 
379
                        _tmp5_ = g_strdup ((const gchar*) move_it->data);
 
380
                        move = _tmp5_;
 
381
                        {
 
382
                                if ((i % 2) == 0) {
 
383
                                        gchar* _tmp6_ = NULL;
 
384
                                        gchar* _tmp7_;
 
385
                                        _tmp6_ = g_strdup_printf ("%d. ", (i / 2) + 1);
 
386
                                        _tmp7_ = _tmp6_;
 
387
                                        g_string_append (data, _tmp7_);
 
388
                                        _g_free0 (_tmp7_);
 
389
                                }
 
390
                                g_string_append (data, move);
 
391
                                g_string_append (data, " ");
 
392
                                i++;
 
393
                                _g_free0 (move);
 
394
                        }
 
395
                }
 
396
        }
 
397
        _tmp8_ = pgn_game_get_result (self);
 
398
        g_string_append (data, _tmp8_);
 
399
        g_string_append (data, "\n");
 
400
        g_file_replace_contents (file, data->str, (gsize) data->len, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL, &_inner_error_);
 
401
        if (_inner_error_ != NULL) {
 
402
                g_propagate_error (error, _inner_error_);
 
403
                _g_list_free0 (keys);
 
404
                _g_string_free0 (data);
 
405
                return;
 
406
        }
 
407
        _g_list_free0 (keys);
 
408
        _g_string_free0 (data);
 
409
}
 
410
 
 
411
 
 
412
const gchar* pgn_game_get_event (PGNGame* self) {
 
413
        const gchar* result;
 
414
        gconstpointer _tmp0_ = NULL;
 
415
        g_return_val_if_fail (self != NULL, NULL);
 
416
        _tmp0_ = g_hash_table_lookup (self->tags, "Event");
 
417
        result = (const gchar*) _tmp0_;
 
418
        return result;
 
419
}
 
420
 
 
421
 
 
422
void pgn_game_set_event (PGNGame* self, const gchar* value) {
 
423
        gchar* _tmp0_;
 
424
        gchar* _tmp1_;
 
425
        g_return_if_fail (self != NULL);
 
426
        _tmp0_ = g_strdup ("Event");
 
427
        _tmp1_ = g_strdup (value);
 
428
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
429
}
 
430
 
 
431
 
 
432
const gchar* pgn_game_get_site (PGNGame* self) {
 
433
        const gchar* result;
 
434
        gconstpointer _tmp0_ = NULL;
 
435
        g_return_val_if_fail (self != NULL, NULL);
 
436
        _tmp0_ = g_hash_table_lookup (self->tags, "Site");
 
437
        result = (const gchar*) _tmp0_;
 
438
        return result;
 
439
}
 
440
 
 
441
 
 
442
void pgn_game_set_site (PGNGame* self, const gchar* value) {
 
443
        gchar* _tmp0_;
 
444
        gchar* _tmp1_;
 
445
        g_return_if_fail (self != NULL);
 
446
        _tmp0_ = g_strdup ("Site");
 
447
        _tmp1_ = g_strdup (value);
 
448
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
449
}
 
450
 
 
451
 
 
452
const gchar* pgn_game_get_date (PGNGame* self) {
 
453
        const gchar* result;
 
454
        gconstpointer _tmp0_ = NULL;
 
455
        g_return_val_if_fail (self != NULL, NULL);
 
456
        _tmp0_ = g_hash_table_lookup (self->tags, "Date");
 
457
        result = (const gchar*) _tmp0_;
 
458
        return result;
 
459
}
 
460
 
 
461
 
 
462
void pgn_game_set_date (PGNGame* self, const gchar* value) {
 
463
        gchar* _tmp0_;
 
464
        gchar* _tmp1_;
 
465
        g_return_if_fail (self != NULL);
 
466
        _tmp0_ = g_strdup ("Date");
 
467
        _tmp1_ = g_strdup (value);
 
468
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
469
}
 
470
 
 
471
 
 
472
const gchar* pgn_game_get_time (PGNGame* self) {
 
473
        const gchar* result;
 
474
        gconstpointer _tmp0_ = NULL;
 
475
        g_return_val_if_fail (self != NULL, NULL);
 
476
        _tmp0_ = g_hash_table_lookup (self->tags, "Time");
 
477
        result = (const gchar*) _tmp0_;
 
478
        return result;
 
479
}
 
480
 
 
481
 
 
482
void pgn_game_set_time (PGNGame* self, const gchar* value) {
 
483
        gchar* _tmp0_;
 
484
        gchar* _tmp1_;
 
485
        g_return_if_fail (self != NULL);
 
486
        _tmp0_ = g_strdup ("Time");
 
487
        _tmp1_ = g_strdup (value);
 
488
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
489
}
 
490
 
 
491
 
 
492
const gchar* pgn_game_get_round (PGNGame* self) {
 
493
        const gchar* result;
 
494
        gconstpointer _tmp0_ = NULL;
 
495
        g_return_val_if_fail (self != NULL, NULL);
 
496
        _tmp0_ = g_hash_table_lookup (self->tags, "Round");
 
497
        result = (const gchar*) _tmp0_;
 
498
        return result;
 
499
}
 
500
 
 
501
 
 
502
void pgn_game_set_round (PGNGame* self, const gchar* value) {
 
503
        gchar* _tmp0_;
 
504
        gchar* _tmp1_;
 
505
        g_return_if_fail (self != NULL);
 
506
        _tmp0_ = g_strdup ("Round");
 
507
        _tmp1_ = g_strdup (value);
 
508
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
509
}
 
510
 
 
511
 
 
512
const gchar* pgn_game_get_white (PGNGame* self) {
 
513
        const gchar* result;
 
514
        gconstpointer _tmp0_ = NULL;
 
515
        g_return_val_if_fail (self != NULL, NULL);
 
516
        _tmp0_ = g_hash_table_lookup (self->tags, "White");
 
517
        result = (const gchar*) _tmp0_;
 
518
        return result;
 
519
}
 
520
 
 
521
 
 
522
void pgn_game_set_white (PGNGame* self, const gchar* value) {
 
523
        gchar* _tmp0_;
 
524
        gchar* _tmp1_;
 
525
        g_return_if_fail (self != NULL);
 
526
        _tmp0_ = g_strdup ("White");
 
527
        _tmp1_ = g_strdup (value);
 
528
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
529
}
 
530
 
 
531
 
 
532
const gchar* pgn_game_get_black (PGNGame* self) {
 
533
        const gchar* result;
 
534
        gconstpointer _tmp0_ = NULL;
 
535
        g_return_val_if_fail (self != NULL, NULL);
 
536
        _tmp0_ = g_hash_table_lookup (self->tags, "Black");
 
537
        result = (const gchar*) _tmp0_;
 
538
        return result;
 
539
}
 
540
 
 
541
 
 
542
void pgn_game_set_black (PGNGame* self, const gchar* value) {
 
543
        gchar* _tmp0_;
 
544
        gchar* _tmp1_;
 
545
        g_return_if_fail (self != NULL);
 
546
        _tmp0_ = g_strdup ("Black");
 
547
        _tmp1_ = g_strdup (value);
 
548
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
549
}
 
550
 
 
551
 
 
552
const gchar* pgn_game_get_result (PGNGame* self) {
 
553
        const gchar* result;
 
554
        gconstpointer _tmp0_ = NULL;
 
555
        g_return_val_if_fail (self != NULL, NULL);
 
556
        _tmp0_ = g_hash_table_lookup (self->tags, "Result");
 
557
        result = (const gchar*) _tmp0_;
 
558
        return result;
 
559
}
 
560
 
 
561
 
 
562
void pgn_game_set_result (PGNGame* self, const gchar* value) {
 
563
        gchar* _tmp0_;
 
564
        gchar* _tmp1_;
 
565
        g_return_if_fail (self != NULL);
 
566
        _tmp0_ = g_strdup ("Result");
 
567
        _tmp1_ = g_strdup (value);
 
568
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
569
}
 
570
 
 
571
 
 
572
const gchar* pgn_game_get_annotator (PGNGame* self) {
 
573
        const gchar* result;
 
574
        gconstpointer _tmp0_ = NULL;
 
575
        g_return_val_if_fail (self != NULL, NULL);
 
576
        _tmp0_ = g_hash_table_lookup (self->tags, "Annotator");
 
577
        result = (const gchar*) _tmp0_;
 
578
        return result;
 
579
}
 
580
 
 
581
 
 
582
void pgn_game_set_annotator (PGNGame* self, const gchar* value) {
 
583
        gchar* _tmp0_;
 
584
        gchar* _tmp1_;
 
585
        g_return_if_fail (self != NULL);
 
586
        _tmp0_ = g_strdup ("Annotator");
 
587
        _tmp1_ = g_strdup (value);
 
588
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
589
}
 
590
 
 
591
 
 
592
const gchar* pgn_game_get_time_control (PGNGame* self) {
 
593
        const gchar* result;
 
594
        gconstpointer _tmp0_ = NULL;
 
595
        g_return_val_if_fail (self != NULL, NULL);
 
596
        _tmp0_ = g_hash_table_lookup (self->tags, "TimeControl");
 
597
        result = (const gchar*) _tmp0_;
 
598
        return result;
 
599
}
 
600
 
 
601
 
 
602
void pgn_game_set_time_control (PGNGame* self, const gchar* value) {
 
603
        gchar* _tmp0_;
 
604
        gchar* _tmp1_;
 
605
        g_return_if_fail (self != NULL);
 
606
        _tmp0_ = g_strdup ("TimeControl");
 
607
        _tmp1_ = g_strdup (value);
 
608
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
609
}
 
610
 
 
611
 
 
612
gboolean pgn_game_get_set_up (PGNGame* self) {
 
613
        gboolean result;
 
614
        gconstpointer _tmp0_ = NULL;
 
615
        gchar* _tmp1_;
 
616
        gchar* v;
 
617
        gboolean _tmp2_ = FALSE;
 
618
        gboolean _tmp3_ = FALSE;
 
619
        g_return_val_if_fail (self != NULL, FALSE);
 
620
        _tmp0_ = g_hash_table_lookup (self->tags, "SetUp");
 
621
        _tmp1_ = g_strdup ((const gchar*) _tmp0_);
 
622
        v = _tmp1_;
 
623
        if (v != NULL) {
 
624
                _tmp3_ = g_strcmp0 (v, "1") == 0;
 
625
        } else {
 
626
                _tmp3_ = FALSE;
 
627
        }
 
628
        if (_tmp3_) {
 
629
                _tmp2_ = TRUE;
 
630
        } else {
 
631
                _tmp2_ = FALSE;
 
632
        }
 
633
        result = _tmp2_;
 
634
        _g_free0 (v);
 
635
        return result;
 
636
}
 
637
 
 
638
 
 
639
void pgn_game_set_set_up (PGNGame* self, gboolean value) {
 
640
        const gchar* _tmp0_ = NULL;
 
641
        gchar* _tmp1_;
 
642
        gchar* _tmp2_;
 
643
        g_return_if_fail (self != NULL);
 
644
        if (value) {
 
645
                _tmp0_ = "1";
 
646
        } else {
 
647
                _tmp0_ = "0";
 
648
        }
 
649
        _tmp1_ = g_strdup ("SetUp");
 
650
        _tmp2_ = g_strdup (_tmp0_);
 
651
        g_hash_table_insert (self->tags, _tmp1_, _tmp2_);
 
652
}
 
653
 
 
654
 
 
655
const gchar* pgn_game_get_fen (PGNGame* self) {
 
656
        const gchar* result;
 
657
        gconstpointer _tmp0_ = NULL;
 
658
        g_return_val_if_fail (self != NULL, NULL);
 
659
        _tmp0_ = g_hash_table_lookup (self->tags, "FEN");
 
660
        result = (const gchar*) _tmp0_;
 
661
        return result;
 
662
}
 
663
 
 
664
 
 
665
void pgn_game_set_fen (PGNGame* self, const gchar* value) {
 
666
        gchar* _tmp0_;
 
667
        gchar* _tmp1_;
 
668
        g_return_if_fail (self != NULL);
 
669
        _tmp0_ = g_strdup ("FEN");
 
670
        _tmp1_ = g_strdup (value);
 
671
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
672
}
 
673
 
 
674
 
 
675
const gchar* pgn_game_get_termination (PGNGame* self) {
 
676
        const gchar* result;
 
677
        gconstpointer _tmp0_ = NULL;
 
678
        g_return_val_if_fail (self != NULL, NULL);
 
679
        _tmp0_ = g_hash_table_lookup (self->tags, "Termination");
 
680
        result = (const gchar*) _tmp0_;
 
681
        return result;
 
682
}
 
683
 
 
684
 
 
685
void pgn_game_set_termination (PGNGame* self, const gchar* value) {
 
686
        gchar* _tmp0_;
 
687
        gchar* _tmp1_;
 
688
        g_return_if_fail (self != NULL);
 
689
        _tmp0_ = g_strdup ("Termination");
 
690
        _tmp1_ = g_strdup (value);
 
691
        g_hash_table_insert (self->tags, _tmp0_, _tmp1_);
 
692
}
 
693
 
 
694
 
 
695
static void value_pgn_game_init (GValue* value) {
 
696
        value->data[0].v_pointer = NULL;
 
697
}
 
698
 
 
699
 
 
700
static void value_pgn_game_free_value (GValue* value) {
 
701
        if (value->data[0].v_pointer) {
 
702
                pgn_game_unref (value->data[0].v_pointer);
 
703
        }
 
704
}
 
705
 
 
706
 
 
707
static void value_pgn_game_copy_value (const GValue* src_value, GValue* dest_value) {
 
708
        if (src_value->data[0].v_pointer) {
 
709
                dest_value->data[0].v_pointer = pgn_game_ref (src_value->data[0].v_pointer);
 
710
        } else {
 
711
                dest_value->data[0].v_pointer = NULL;
 
712
        }
 
713
}
 
714
 
 
715
 
 
716
static gpointer value_pgn_game_peek_pointer (const GValue* value) {
 
717
        return value->data[0].v_pointer;
 
718
}
 
719
 
 
720
 
 
721
static gchar* value_pgn_game_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
 
722
        if (collect_values[0].v_pointer) {
 
723
                PGNGame* object;
 
724
                object = collect_values[0].v_pointer;
 
725
                if (object->parent_instance.g_class == NULL) {
 
726
                        return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
 
727
                } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
 
728
                        return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
 
729
                }
 
730
                value->data[0].v_pointer = pgn_game_ref (object);
 
731
        } else {
 
732
                value->data[0].v_pointer = NULL;
 
733
        }
 
734
        return NULL;
 
735
}
 
736
 
 
737
 
 
738
static gchar* value_pgn_game_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
 
739
        PGNGame** object_p;
 
740
        object_p = collect_values[0].v_pointer;
 
741
        if (!object_p) {
 
742
                return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
 
743
        }
 
744
        if (!value->data[0].v_pointer) {
 
745
                *object_p = NULL;
 
746
        } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
 
747
                *object_p = value->data[0].v_pointer;
 
748
        } else {
 
749
                *object_p = pgn_game_ref (value->data[0].v_pointer);
 
750
        }
 
751
        return NULL;
 
752
}
 
753
 
 
754
 
 
755
GParamSpec* param_spec_pgn_game (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
 
756
        ParamSpecPGNGame* spec;
 
757
        g_return_val_if_fail (g_type_is_a (object_type, TYPE_PGN_GAME), NULL);
 
758
        spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
 
759
        G_PARAM_SPEC (spec)->value_type = object_type;
 
760
        return G_PARAM_SPEC (spec);
 
761
}
 
762
 
 
763
 
 
764
gpointer value_get_pgn_game (const GValue* value) {
 
765
        g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PGN_GAME), NULL);
 
766
        return value->data[0].v_pointer;
 
767
}
 
768
 
 
769
 
 
770
void value_set_pgn_game (GValue* value, gpointer v_object) {
 
771
        PGNGame* old;
 
772
        g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PGN_GAME));
 
773
        old = value->data[0].v_pointer;
 
774
        if (v_object) {
 
775
                g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PGN_GAME));
 
776
                g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
 
777
                value->data[0].v_pointer = v_object;
 
778
                pgn_game_ref (value->data[0].v_pointer);
 
779
        } else {
 
780
                value->data[0].v_pointer = NULL;
 
781
        }
 
782
        if (old) {
 
783
                pgn_game_unref (old);
 
784
        }
 
785
}
 
786
 
 
787
 
 
788
void value_take_pgn_game (GValue* value, gpointer v_object) {
 
789
        PGNGame* old;
 
790
        g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PGN_GAME));
 
791
        old = value->data[0].v_pointer;
 
792
        if (v_object) {
 
793
                g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PGN_GAME));
 
794
                g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
 
795
                value->data[0].v_pointer = v_object;
 
796
        } else {
 
797
                value->data[0].v_pointer = NULL;
 
798
        }
 
799
        if (old) {
 
800
                pgn_game_unref (old);
 
801
        }
 
802
}
 
803
 
 
804
 
 
805
static void pgn_game_class_init (PGNGameClass * klass) {
 
806
        gchar* _tmp0_;
 
807
        gchar* _tmp1_;
 
808
        gchar* _tmp2_;
 
809
        gchar* _tmp3_;
 
810
        gchar* _tmp4_;
 
811
        gchar* _tmp5_;
 
812
        gchar* _tmp6_;
 
813
        gchar* _tmp7_;
 
814
        gchar* _tmp8_;
 
815
        gchar* _tmp9_;
 
816
        gchar* _tmp10_;
 
817
        gchar* _tmp11_;
 
818
        pgn_game_parent_class = g_type_class_peek_parent (klass);
 
819
        PGN_GAME_CLASS (klass)->finalize = pgn_game_finalize;
 
820
        _tmp0_ = g_strdup ("*");
 
821
        pgn_game_RESULT_IN_PROGRESS = _tmp0_;
 
822
        _tmp1_ = g_strdup ("1/2-1/2");
 
823
        pgn_game_RESULT_DRAW = _tmp1_;
 
824
        _tmp2_ = g_strdup ("1-0");
 
825
        pgn_game_RESULT_WHITE = _tmp2_;
 
826
        _tmp3_ = g_strdup ("0-1");
 
827
        pgn_game_RESULT_BLACK = _tmp3_;
 
828
        _tmp4_ = g_strdup ("abandoned");
 
829
        pgn_game_TERMINATE_ABANDONED = _tmp4_;
 
830
        _tmp5_ = g_strdup ("adjudication");
 
831
        pgn_game_TERMINATE_ADJUDICATION = _tmp5_;
 
832
        _tmp6_ = g_strdup ("death");
 
833
        pgn_game_TERMINATE_DEATH = _tmp6_;
 
834
        _tmp7_ = g_strdup ("emergency");
 
835
        pgn_game_TERMINATE_EMERGENCY = _tmp7_;
 
836
        _tmp8_ = g_strdup ("normal");
 
837
        pgn_game_TERMINATE_NORMAL = _tmp8_;
 
838
        _tmp9_ = g_strdup ("rules infraction");
 
839
        pgn_game_TERMINATE_RULES_INFRACTION = _tmp9_;
 
840
        _tmp10_ = g_strdup ("time forfeit");
 
841
        pgn_game_TERMINATE_TIME_FORFEIT = _tmp10_;
 
842
        _tmp11_ = g_strdup ("unterminated");
 
843
        pgn_game_TERMINATE_UNTERMINATED = _tmp11_;
 
844
}
 
845
 
 
846
 
 
847
static void pgn_game_instance_init (PGNGame * self) {
 
848
        self->ref_count = 1;
 
849
}
 
850
 
 
851
 
 
852
static void pgn_game_finalize (PGNGame* obj) {
 
853
        PGNGame * self;
 
854
        self = PGN_GAME (obj);
 
855
        _g_hash_table_unref0 (self->tags);
 
856
        __g_list_free__g_free0_0 (self->moves);
 
857
}
 
858
 
 
859
 
 
860
GType pgn_game_get_type (void) {
 
861
        static volatile gsize pgn_game_type_id__volatile = 0;
 
862
        if (g_once_init_enter (&pgn_game_type_id__volatile)) {
 
863
                static const GTypeValueTable g_define_type_value_table = { value_pgn_game_init, value_pgn_game_free_value, value_pgn_game_copy_value, value_pgn_game_peek_pointer, "p", value_pgn_game_collect_value, "p", value_pgn_game_lcopy_value };
 
864
                static const GTypeInfo g_define_type_info = { sizeof (PGNGameClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) pgn_game_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (PGNGame), 0, (GInstanceInitFunc) pgn_game_instance_init, &g_define_type_value_table };
 
865
                static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
 
866
                GType pgn_game_type_id;
 
867
                pgn_game_type_id = g_type_register_fundamental (g_type_fundamental_next (), "PGNGame", &g_define_type_info, &g_define_type_fundamental_info, 0);
 
868
                g_once_init_leave (&pgn_game_type_id__volatile, pgn_game_type_id);
 
869
        }
 
870
        return pgn_game_type_id__volatile;
 
871
}
 
872
 
 
873
 
 
874
gpointer pgn_game_ref (gpointer instance) {
 
875
        PGNGame* self;
 
876
        self = instance;
 
877
        g_atomic_int_inc (&self->ref_count);
 
878
        return instance;
 
879
}
 
880
 
 
881
 
 
882
void pgn_game_unref (gpointer instance) {
 
883
        PGNGame* self;
 
884
        self = instance;
 
885
        if (g_atomic_int_dec_and_test (&self->ref_count)) {
 
886
                PGN_GAME_GET_CLASS (self)->finalize (self);
 
887
                g_type_free_instance ((GTypeInstance *) self);
 
888
        }
 
889
}
 
890
 
 
891
 
 
892
GType state_get_type (void) {
 
893
        static volatile gsize state_type_id__volatile = 0;
 
894
        if (g_once_init_enter (&state_type_id__volatile)) {
 
895
                static const GEnumValue values[] = {{STATE_TAGS, "STATE_TAGS", "tags"}, {STATE_MOVE_TEXT, "STATE_MOVE_TEXT", "move-text"}, {STATE_LINE_COMMENT, "STATE_LINE_COMMENT", "line-comment"}, {STATE_BRACE_COMMENT, "STATE_BRACE_COMMENT", "brace-comment"}, {STATE_TAG_START, "STATE_TAG_START", "tag-start"}, {STATE_TAG_NAME, "STATE_TAG_NAME", "tag-name"}, {STATE_PRE_TAG_VALUE, "STATE_PRE_TAG_VALUE", "pre-tag-value"}, {STATE_TAG_VALUE, "STATE_TAG_VALUE", "tag-value"}, {STATE_POST_TAG_VALUE, "STATE_POST_TAG_VALUE", "post-tag-value"}, {STATE_SYMBOL, "STATE_SYMBOL", "symbol"}, {STATE_PERIOD, "STATE_PERIOD", "period"}, {STATE_NAG, "STATE_NAG", "nag"}, {STATE_ERROR, "STATE_ERROR", "error"}, {0, NULL, NULL}};
 
896
                GType state_type_id;
 
897
                state_type_id = g_enum_register_static ("State", values);
 
898
                g_once_init_leave (&state_type_id__volatile, state_type_id);
 
899
        }
 
900
        return state_type_id__volatile;
 
901
}
 
902
 
 
903
 
 
904
static void _pgn_game_unref0_ (gpointer var) {
 
905
        (var == NULL) ? NULL : (var = (pgn_game_unref (var), NULL));
 
906
}
 
907
 
 
908
 
 
909
static void _g_list_free__pgn_game_unref0_ (GList* self) {
 
910
        g_list_foreach (self, (GFunc) _pgn_game_unref0_, NULL);
 
911
        g_list_free (self);
 
912
}
 
913
 
 
914
 
 
915
PGN* pgn_construct (GType object_type) {
 
916
        PGN* self = NULL;
 
917
        self = (PGN*) g_type_create_instance (object_type);
 
918
        return self;
 
919
}
 
920
 
 
921
 
 
922
PGN* pgn_new (void) {
 
923
        return pgn_construct (TYPE_PGN);
 
924
}
 
925
 
 
926
 
 
927
static gchar string_get (const gchar* self, glong index) {
 
928
        gchar result = '\0';
 
929
        g_return_val_if_fail (self != NULL, '\0');
 
930
        result = ((gchar*) self)[index];
 
931
        return result;
 
932
}
 
933
 
 
934
 
 
935
static gpointer _pgn_game_ref0 (gpointer self) {
 
936
        return self ? pgn_game_ref (self) : NULL;
 
937
}
 
938
 
 
939
 
 
940
static gchar* string_slice (const gchar* self, glong start, glong end) {
 
941
        gchar* result = NULL;
 
942
        gint _tmp0_;
 
943
        glong string_length;
 
944
        gboolean _tmp1_ = FALSE;
 
945
        gboolean _tmp2_ = FALSE;
 
946
        gchar* _tmp3_ = NULL;
 
947
        g_return_val_if_fail (self != NULL, NULL);
 
948
        _tmp0_ = strlen (self);
 
949
        string_length = (glong) _tmp0_;
 
950
        if (start < 0) {
 
951
                start = string_length + start;
 
952
        }
 
953
        if (end < 0) {
 
954
                end = string_length + end;
 
955
        }
 
956
        if (start >= 0) {
 
957
                _tmp1_ = start <= string_length;
 
958
        } else {
 
959
                _tmp1_ = FALSE;
 
960
        }
 
961
        g_return_val_if_fail (_tmp1_, NULL);
 
962
        if (end >= 0) {
 
963
                _tmp2_ = end <= string_length;
 
964
        } else {
 
965
                _tmp2_ = FALSE;
 
966
        }
 
967
        g_return_val_if_fail (_tmp2_, NULL);
 
968
        g_return_val_if_fail (start <= end, NULL);
 
969
        _tmp3_ = g_strndup (((gchar*) self) + start, (gsize) (end - start));
 
970
        result = _tmp3_;
 
971
        return result;
 
972
}
 
973
 
 
974
 
 
975
PGN* pgn_construct_from_string (GType object_type, const gchar* data, GError** error) {
 
976
        PGN* self = NULL;
 
977
        State state;
 
978
        State home_state;
 
979
        PGNGame* _tmp0_ = NULL;
 
980
        PGNGame* game;
 
981
        gboolean in_escape;
 
982
        gsize token_start;
 
983
        gsize line_offset;
 
984
        gchar* _tmp1_;
 
985
        gchar* tag_name;
 
986
        GString* _tmp2_ = NULL;
 
987
        GString* tag_value;
 
988
        gint line;
 
989
        gint rav_level;
 
990
        gboolean _tmp51_ = FALSE;
 
991
        guint _tmp52_;
 
992
        GError * _inner_error_ = NULL;
 
993
        g_return_val_if_fail (data != NULL, NULL);
 
994
        self = (PGN*) g_type_create_instance (object_type);
 
995
        state = STATE_TAGS;
 
996
        home_state = STATE_TAGS;
 
997
        _tmp0_ = pgn_game_new ();
 
998
        game = _tmp0_;
 
999
        in_escape = FALSE;
 
1000
        token_start = (gsize) 0;
 
1001
        line_offset = (gsize) 0;
 
1002
        _tmp1_ = g_strdup ("");
 
1003
        tag_name = _tmp1_;
 
1004
        _tmp2_ = g_string_new ("");
 
1005
        tag_value = _tmp2_;
 
1006
        line = 1;
 
1007
        rav_level = 0;
 
1008
        {
 
1009
                gsize offset;
 
1010
                offset = (gsize) 0;
 
1011
                {
 
1012
                        gboolean _tmp3_;
 
1013
                        _tmp3_ = TRUE;
 
1014
                        while (TRUE) {
 
1015
                                gint _tmp4_;
 
1016
                                gchar _tmp5_;
 
1017
                                gunichar c;
 
1018
                                if (!_tmp3_) {
 
1019
                                        offset++;
 
1020
                                }
 
1021
                                _tmp3_ = FALSE;
 
1022
                                _tmp4_ = strlen (data);
 
1023
                                if (!(offset <= _tmp4_)) {
 
1024
                                        break;
 
1025
                                }
 
1026
                                _tmp5_ = string_get (data, (glong) offset);
 
1027
                                c = (gunichar) _tmp5_;
 
1028
                                if (c == '\n') {
 
1029
                                        line++;
 
1030
                                        line_offset = offset + 1;
 
1031
                                }
 
1032
                                switch (state) {
 
1033
                                        case STATE_TAGS:
 
1034
                                        {
 
1035
                                                gboolean _tmp6_;
 
1036
                                                home_state = STATE_TAGS;
 
1037
                                                _tmp6_ = g_unichar_isspace (c);
 
1038
                                                if (_tmp6_) {
 
1039
                                                } else {
 
1040
                                                        if (c == ';') {
 
1041
                                                                state = STATE_LINE_COMMENT;
 
1042
                                                        } else {
 
1043
                                                                if (c == '{') {
 
1044
                                                                        state = STATE_BRACE_COMMENT;
 
1045
                                                                } else {
 
1046
                                                                        if (c == '[') {
 
1047
                                                                                state = STATE_TAG_START;
 
1048
                                                                        } else {
 
1049
                                                                                offset--;
 
1050
                                                                                state = STATE_MOVE_TEXT;
 
1051
                                                                                continue;
 
1052
                                                                        }
 
1053
                                                                }
 
1054
                                                        }
 
1055
                                                }
 
1056
                                                break;
 
1057
                                        }
 
1058
                                        case STATE_MOVE_TEXT:
 
1059
                                        {
 
1060
                                                gboolean _tmp7_;
 
1061
                                                home_state = STATE_MOVE_TEXT;
 
1062
                                                _tmp7_ = g_unichar_isspace (c);
 
1063
                                                if (_tmp7_) {
 
1064
                                                } else {
 
1065
                                                        if (c == ';') {
 
1066
                                                                state = STATE_LINE_COMMENT;
 
1067
                                                        } else {
 
1068
                                                                if (c == '{') {
 
1069
                                                                        state = STATE_BRACE_COMMENT;
 
1070
                                                                } else {
 
1071
                                                                        if (c == '*') {
 
1072
                                                                                if (rav_level == 0) {
 
1073
                                                                                        PGNGame* _tmp8_;
 
1074
                                                                                        PGNGame* _tmp9_ = NULL;
 
1075
                                                                                        pgn_game_set_result (game, pgn_game_RESULT_IN_PROGRESS);
 
1076
                                                                                        _tmp8_ = _pgn_game_ref0 (game);
 
1077
                                                                                        self->games = g_list_append (self->games, _tmp8_);
 
1078
                                                                                        _tmp9_ = pgn_game_new ();
 
1079
                                                                                        _pgn_game_unref0 (game);
 
1080
                                                                                        game = _tmp9_;
 
1081
                                                                                        state = STATE_TAGS;
 
1082
                                                                                }
 
1083
                                                                        } else {
 
1084
                                                                                if (c == '.') {
 
1085
                                                                                        offset--;
 
1086
                                                                                        state = STATE_PERIOD;
 
1087
                                                                                } else {
 
1088
                                                                                        gboolean _tmp10_;
 
1089
                                                                                        _tmp10_ = g_unichar_isalnum (c);
 
1090
                                                                                        if (_tmp10_) {
 
1091
                                                                                                token_start = offset;
 
1092
                                                                                                state = STATE_SYMBOL;
 
1093
                                                                                        } else {
 
1094
                                                                                                if (c == '$') {
 
1095
                                                                                                        token_start = offset + 1;
 
1096
                                                                                                        state = STATE_NAG;
 
1097
                                                                                                } else {
 
1098
                                                                                                        if (c == '(') {
 
1099
                                                                                                                rav_level++;
 
1100
                                                                                                                continue;
 
1101
                                                                                                        } else {
 
1102
                                                                                                                if (c == ')') {
 
1103
                                                                                                                        if (rav_level == 0) {
 
1104
                                                                                                                                state = STATE_ERROR;
 
1105
                                                                                                                        } else {
 
1106
                                                                                                                                rav_level--;
 
1107
                                                                                                                        }
 
1108
                                                                                                                } else {
 
1109
                                                                                                                        state = STATE_ERROR;
 
1110
                                                                                                                }
 
1111
                                                                                                        }
 
1112
                                                                                                }
 
1113
                                                                                        }
 
1114
                                                                                }
 
1115
                                                                        }
 
1116
                                                                }
 
1117
                                                        }
 
1118
                                                }
 
1119
                                                break;
 
1120
                                        }
 
1121
                                        case STATE_LINE_COMMENT:
 
1122
                                        {
 
1123
                                                if (c == '\n') {
 
1124
                                                        state = home_state;
 
1125
                                                }
 
1126
                                                break;
 
1127
                                        }
 
1128
                                        case STATE_BRACE_COMMENT:
 
1129
                                        {
 
1130
                                                if (c == '}') {
 
1131
                                                        state = home_state;
 
1132
                                                }
 
1133
                                                break;
 
1134
                                        }
 
1135
                                        case STATE_TAG_START:
 
1136
                                        {
 
1137
                                                gboolean _tmp11_;
 
1138
                                                _tmp11_ = g_unichar_isspace (c);
 
1139
                                                if (_tmp11_) {
 
1140
                                                        continue;
 
1141
                                                } else {
 
1142
                                                        gboolean _tmp12_;
 
1143
                                                        _tmp12_ = g_unichar_isalnum (c);
 
1144
                                                        if (_tmp12_) {
 
1145
                                                                token_start = offset;
 
1146
                                                                state = STATE_TAG_NAME;
 
1147
                                                        } else {
 
1148
                                                                state = STATE_ERROR;
 
1149
                                                        }
 
1150
                                                }
 
1151
                                                break;
 
1152
                                        }
 
1153
                                        case STATE_TAG_NAME:
 
1154
                                        {
 
1155
                                                gboolean _tmp13_;
 
1156
                                                _tmp13_ = g_unichar_isspace (c);
 
1157
                                                if (_tmp13_) {
 
1158
                                                        gchar* _tmp14_ = NULL;
 
1159
                                                        _tmp14_ = string_slice (data, (glong) token_start, (glong) offset);
 
1160
                                                        _g_free0 (tag_name);
 
1161
                                                        tag_name = _tmp14_;
 
1162
                                                        state = STATE_PRE_TAG_VALUE;
 
1163
                                                } else {
 
1164
                                                        gboolean _tmp15_ = FALSE;
 
1165
                                                        gboolean _tmp16_ = FALSE;
 
1166
                                                        gboolean _tmp17_ = FALSE;
 
1167
                                                        gboolean _tmp18_ = FALSE;
 
1168
                                                        gboolean _tmp19_ = FALSE;
 
1169
                                                        gboolean _tmp20_ = FALSE;
 
1170
                                                        gboolean _tmp21_;
 
1171
                                                        _tmp21_ = g_unichar_isalnum (c);
 
1172
                                                        if (_tmp21_) {
 
1173
                                                                _tmp20_ = TRUE;
 
1174
                                                        } else {
 
1175
                                                                _tmp20_ = c == '_';
 
1176
                                                        }
 
1177
                                                        if (_tmp20_) {
 
1178
                                                                _tmp19_ = TRUE;
 
1179
                                                        } else {
 
1180
                                                                _tmp19_ = c == '+';
 
1181
                                                        }
 
1182
                                                        if (_tmp19_) {
 
1183
                                                                _tmp18_ = TRUE;
 
1184
                                                        } else {
 
1185
                                                                _tmp18_ = c == '#';
 
1186
                                                        }
 
1187
                                                        if (_tmp18_) {
 
1188
                                                                _tmp17_ = TRUE;
 
1189
                                                        } else {
 
1190
                                                                _tmp17_ = c == '=';
 
1191
                                                        }
 
1192
                                                        if (_tmp17_) {
 
1193
                                                                _tmp16_ = TRUE;
 
1194
                                                        } else {
 
1195
                                                                _tmp16_ = c == ':';
 
1196
                                                        }
 
1197
                                                        if (_tmp16_) {
 
1198
                                                                _tmp15_ = TRUE;
 
1199
                                                        } else {
 
1200
                                                                _tmp15_ = c == '-';
 
1201
                                                        }
 
1202
                                                        if (_tmp15_) {
 
1203
                                                                continue;
 
1204
                                                        } else {
 
1205
                                                                state = STATE_ERROR;
 
1206
                                                        }
 
1207
                                                }
 
1208
                                                break;
 
1209
                                        }
 
1210
                                        case STATE_PRE_TAG_VALUE:
 
1211
                                        {
 
1212
                                                gboolean _tmp22_;
 
1213
                                                _tmp22_ = g_unichar_isspace (c);
 
1214
                                                if (_tmp22_) {
 
1215
                                                        continue;
 
1216
                                                } else {
 
1217
                                                        if (c == '"') {
 
1218
                                                                state = STATE_TAG_VALUE;
 
1219
                                                                g_string_erase (tag_value, (gssize) 0, (gssize) (-1));
 
1220
                                                                in_escape = FALSE;
 
1221
                                                        } else {
 
1222
                                                                state = STATE_ERROR;
 
1223
                                                        }
 
1224
                                                }
 
1225
                                                break;
 
1226
                                        }
 
1227
                                        case STATE_TAG_VALUE:
 
1228
                                        {
 
1229
                                                gboolean _tmp23_ = FALSE;
 
1230
                                                if (c == '\\') {
 
1231
                                                        _tmp23_ = !in_escape;
 
1232
                                                } else {
 
1233
                                                        _tmp23_ = FALSE;
 
1234
                                                }
 
1235
                                                if (_tmp23_) {
 
1236
                                                        in_escape = TRUE;
 
1237
                                                } else {
 
1238
                                                        gboolean _tmp24_ = FALSE;
 
1239
                                                        if (c == '"') {
 
1240
                                                                _tmp24_ = !in_escape;
 
1241
                                                        } else {
 
1242
                                                                _tmp24_ = FALSE;
 
1243
                                                        }
 
1244
                                                        if (_tmp24_) {
 
1245
                                                                state = STATE_POST_TAG_VALUE;
 
1246
                                                        } else {
 
1247
                                                                gboolean _tmp25_;
 
1248
                                                                _tmp25_ = g_unichar_isprint (c);
 
1249
                                                                if (_tmp25_) {
 
1250
                                                                        g_string_append_unichar (tag_value, c);
 
1251
                                                                        in_escape = FALSE;
 
1252
                                                                } else {
 
1253
                                                                        state = STATE_ERROR;
 
1254
                                                                }
 
1255
                                                        }
 
1256
                                                }
 
1257
                                                break;
 
1258
                                        }
 
1259
                                        case STATE_POST_TAG_VALUE:
 
1260
                                        {
 
1261
                                                gboolean _tmp26_;
 
1262
                                                _tmp26_ = g_unichar_isspace (c);
 
1263
                                                if (_tmp26_) {
 
1264
                                                        continue;
 
1265
                                                } else {
 
1266
                                                        if (c == ']') {
 
1267
                                                                gchar* _tmp27_;
 
1268
                                                                gchar* _tmp28_;
 
1269
                                                                _tmp27_ = g_strdup (tag_name);
 
1270
                                                                _tmp28_ = g_strdup (tag_value->str);
 
1271
                                                                g_hash_table_insert (game->tags, _tmp27_, _tmp28_);
 
1272
                                                                state = STATE_TAGS;
 
1273
                                                        } else {
 
1274
                                                                state = STATE_ERROR;
 
1275
                                                        }
 
1276
                                                }
 
1277
                                                break;
 
1278
                                        }
 
1279
                                        case STATE_SYMBOL:
 
1280
                                        {
 
1281
                                                gboolean _tmp29_ = FALSE;
 
1282
                                                gboolean _tmp30_ = FALSE;
 
1283
                                                gboolean _tmp31_ = FALSE;
 
1284
                                                gboolean _tmp32_ = FALSE;
 
1285
                                                gboolean _tmp33_ = FALSE;
 
1286
                                                gboolean _tmp34_ = FALSE;
 
1287
                                                gboolean _tmp35_ = FALSE;
 
1288
                                                gboolean _tmp36_;
 
1289
                                                _tmp36_ = g_unichar_isalnum (c);
 
1290
                                                if (_tmp36_) {
 
1291
                                                        _tmp35_ = TRUE;
 
1292
                                                } else {
 
1293
                                                        _tmp35_ = c == '_';
 
1294
                                                }
 
1295
                                                if (_tmp35_) {
 
1296
                                                        _tmp34_ = TRUE;
 
1297
                                                } else {
 
1298
                                                        _tmp34_ = c == '+';
 
1299
                                                }
 
1300
                                                if (_tmp34_) {
 
1301
                                                        _tmp33_ = TRUE;
 
1302
                                                } else {
 
1303
                                                        _tmp33_ = c == '#';
 
1304
                                                }
 
1305
                                                if (_tmp33_) {
 
1306
                                                        _tmp32_ = TRUE;
 
1307
                                                } else {
 
1308
                                                        _tmp32_ = c == '=';
 
1309
                                                }
 
1310
                                                if (_tmp32_) {
 
1311
                                                        _tmp31_ = TRUE;
 
1312
                                                } else {
 
1313
                                                        _tmp31_ = c == ':';
 
1314
                                                }
 
1315
                                                if (_tmp31_) {
 
1316
                                                        _tmp30_ = TRUE;
 
1317
                                                } else {
 
1318
                                                        _tmp30_ = c == '-';
 
1319
                                                }
 
1320
                                                if (_tmp30_) {
 
1321
                                                        _tmp29_ = TRUE;
 
1322
                                                } else {
 
1323
                                                        _tmp29_ = c == '/';
 
1324
                                                }
 
1325
                                                if (_tmp29_) {
 
1326
                                                        continue;
 
1327
                                                } else {
 
1328
                                                        gchar* _tmp37_ = NULL;
 
1329
                                                        gchar* symbol;
 
1330
                                                        gboolean is_number;
 
1331
                                                        gboolean _tmp42_ = FALSE;
 
1332
                                                        gboolean _tmp43_ = FALSE;
 
1333
                                                        _tmp37_ = string_slice (data, (glong) token_start, (glong) offset);
 
1334
                                                        symbol = _tmp37_;
 
1335
                                                        is_number = TRUE;
 
1336
                                                        {
 
1337
                                                                gint i;
 
1338
                                                                i = 0;
 
1339
                                                                {
 
1340
                                                                        gboolean _tmp38_;
 
1341
                                                                        _tmp38_ = TRUE;
 
1342
                                                                        while (TRUE) {
 
1343
                                                                                gint _tmp39_;
 
1344
                                                                                gchar _tmp40_;
 
1345
                                                                                gboolean _tmp41_;
 
1346
                                                                                if (!_tmp38_) {
 
1347
                                                                                        i++;
 
1348
                                                                                }
 
1349
                                                                                _tmp38_ = FALSE;
 
1350
                                                                                _tmp39_ = strlen (symbol);
 
1351
                                                                                if (!(i < _tmp39_)) {
 
1352
                                                                                        break;
 
1353
                                                                                }
 
1354
                                                                                _tmp40_ = string_get (symbol, (glong) i);
 
1355
                                                                                _tmp41_ = g_ascii_isdigit (_tmp40_);
 
1356
                                                                                if (!_tmp41_) {
 
1357
                                                                                        is_number = FALSE;
 
1358
                                                                                }
 
1359
                                                                        }
 
1360
                                                                }
 
1361
                                                        }
 
1362
                                                        state = STATE_MOVE_TEXT;
 
1363
                                                        offset--;
 
1364
                                                        if (g_strcmp0 (symbol, pgn_game_RESULT_DRAW) == 0) {
 
1365
                                                                _tmp43_ = TRUE;
 
1366
                                                        } else {
 
1367
                                                                _tmp43_ = g_strcmp0 (symbol, pgn_game_RESULT_WHITE) == 0;
 
1368
                                                        }
 
1369
                                                        if (_tmp43_) {
 
1370
                                                                _tmp42_ = TRUE;
 
1371
                                                        } else {
 
1372
                                                                _tmp42_ = g_strcmp0 (symbol, pgn_game_RESULT_BLACK) == 0;
 
1373
                                                        }
 
1374
                                                        if (_tmp42_) {
 
1375
                                                                if (rav_level == 0) {
 
1376
                                                                        PGNGame* _tmp44_;
 
1377
                                                                        PGNGame* _tmp45_ = NULL;
 
1378
                                                                        pgn_game_set_result (game, symbol);
 
1379
                                                                        _tmp44_ = _pgn_game_ref0 (game);
 
1380
                                                                        self->games = g_list_append (self->games, _tmp44_);
 
1381
                                                                        _tmp45_ = pgn_game_new ();
 
1382
                                                                        _pgn_game_unref0 (game);
 
1383
                                                                        game = _tmp45_;
 
1384
                                                                        state = STATE_TAGS;
 
1385
                                                                }
 
1386
                                                        } else {
 
1387
                                                                if (!is_number) {
 
1388
                                                                        if (rav_level == 0) {
 
1389
                                                                                gchar* _tmp46_;
 
1390
                                                                                _tmp46_ = g_strdup (symbol);
 
1391
                                                                                game->moves = g_list_append (game->moves, _tmp46_);
 
1392
                                                                        }
 
1393
                                                                }
 
1394
                                                        }
 
1395
                                                        _g_free0 (symbol);
 
1396
                                                }
 
1397
                                                break;
 
1398
                                        }
 
1399
                                        case STATE_PERIOD:
 
1400
                                        {
 
1401
                                                state = STATE_MOVE_TEXT;
 
1402
                                                break;
 
1403
                                        }
 
1404
                                        case STATE_NAG:
 
1405
                                        {
 
1406
                                                gboolean _tmp47_;
 
1407
                                                _tmp47_ = g_unichar_isdigit (c);
 
1408
                                                if (_tmp47_) {
 
1409
                                                        continue;
 
1410
                                                } else {
 
1411
                                                        state = STATE_MOVE_TEXT;
 
1412
                                                        offset--;
 
1413
                                                }
 
1414
                                                break;
 
1415
                                        }
 
1416
                                        case STATE_ERROR:
 
1417
                                        {
 
1418
                                                gsize char_offset;
 
1419
                                                gchar* _tmp48_ = NULL;
 
1420
                                                gchar* _tmp49_;
 
1421
                                                char_offset = (offset - line_offset) - 1;
 
1422
                                                fprintf (stderr, "%d.%d: error: Unexpected character\n", line, (gint) (char_offset + 1));
 
1423
                                                _tmp48_ = string_slice (data, (glong) line_offset, (glong) offset);
 
1424
                                                _tmp49_ = _tmp48_;
 
1425
                                                fprintf (stderr, "%s\n", _tmp49_);
 
1426
                                                _g_free0 (_tmp49_);
 
1427
                                                {
 
1428
                                                        gint i;
 
1429
                                                        i = 0;
 
1430
                                                        {
 
1431
                                                                gboolean _tmp50_;
 
1432
                                                                _tmp50_ = TRUE;
 
1433
                                                                while (TRUE) {
 
1434
                                                                        if (!_tmp50_) {
 
1435
                                                                                i++;
 
1436
                                                                        }
 
1437
                                                                        _tmp50_ = FALSE;
 
1438
                                                                        if (!(i < char_offset)) {
 
1439
                                                                                break;
 
1440
                                                                        }
 
1441
                                                                        fprintf (stderr, " ");
 
1442
                                                                }
 
1443
                                                        }
 
1444
                                                }
 
1445
                                                fprintf (stderr, "^\n");
 
1446
                                                _g_string_free0 (tag_value);
 
1447
                                                _g_free0 (tag_name);
 
1448
                                                _pgn_game_unref0 (game);
 
1449
                                                return self;
 
1450
                                        }
 
1451
                                        default:
 
1452
                                        break;
 
1453
                                }
 
1454
                        }
 
1455
                }
 
1456
        }
 
1457
        _tmp52_ = g_list_length (game->moves);
 
1458
        if (_tmp52_ > 0) {
 
1459
                _tmp51_ = TRUE;
 
1460
        } else {
 
1461
                guint _tmp53_;
 
1462
                _tmp53_ = g_hash_table_size (game->tags);
 
1463
                _tmp51_ = _tmp53_ > 0;
 
1464
        }
 
1465
        if (_tmp51_) {
 
1466
                PGNGame* _tmp54_;
 
1467
                _tmp54_ = _pgn_game_ref0 (game);
 
1468
                self->games = g_list_append (self->games, _tmp54_);
 
1469
        }
 
1470
        if (self->games == NULL) {
 
1471
                GError* _tmp55_ = NULL;
 
1472
                _tmp55_ = g_error_new_literal (PGN_ERROR, PGN_ERROR_LOAD_ERROR, "No games in PGN file");
 
1473
                _inner_error_ = _tmp55_;
 
1474
                if (_inner_error_->domain == PGN_ERROR) {
 
1475
                        g_propagate_error (error, _inner_error_);
 
1476
                        _g_string_free0 (tag_value);
 
1477
                        _g_free0 (tag_name);
 
1478
                        _pgn_game_unref0 (game);
 
1479
                        _pgn_unref0 (self);
 
1480
                        return NULL;
 
1481
                } else {
 
1482
                        _g_string_free0 (tag_value);
 
1483
                        _g_free0 (tag_name);
 
1484
                        _pgn_game_unref0 (game);
 
1485
                        g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code);
 
1486
                        g_clear_error (&_inner_error_);
 
1487
                        return NULL;
 
1488
                }
 
1489
        }
 
1490
        _g_string_free0 (tag_value);
 
1491
        _g_free0 (tag_name);
 
1492
        _pgn_game_unref0 (game);
 
1493
        return self;
 
1494
}
 
1495
 
 
1496
 
 
1497
PGN* pgn_new_from_string (const gchar* data, GError** error) {
 
1498
        return pgn_construct_from_string (TYPE_PGN, data, error);
 
1499
}
 
1500
 
 
1501
 
 
1502
PGN* pgn_construct_from_file (GType object_type, GFile* file, GError** error) {
 
1503
        PGN* self = NULL;
 
1504
        gchar* contents = NULL;
 
1505
        gsize n_read = 0UL;
 
1506
        gchar* _tmp0_ = NULL;
 
1507
        gsize _tmp1_;
 
1508
        GError * _inner_error_ = NULL;
 
1509
        g_return_val_if_fail (file != NULL, NULL);
 
1510
        self = (PGN*) g_type_create_instance (object_type);
 
1511
        g_file_load_contents (file, NULL, &_tmp0_, &_tmp1_, NULL, &_inner_error_);
 
1512
        _g_free0 (contents);
 
1513
        contents = _tmp0_;
 
1514
        n_read = _tmp1_;
 
1515
        if (_inner_error_ != NULL) {
 
1516
                g_propagate_error (error, _inner_error_);
 
1517
                _g_free0 (contents);
 
1518
                _pgn_unref0 (self);
 
1519
                return NULL;
 
1520
        }
 
1521
        self = (PGN*) pgn_construct_from_string (object_type, contents, &_inner_error_);
 
1522
        if (_inner_error_ != NULL) {
 
1523
                g_propagate_error (error, _inner_error_);
 
1524
                _g_free0 (contents);
 
1525
                _pgn_unref0 (self);
 
1526
                return NULL;
 
1527
        }
 
1528
        _g_free0 (contents);
 
1529
        return self;
 
1530
}
 
1531
 
 
1532
 
 
1533
PGN* pgn_new_from_file (GFile* file, GError** error) {
 
1534
        return pgn_construct_from_file (TYPE_PGN, file, error);
 
1535
}
 
1536
 
 
1537
 
 
1538
static void value_pgn_init (GValue* value) {
 
1539
        value->data[0].v_pointer = NULL;
 
1540
}
 
1541
 
 
1542
 
 
1543
static void value_pgn_free_value (GValue* value) {
 
1544
        if (value->data[0].v_pointer) {
 
1545
                pgn_unref (value->data[0].v_pointer);
 
1546
        }
 
1547
}
 
1548
 
 
1549
 
 
1550
static void value_pgn_copy_value (const GValue* src_value, GValue* dest_value) {
 
1551
        if (src_value->data[0].v_pointer) {
 
1552
                dest_value->data[0].v_pointer = pgn_ref (src_value->data[0].v_pointer);
 
1553
        } else {
 
1554
                dest_value->data[0].v_pointer = NULL;
 
1555
        }
 
1556
}
 
1557
 
 
1558
 
 
1559
static gpointer value_pgn_peek_pointer (const GValue* value) {
 
1560
        return value->data[0].v_pointer;
 
1561
}
 
1562
 
 
1563
 
 
1564
static gchar* value_pgn_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
 
1565
        if (collect_values[0].v_pointer) {
 
1566
                PGN* object;
 
1567
                object = collect_values[0].v_pointer;
 
1568
                if (object->parent_instance.g_class == NULL) {
 
1569
                        return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
 
1570
                } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
 
1571
                        return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
 
1572
                }
 
1573
                value->data[0].v_pointer = pgn_ref (object);
 
1574
        } else {
 
1575
                value->data[0].v_pointer = NULL;
 
1576
        }
 
1577
        return NULL;
 
1578
}
 
1579
 
 
1580
 
 
1581
static gchar* value_pgn_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
 
1582
        PGN** object_p;
 
1583
        object_p = collect_values[0].v_pointer;
 
1584
        if (!object_p) {
 
1585
                return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
 
1586
        }
 
1587
        if (!value->data[0].v_pointer) {
 
1588
                *object_p = NULL;
 
1589
        } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
 
1590
                *object_p = value->data[0].v_pointer;
 
1591
        } else {
 
1592
                *object_p = pgn_ref (value->data[0].v_pointer);
 
1593
        }
 
1594
        return NULL;
 
1595
}
 
1596
 
 
1597
 
 
1598
GParamSpec* param_spec_pgn (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
 
1599
        ParamSpecPGN* spec;
 
1600
        g_return_val_if_fail (g_type_is_a (object_type, TYPE_PGN), NULL);
 
1601
        spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
 
1602
        G_PARAM_SPEC (spec)->value_type = object_type;
 
1603
        return G_PARAM_SPEC (spec);
 
1604
}
 
1605
 
 
1606
 
 
1607
gpointer value_get_pgn (const GValue* value) {
 
1608
        g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PGN), NULL);
 
1609
        return value->data[0].v_pointer;
 
1610
}
 
1611
 
 
1612
 
 
1613
void value_set_pgn (GValue* value, gpointer v_object) {
 
1614
        PGN* old;
 
1615
        g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PGN));
 
1616
        old = value->data[0].v_pointer;
 
1617
        if (v_object) {
 
1618
                g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PGN));
 
1619
                g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
 
1620
                value->data[0].v_pointer = v_object;
 
1621
                pgn_ref (value->data[0].v_pointer);
 
1622
        } else {
 
1623
                value->data[0].v_pointer = NULL;
 
1624
        }
 
1625
        if (old) {
 
1626
                pgn_unref (old);
 
1627
        }
 
1628
}
 
1629
 
 
1630
 
 
1631
void value_take_pgn (GValue* value, gpointer v_object) {
 
1632
        PGN* old;
 
1633
        g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_PGN));
 
1634
        old = value->data[0].v_pointer;
 
1635
        if (v_object) {
 
1636
                g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_PGN));
 
1637
                g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
 
1638
                value->data[0].v_pointer = v_object;
 
1639
        } else {
 
1640
                value->data[0].v_pointer = NULL;
 
1641
        }
 
1642
        if (old) {
 
1643
                pgn_unref (old);
 
1644
        }
 
1645
}
 
1646
 
 
1647
 
 
1648
static void pgn_class_init (PGNClass * klass) {
 
1649
        pgn_parent_class = g_type_class_peek_parent (klass);
 
1650
        PGN_CLASS (klass)->finalize = pgn_finalize;
 
1651
}
 
1652
 
 
1653
 
 
1654
static void pgn_instance_init (PGN * self) {
 
1655
        self->ref_count = 1;
 
1656
}
 
1657
 
 
1658
 
 
1659
static void pgn_finalize (PGN* obj) {
 
1660
        PGN * self;
 
1661
        self = PGN (obj);
 
1662
        __g_list_free__pgn_game_unref0_0 (self->games);
 
1663
}
 
1664
 
 
1665
 
 
1666
GType pgn_get_type (void) {
 
1667
        static volatile gsize pgn_type_id__volatile = 0;
 
1668
        if (g_once_init_enter (&pgn_type_id__volatile)) {
 
1669
                static const GTypeValueTable g_define_type_value_table = { value_pgn_init, value_pgn_free_value, value_pgn_copy_value, value_pgn_peek_pointer, "p", value_pgn_collect_value, "p", value_pgn_lcopy_value };
 
1670
                static const GTypeInfo g_define_type_info = { sizeof (PGNClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) pgn_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (PGN), 0, (GInstanceInitFunc) pgn_instance_init, &g_define_type_value_table };
 
1671
                static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
 
1672
                GType pgn_type_id;
 
1673
                pgn_type_id = g_type_register_fundamental (g_type_fundamental_next (), "PGN", &g_define_type_info, &g_define_type_fundamental_info, 0);
 
1674
                g_once_init_leave (&pgn_type_id__volatile, pgn_type_id);
 
1675
        }
 
1676
        return pgn_type_id__volatile;
 
1677
}
 
1678
 
 
1679
 
 
1680
gpointer pgn_ref (gpointer instance) {
 
1681
        PGN* self;
 
1682
        self = instance;
 
1683
        g_atomic_int_inc (&self->ref_count);
 
1684
        return instance;
 
1685
}
 
1686
 
 
1687
 
 
1688
void pgn_unref (gpointer instance) {
 
1689
        PGN* self;
 
1690
        self = instance;
 
1691
        if (g_atomic_int_dec_and_test (&self->ref_count)) {
 
1692
                PGN_GET_CLASS (self)->finalize (self);
 
1693
                g_type_free_instance ((GTypeInstance *) self);
 
1694
        }
 
1695
}
 
1696
 
 
1697
 
 
1698