annotate sidlib.c @ 341:fe061ead51cc

Perform character set conversion after item formatting step instead of before it. This should remedy the potential issue of formatting not taking UTF8 multibyte into account, as our formatting unfortunately does not support multibyte encoding. This way the data should stay in ISO-8859-1 format just up to outputting it.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 13 Jan 2020 16:29:47 +0200
parents 629876cc0540
children c2ebcb0f0d62
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
1 /*
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
2 * SIDInfoLib - Way too simplistic PSID/RSID file library
171
d86ade7d0dfd Change copyright blurbs slightly.
Matti Hamalainen <ccr@tnsp.org>
parents: 170
diff changeset
3 * Programmed and designed by Matti 'ccr' Hämäläinen <ccr@tnsp.org>
227
2b3d5d49086d Bump copyright years.
Matti Hamalainen <ccr@tnsp.org>
parents: 226
diff changeset
4 * (C) Copyright 2014-2020 Tecnic Software productions (TNSP)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
5 */
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
6 #include "sidlib.h"
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
7 #include "th_endian.h"
85
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
8 #include "th_string.h"
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
9
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
10
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
11 static char *sidlib_strdup_convert(SIDLibChConvCtx *chconv, const char *str)
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
12 {
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
13 if (chconv != NULL)
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
14 return chconv->convert(chconv, str);
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
15 else
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
16 return th_strdup(str);
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
17 }
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
18
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
19
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
20 static BOOL sidlib_fread_str(th_ioctx *ctx, SIDLibChConvCtx *chconv, char **str, const size_t len)
128
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
21 {
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
22 char *tmp;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
23
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
24 if ((*str = tmp = th_malloc(len + 1)) == NULL)
232
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
25 {
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
26 th_io_error(ctx, THERR_MALLOC,
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
27 "Could not allocate %" PRIu_SIZE_T " bytes for a string.",
232
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
28 len);
128
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
29 goto err;
232
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
30 }
128
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
31
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
32 if (!thfread_str(ctx, tmp, len))
232
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
33 {
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
34 th_io_error(ctx, THERR_FREAD,
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
35 "Could not read %" PRIu_SIZE_T " bytes from file.",
232
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
36 len);
128
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
37 goto err;
232
03b6f8604a7f Minor error handling improvements.
Matti Hamalainen <ccr@tnsp.org>
parents: 231
diff changeset
38 }
128
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
39
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
40 tmp[len] = 0;
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
41
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
42 if (chconv != NULL)
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
43 {
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
44 *str = chconv->convert(chconv, tmp);
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
45 th_free(tmp);
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
46 }
128
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
47 return TRUE;
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
48
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
49 err:
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
50 th_free(tmp);
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
51 return FALSE;
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
52 }
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
53
2636185649c6 Add si_fread_str() helper function.
Matti Hamalainen <ccr@tnsp.org>
parents: 126
diff changeset
54
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
55 static int sidlib_read_hash_data(th_ioctx *ctx, SIDLibPSIDHeader *psid,
166
e6c8a235ce2f Fix the load address handling in case of new SLDB format.
Matti Hamalainen <ccr@tnsp.org>
parents: 163
diff changeset
56 th_md5state_t *state, const BOOL newSLDB)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
57 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
58 int ret = THERR_OK;
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
59 uint8_t *data = NULL;
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
60 BOOL first = TRUE;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
61 size_t read;
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
62
230
1e860046a4cc Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 228
diff changeset
63 if ((data = (uint8_t *) th_malloc(SIDLIB_BUFFER_SIZE)) == NULL)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
64 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
65 ret = th_io_error(ctx, THERR_MALLOC,
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
66 "Error allocating temporary data buffer of %d bytes.",
230
1e860046a4cc Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 228
diff changeset
67 SIDLIB_BUFFER_SIZE);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
68 goto exit;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
69 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
70
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
71 psid->dataSize = 0;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
72 do
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
73 {
230
1e860046a4cc Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 228
diff changeset
74 read = thfread(data, sizeof(uint8_t), SIDLIB_BUFFER_SIZE, ctx);
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
75 psid->dataSize += read;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
76
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
77 // If load address is 0 in header and we have the first block, grab it
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
78 if (first && psid->loadAddress == 0)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
79 {
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
80 if (read < 4)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
81 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
82 ret = th_io_error(ctx, THERR_FREAD,
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
83 "Error reading song data, unexpectedly small file.");
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
84 goto exit;
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
85 }
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
86
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
87 // Grab the load address
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
88 psid->loadAddress = TH_LE16_TO_NATIVE(*(uint16_t *) data);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
89
203
b4a349f1c2f4 Actually fix the load address handling in hash calculation.
Matti Hamalainen <ccr@tnsp.org>
parents: 185
diff changeset
90 // .. do not include the load address to the hash if NEW SLDB format
166
e6c8a235ce2f Fix the load address handling in case of new SLDB format.
Matti Hamalainen <ccr@tnsp.org>
parents: 163
diff changeset
91 if (newSLDB)
203
b4a349f1c2f4 Actually fix the load address handling in hash calculation.
Matti Hamalainen <ccr@tnsp.org>
parents: 185
diff changeset
92 th_md5_append(state, &data[2], read - 2);
b4a349f1c2f4 Actually fix the load address handling in hash calculation.
Matti Hamalainen <ccr@tnsp.org>
parents: 185
diff changeset
93 else
166
e6c8a235ce2f Fix the load address handling in case of new SLDB format.
Matti Hamalainen <ccr@tnsp.org>
parents: 163
diff changeset
94 th_md5_append(state, data, read);
e6c8a235ce2f Fix the load address handling in case of new SLDB format.
Matti Hamalainen <ccr@tnsp.org>
parents: 163
diff changeset
95
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
96 first = FALSE;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
97 }
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
98 else
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
99 if (read > 0)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
100 {
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
101 // Append data "as is"
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
102 th_md5_append(state, data, read);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
103 }
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
104 } while (read > 0 && !thfeof(ctx));
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
105
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
106 exit:
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
107 th_free(data);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
108 return ret;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
109 }
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
110
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
111
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
112 int sidlib_read_sid_file(th_ioctx *ctx, SIDLibPSIDHeader *psid,
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
113 const BOOL newSLDB, SIDLibChConvCtx *chconv)
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
114 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
115 int ret = THERR_OK;
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
116 th_md5state_t state;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
117 off_t hdrStart, hdrEnd;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
118
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
119 hdrStart = thftell(ctx);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
120
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
121 // Read PSID header in
223
a76276ff7ba8 Rename PSID_* constant defines to SIDLIB_PSID_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 222
diff changeset
122 if (!thfread_str(ctx, (uint8_t *) psid->magic, SIDLIB_PSID_MAGIC_LEN) ||
85
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
123 !thfread_be16(ctx, &psid->version) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
124 !thfread_be16(ctx, &psid->dataOffset) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
125 !thfread_be16(ctx, &psid->loadAddress) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
126 !thfread_be16(ctx, &psid->initAddress) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
127 !thfread_be16(ctx, &psid->playAddress) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
128 !thfread_be16(ctx, &psid->nSongs) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
129 !thfread_be16(ctx, &psid->startSong) ||
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
130 !thfread_be32(ctx, &psid->speed))
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
131 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
132 ret = th_io_error(ctx, ctx->status,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
133 "Could not read PSID/RSID header.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
134 goto exit;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
135 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
136
223
a76276ff7ba8 Rename PSID_* constant defines to SIDLIB_PSID_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 222
diff changeset
137 psid->magic[SIDLIB_PSID_MAGIC_LEN] = 0;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
138
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
139 if ((psid->magic[0] != 'R' && psid->magic[0] != 'P') ||
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
140 psid->magic[1] != 'S' || psid->magic[2] != 'I' || psid->magic[3] != 'D' ||
133
9cfa0553e7f9 Add support for reading PSID/RSID v4 in sidlib.
Matti Hamalainen <ccr@tnsp.org>
parents: 132
diff changeset
141 psid->version < 1 || psid->version > 4)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
142 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
143 ret = th_io_error(ctx, THERR_NOT_SUPPORTED,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
144 "Not a supported PSID or RSID file.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
145 goto exit;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
146 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
147
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
148 psid->isRSID = psid->magic[0] == 'R';
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
149
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
150 if (!sidlib_fread_str(ctx, chconv, &psid->sidName, SIDLIB_PSID_STR_LEN) ||
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
151 !sidlib_fread_str(ctx, chconv, &psid->sidAuthor, SIDLIB_PSID_STR_LEN) ||
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
152 !sidlib_fread_str(ctx, chconv, &psid->sidCopyright, SIDLIB_PSID_STR_LEN))
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
153 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
154 ret = th_io_error(ctx, ctx->status,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
155 "Error reading SID file header data.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
156 goto exit;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
157 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
158
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
159 // Check if we need to load PSIDv2NG header ...
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
160 if (psid->version >= 2)
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
161 {
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
162 // Yes, we need to
85
4c0ecb078591 Rename various variables and functions and change relevant places to use the
Matti Hamalainen <ccr@tnsp.org>
parents: 77
diff changeset
163 if (!thfread_be16(ctx, &psid->flags) ||
98
d9f38d657433 Match with th-libs API change.
Matti Hamalainen <ccr@tnsp.org>
parents: 95
diff changeset
164 !thfread_u8(ctx, &psid->startPage) ||
d9f38d657433 Match with th-libs API change.
Matti Hamalainen <ccr@tnsp.org>
parents: 95
diff changeset
165 !thfread_u8(ctx, &psid->pageLength) ||
133
9cfa0553e7f9 Add support for reading PSID/RSID v4 in sidlib.
Matti Hamalainen <ccr@tnsp.org>
parents: 132
diff changeset
166 !thfread_u8(ctx, &psid->sid2Addr) ||
9cfa0553e7f9 Add support for reading PSID/RSID v4 in sidlib.
Matti Hamalainen <ccr@tnsp.org>
parents: 132
diff changeset
167 !thfread_u8(ctx, &psid->sid3Addr))
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
168 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
169 ret = th_io_error(ctx, ctx->status,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
170 "Error reading PSID/RSID v2+ extra header data.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
171 goto exit;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
172 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
173 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
174
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
175 hdrEnd = thftell(ctx);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
176
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
177 // Initialize MD5-hash calculation
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
178 th_md5_init(&state);
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
179
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
180 if (newSLDB)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
181 {
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
182 // New Songlengths.md5 style hash calculation:
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
183 // We just hash the whole file, so seek back to beginning ..
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
184 thfseek(ctx, hdrStart, SEEK_SET);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
185
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
186 if ((ret = sidlib_read_hash_data(ctx, psid, &state, FALSE)) != THERR_OK)
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
187 goto exit;
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
188
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
189 psid->dataSize -= hdrEnd - hdrStart;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
190 }
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
191 else
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
192 {
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
193 // "Old" Songlengths.txt style MD5 hash calculation
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
194 // We need to separately hash data etc.
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
195 if ((ret = sidlib_read_hash_data(ctx, psid, &state, TRUE)) != THERR_OK)
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
196 goto exit;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
197
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
198 // Append header data to hash
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
199 th_md5_append_le16(&state, psid->initAddress);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
200 th_md5_append_le16(&state, psid->playAddress);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
201 th_md5_append_le16(&state, psid->nSongs);
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
202
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
203 // Append song speed data to hash
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
204 uint8_t tmp8 = psid->isRSID ? 60 : 0;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
205 for (int index = 0; index < psid->nSongs && index < 32; index++)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
206 {
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
207 if (psid->isRSID)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
208 tmp8 = 60;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
209 else
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
210 tmp8 = (psid->speed & (1 << index)) ? 60 : 0;
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
211
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
212 th_md5_append(&state, &tmp8, sizeof(tmp8));
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
213 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
214
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
215 // Rest of songs (more than 32)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
216 for (int index = 32; index < psid->nSongs; index++)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
217 th_md5_append(&state, &tmp8, sizeof(tmp8));
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
218
163
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
219 // PSIDv2NG specific
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
220 if (psid->version >= 2)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
221 {
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
222 // REFER TO SIDPLAY HEADERS FOR MORE INFORMATION
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
223 tmp8 = (psid->flags >> 2) & 3;
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
224 if (tmp8 == 2)
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
225 th_md5_append(&state, &tmp8, sizeof(tmp8));
179ffe97599c Implement support for the "new" MD5 format of SLDB.
Matti Hamalainen <ccr@tnsp.org>
parents: 162
diff changeset
226 }
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
227 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
228
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
229 // Calculate the hash
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
230 th_md5_finish(&state, psid->hash);
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
231
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
232 exit:
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
233 return ret;
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
234 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
235
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
236
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
237 int sidlib_read_sid_file_alloc(th_ioctx *ctx, SIDLibPSIDHeader **ppsid,
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
238 const BOOL newSLDB, SIDLibChConvCtx *chconv)
226
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
239 {
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
240 if ((*ppsid = th_malloc0(sizeof(SIDLibPSIDHeader))) == NULL)
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
241 return THERR_MALLOC;
228
1962b236d596 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 227
diff changeset
242
226
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
243 (*ppsid)->allocated = TRUE;
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
244
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
245 return sidlib_read_sid_file(ctx, *ppsid, newSLDB, chconv);
226
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
246 }
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
247
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
248
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
249 void sidlib_free_sid_file(SIDLibPSIDHeader *psid)
126
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
250 {
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
251 if (psid != NULL)
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
252 {
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
253 th_free(psid->sidName);
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
254 th_free(psid->sidAuthor);
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
255 th_free(psid->sidCopyright);
228
1962b236d596 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 227
diff changeset
256
226
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
257 if (psid->allocated)
c32015f4969e Rename PSIDHeader struct to SIDLibPSIDHeader to conform with the SIDLib
Matti Hamalainen <ccr@tnsp.org>
parents: 224
diff changeset
258 th_free(psid);
126
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
259 }
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
260 }
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
261
c1462b7880e8 Make si_read_sid_file() to allocate the PSIDHeader struct itself, adjust
Matti Hamalainen <ccr@tnsp.org>
parents: 104
diff changeset
262
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
263 const char *sidlib_get_sid_clock_str(const int flags)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
264 {
132
b3e034b8c4b9 Change how certain flags (for SID model and clock) are handled.
Matti Hamalainen <ccr@tnsp.org>
parents: 131
diff changeset
265 switch (flags)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
266 {
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
267 case PSF_CLOCK_UNKNOWN : return "Unknown";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
268 case PSF_CLOCK_PAL : return "PAL 50Hz";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
269 case PSF_CLOCK_NTSC : return "NTSC 60Hz";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
270 case PSF_CLOCK_ANY : return "PAL / NTSC";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
271 default : return "?";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
272 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
273 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
274
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
275
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
276 const char *sidlib_get_sid_model_str(const int flags)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
277 {
132
b3e034b8c4b9 Change how certain flags (for SID model and clock) are handled.
Matti Hamalainen <ccr@tnsp.org>
parents: 131
diff changeset
278 switch (flags)
70
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
279 {
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
280 case PSF_MODEL_UNKNOWN : return "Unknown";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
281 case PSF_MODEL_MOS6581 : return "MOS6581";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
282 case PSF_MODEL_MOS8580 : return "MOS8580";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
283 case PSF_MODEL_ANY : return "MOS6581 / MOS8580";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
284 default : return "?";
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
285 }
4779bbec2f28 Split some functionality into sidlib.[ch].
Matti Hamalainen <ccr@tnsp.org>
parents:
diff changeset
286 }
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
287
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
288
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
289 // Free memory allocated for given SLDB node
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
290 //
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
291 static void sidlib_sldb_node_free(SIDLibSLDBNode *node)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
292 {
170
2ba504fc8797 NULL checks.
Matti Hamalainen <ccr@tnsp.org>
parents: 169
diff changeset
293 if (node != NULL)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
294 {
256
7fdcacbdfc00 Not using th_free_r() here.
Matti Hamalainen <ccr@tnsp.org>
parents: 255
diff changeset
295 th_free(node->lengths);
7fdcacbdfc00 Not using th_free_r() here.
Matti Hamalainen <ccr@tnsp.org>
parents: 255
diff changeset
296 th_free(node);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
297 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
298 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
299
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
300
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
301 // Parse a time-entry in SLDB format
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
302 //
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
303 static int sidlib_sldb_get_value(const char *str, size_t *pos)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
304 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
305 int result = 0;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
306
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
307 while (isdigit(str[*pos]))
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
308 result = (result * 10) + (str[(*pos)++] - '0');
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
309
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
310 return result;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
311 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
312
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
313
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
314 static int sidlib_sldb_gettime(const char *str, size_t *pos)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
315 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
316 int result;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
317
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
318 // Check if it starts with a digit
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
319 if (th_isdigit(str[*pos]))
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
320 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
321 // Get minutes-field
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
322 result = sidlib_sldb_get_value(str, pos) * 60;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
323
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
324 // Check the field separator char
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
325 if (str[*pos] == ':')
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
326 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
327 // Get seconds-field
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
328 (*pos)++;
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
329 result += sidlib_sldb_get_value(str, pos);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
330 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
331 else
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
332 result = -2;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
333 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
334 else
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
335 result = -1;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
336
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
337 // Ignore and skip the possible attributes
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
338 while (str[*pos] && !th_isspace(str[*pos]))
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
339 (*pos)++;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
340
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
341 return result;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
342 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
343
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
344
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
345 // Parse one SLDB definition line, return SLDB node
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
346 //
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
347 static int sidlib_sldb_parse_entry(th_ioctx *ctx, SIDLibSLDBNode **pnode, const char *line)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
348 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
349 int ret = THERR_OK;
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
350 SIDLibSLDBNode *node;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
351 size_t pos, tmpLen, savePos;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
352 BOOL isOK;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
353 int i;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
354
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
355 // Allocate new node
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
356 if ((*pnode = node = (SIDLibSLDBNode *) th_malloc0(sizeof(SIDLibSLDBNode))) == NULL)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
357 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
358 ret = th_io_error(ctx, THERR_MALLOC,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
359 "Error allocating new SLDB node.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
360 goto exit;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
361 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
362
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
363 // Get hash value
160
27365eae837b Cleanup.
Matti Hamalainen <ccr@tnsp.org>
parents: 133
diff changeset
364 for (pos = 0, i = 0; i < TH_MD5HASH_LENGTH; i++, pos += 2)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
365 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
366 unsigned int tmpu;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
367 sscanf(&line[pos], "%2x", &tmpu);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
368 node->hash[i] = tmpu;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
369 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
370
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
371 // Get playtimes
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
372 th_findnext(line, &pos);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
373 if (line[pos] != '=')
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
374 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
375 ret = th_io_error(ctx, THERR_INVALID_DATA,
292
6454bfb584d6 Fix some format strings to use proper PRIu_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents: 266
diff changeset
376 "'=' expected on column #%" PRIu_SIZE_T ".",
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
377 pos);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
378 goto exit;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
379 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
380
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
381 // First playtime is after '='
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
382 savePos = ++pos;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
383 tmpLen = strlen(line);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
384
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
385 // Get number of sub-tune lengths
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
386 isOK = TRUE;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
387 while (pos < tmpLen && isOK)
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
388 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
389 th_findnext(line, &pos);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
390
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
391 if (sidlib_sldb_gettime(line, &pos) >= 0)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
392 node->nlengths++;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
393 else
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
394 isOK = FALSE;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
395 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
396
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
397 // Allocate memory for lengths
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
398 if (node->nlengths == 0)
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
399 {
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
400 ret = THERR_OK;
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
401 goto exit;
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
402 }
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
403
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
404 if ((node->lengths = (int *) th_calloc(node->nlengths, sizeof(int))) == NULL)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
405 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
406 ret = th_io_error(ctx, THERR_MALLOC,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
407 "Error allocating SLDB entry length data.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
408 goto exit;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
409 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
410
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
411 // Read lengths in
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
412 for (i = 0, pos = savePos, isOK = TRUE;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
413 pos < tmpLen && i < node->nlengths && isOK; i++)
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
414 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
415 int l;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
416 th_findnext(line, &pos);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
417
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
418 l = sidlib_sldb_gettime(line, &pos);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
419
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
420 if (l >= 0)
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
421 node->lengths[i] = l;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
422 else
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
423 isOK = FALSE;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
424 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
425
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
426 return ret;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
427
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
428 exit:
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
429 sidlib_sldb_node_free(node);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
430 return ret;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
431 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
432
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
433
236
609bfc1bd628 Change sidlib_sldb_new() API to int sidlib_sldb_new(SIDLibSLDB **pdbh).
Matti Hamalainen <ccr@tnsp.org>
parents: 232
diff changeset
434 int sidlib_sldb_new(SIDLibSLDB **pdbh)
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
435 {
236
609bfc1bd628 Change sidlib_sldb_new() API to int sidlib_sldb_new(SIDLibSLDB **pdbh).
Matti Hamalainen <ccr@tnsp.org>
parents: 232
diff changeset
436 SIDLibSLDB *dbh;
609bfc1bd628 Change sidlib_sldb_new() API to int sidlib_sldb_new(SIDLibSLDB **pdbh).
Matti Hamalainen <ccr@tnsp.org>
parents: 232
diff changeset
437 if ((dbh = *pdbh = (SIDLibSLDB *) th_malloc0(sizeof(SIDLibSLDB))) == NULL)
609bfc1bd628 Change sidlib_sldb_new() API to int sidlib_sldb_new(SIDLibSLDB **pdbh).
Matti Hamalainen <ccr@tnsp.org>
parents: 232
diff changeset
438 return THERR_MALLOC;
609bfc1bd628 Change sidlib_sldb_new() API to int sidlib_sldb_new(SIDLibSLDB **pdbh).
Matti Hamalainen <ccr@tnsp.org>
parents: 232
diff changeset
439
609bfc1bd628 Change sidlib_sldb_new() API to int sidlib_sldb_new(SIDLibSLDB **pdbh).
Matti Hamalainen <ccr@tnsp.org>
parents: 232
diff changeset
440 return THERR_OK;
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
441 }
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
442
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
443
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
444 // Read SLDB database to memory
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
445 //
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
446 int sidlib_sldb_read(th_ioctx *ctx, SIDLibSLDB *dbh)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
447 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
448 int ret = THERR_OK;
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
449 char *line = NULL;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
450
230
1e860046a4cc Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 228
diff changeset
451 if ((line = th_malloc(SIDLIB_BUFFER_SIZE)) == NULL)
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
452 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
453 ret = th_io_error(ctx, THERR_MALLOC,
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
454 "Error allocating temporary data buffer of %d bytes.",
230
1e860046a4cc Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 228
diff changeset
455 SIDLIB_BUFFER_SIZE);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
456 goto exit;
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
457 }
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
458
230
1e860046a4cc Cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 228
diff changeset
459 while (thfgets(line, SIDLIB_BUFFER_SIZE, ctx) != NULL)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
460 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
461 SIDLibSLDBNode *tmnode;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
462 size_t pos = 0;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
463 ctx->line++;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
464
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
465 th_findnext(line, &pos);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
466
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
467 // Check if it is datafield
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
468 if (th_isxdigit(line[pos]))
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
469 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
470 // Check the length of the hash
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
471 int hashLen;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
472 for (hashLen = 0; line[pos] && th_isxdigit(line[pos]); hashLen++, pos++);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
473
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
474 if (hashLen != TH_MD5HASH_LENGTH_CH)
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
475 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
476 ret = th_io_error(ctx, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
477 "Invalid MD5-hash.");
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
478 goto exit;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
479 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
480 else
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
481 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
482 // Parse and add node to db
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
483 if ((ret = sidlib_sldb_parse_entry(ctx, &tmnode, line)) != THERR_OK)
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
484 goto exit;
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
485
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
486 th_llist_append_node((th_llist_t **) &dbh->nodes, (th_llist_t *) tmnode);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
487 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
488 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
489 else
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
490 if (line[pos] != ';' && line[pos] != '[' && line[pos] != 0)
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
491 {
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
492 ret = th_io_error(ctx, THERR_INVALID_DATA,
292
6454bfb584d6 Fix some format strings to use proper PRIu_SIZE_T where necessary.
Matti Hamalainen <ccr@tnsp.org>
parents: 266
diff changeset
493 "Invalid line / unexpected data at column #%" PRIu_SIZE_T ".",
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
494 pos);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
495 goto exit;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
496 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
497 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
498
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
499 exit:
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
500 th_free(line);
239
82540f819194 Clean up error handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 237
diff changeset
501 return ret;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
502 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
503
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
504
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
505 // Compare two given MD5-hashes.
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
506 // Return: 0 if equal
102
1362f00e4368 Rename function arguments.
Matti Hamalainen <ccr@tnsp.org>
parents: 101
diff changeset
507 // negative if hash1 < hash2
1362f00e4368 Rename function arguments.
Matti Hamalainen <ccr@tnsp.org>
parents: 101
diff changeset
508 // positive if hash1 > hash2
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
509 //
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
510 static int sidlib_sldb_compare_hash(th_md5hash_t hash1, th_md5hash_t hash2)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
511 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
512 int i, delta;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
513
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
514 for (i = delta = 0; i < TH_MD5HASH_LENGTH && !delta; i++)
102
1362f00e4368 Rename function arguments.
Matti Hamalainen <ccr@tnsp.org>
parents: 101
diff changeset
515 delta = hash1[i] - hash2[i];
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
516
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
517 return delta;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
518 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
519
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
520
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
521 // Compare two nodes.
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
522 // We assume here that we never ever get NULL-pointers.
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
523 static int sidlib_sldb_compare_nodes(const void *node1, const void *node2)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
524 {
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
525 return sidlib_sldb_compare_hash(
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
526 (*(SIDLibSLDBNode **) node1)->hash,
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
527 (*(SIDLibSLDBNode **) node2)->hash);
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
528 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
529
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
530
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
531 // (Re)create index
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
532 //
237
d28f3d537284 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 236
diff changeset
533 int sidlib_sldb_build_index(SIDLibSLDB *dbh)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
534 {
331
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
535 if (dbh == NULL)
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
536 return THERR_NULLPTR;
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
537
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
538 // Free old index
237
d28f3d537284 Cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 236
diff changeset
539 th_free_r(&(dbh->pindex));
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
540
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
541 // Get size of db
224
4bec78f45188 Use th_datastruct::th_llist_t instead of yet another linked list
Matti Hamalainen <ccr@tnsp.org>
parents: 223
diff changeset
542 dbh->nnodes = th_llist_length((th_llist_t *) dbh->nodes);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
543
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
544 // Check number of nodes
100
be62e4abe3a9 Rename a structure member.
Matti Hamalainen <ccr@tnsp.org>
parents: 99
diff changeset
545 if (dbh->nnodes > 0)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
546 {
224
4bec78f45188 Use th_datastruct::th_llist_t instead of yet another linked list
Matti Hamalainen <ccr@tnsp.org>
parents: 223
diff changeset
547 SIDLibSLDBNode *node;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
548 size_t i;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
549
331
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
550 // Check number of nodes against overflow
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
551 if (dbh->nnodes > UINTPTR_MAX / sizeof(SIDLibSTILNode *))
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
552 return THERR_BOUNDS;
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
553
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
554 // Allocate memory for index-table
100
be62e4abe3a9 Rename a structure member.
Matti Hamalainen <ccr@tnsp.org>
parents: 99
diff changeset
555 dbh->pindex = (SIDLibSLDBNode **) th_malloc(sizeof(SIDLibSLDBNode *) * dbh->nnodes);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
556 if (dbh->pindex == NULL)
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
557 return THERR_MALLOC;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
558
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
559 // Get node-pointers to table
224
4bec78f45188 Use th_datastruct::th_llist_t instead of yet another linked list
Matti Hamalainen <ccr@tnsp.org>
parents: 223
diff changeset
560 for (i = 0, node = dbh->nodes; node != NULL && i < dbh->nnodes;
4bec78f45188 Use th_datastruct::th_llist_t instead of yet another linked list
Matti Hamalainen <ccr@tnsp.org>
parents: 223
diff changeset
561 node = (SIDLibSLDBNode *) node->node.next)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
562 dbh->pindex[i++] = node;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
563
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
564 // Sort the indexes
332
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
565 qsort(dbh->pindex, dbh->nnodes,
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
566 sizeof(SIDLibSLDBNode *), sidlib_sldb_compare_nodes);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
567 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
568
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
569 return THERR_OK;
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
570 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
571
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
572
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
573 // Free a given song-length database
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
574 //
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
575 void sidlib_sldb_free(SIDLibSLDB *dbh)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
576 {
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
577 if (dbh != NULL)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
578 {
255
3c1cb0f39703 OOoops. Use th_llist_free_func_node() instead of th_llist_free_func().
Matti Hamalainen <ccr@tnsp.org>
parents: 254
diff changeset
579 th_llist_free_func_node((th_llist_t *) dbh->nodes,
3c1cb0f39703 OOoops. Use th_llist_free_func_node() instead of th_llist_free_func().
Matti Hamalainen <ccr@tnsp.org>
parents: 254
diff changeset
580 (void (*)(th_llist_t *)) sidlib_sldb_node_free);
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
581
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
582 dbh->nodes = NULL;
100
be62e4abe3a9 Rename a structure member.
Matti Hamalainen <ccr@tnsp.org>
parents: 99
diff changeset
583 dbh->nnodes = 0;
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
584
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
585 th_free_r(&dbh->pindex);
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
586 th_free(dbh);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
587 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
588 }
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
589
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
590
222
3a01518fffe0 Rename sidlib functions from si_* prefix to sidlib_*.
Matti Hamalainen <ccr@tnsp.org>
parents: 221
diff changeset
591 SIDLibSLDBNode *sidlib_sldb_get_by_hash(SIDLibSLDB *dbh, th_md5hash_t hash)
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
592 {
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
593 SIDLibSLDBNode keyItem, *key, **item;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
594
88
c5ff71d64e53 More work on sidlib SLDB code.
Matti Hamalainen <ccr@tnsp.org>
parents: 86
diff changeset
595 memcpy(&keyItem.hash, hash, sizeof(th_md5hash_t));
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
596 key = &keyItem;
332
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
597 item = bsearch(&key, dbh->pindex, dbh->nnodes,
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
598 sizeof(dbh->pindex[0]), sidlib_sldb_compare_nodes);
86
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
599
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
600 return (item != NULL) ? *item : NULL;
e1ff9cd27a84 Initial port of songlength database (SLDB) handling code from XMMS-SID to here.
Matti Hamalainen <ccr@tnsp.org>
parents: 85
diff changeset
601 }
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
602
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
603
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
604 /* STIL database handling functions
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
605 */
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
606 int sidlib_stildb_new(SIDLibSTILDB **pdbh)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
607 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
608 SIDLibSTILDB *dbh;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
609 if ((dbh = *pdbh = (SIDLibSTILDB *) th_malloc0(sizeof(SIDLibSTILDB))) == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
610 return THERR_MALLOC;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
611
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
612 return THERR_OK;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
613 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
614
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
615
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
616 SIDLibSTILSubTune *sidlib_stildb_find_subtune(SIDLibSTILNode *node, const int nsubtune)
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
617 {
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
618 for (size_t n = 0; n < node->nsubtunes; n++)
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
619 {
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
620 SIDLibSTILSubTune *subtune = &node->subtunes[n];
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
621 if (subtune->tune == nsubtune)
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
622 return subtune;
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
623 }
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
624 return NULL;
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
625 }
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
626
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
627
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
628 static int sidlib_stildb_entry_realloc(
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
629 SIDLibSTILNode *node,
264
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
630 const int nsubtune, const BOOL alloc,
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
631 const int nfield, const char *fdata,
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
632 SIDLibChConvCtx *chconv)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
633 {
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
634 SIDLibSTILSubTune *subtune;
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
635
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
636 if (node == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
637 return THERR_NULLPTR;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
638
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
639 // Get subtune or allocate new
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
640 if ((subtune = sidlib_stildb_find_subtune(node, nsubtune)) == NULL)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
641 {
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
642 node->subtunes = (SIDLibSTILSubTune *) th_realloc(
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
643 node->subtunes, (node->nsubtunes + 1) * sizeof(SIDLibSTILSubTune));
258
8d914417227d Avoid allocating one extra STIL node. Does not make much of a difference.
Matti Hamalainen <ccr@tnsp.org>
parents: 256
diff changeset
644
260
4a3e8960b3a9 Rename some struct fields.
Matti Hamalainen <ccr@tnsp.org>
parents: 258
diff changeset
645 if (node->subtunes == NULL)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
646 return THERR_MALLOC;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
647
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
648 subtune = &node->subtunes[node->nsubtunes];
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
649 memset(subtune, 0, sizeof(SIDLibSTILSubTune));
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
650 subtune->tune = nsubtune;
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
651 node->nsubtunes++;
264
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
652 }
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
653
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
654 // Allocate field space, if needed
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
655 if (alloc && nfield >= 0 && nfield < STF_LAST)
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
656 {
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
657 SIDLibSTILField *field = &subtune->fields[nfield];
264
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
658
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
659 if ((field->data = th_realloc(field->data, (field->ndata + 1) * sizeof(char *))) == NULL)
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
660 return THERR_MALLOC;
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
661
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
662 field->data[field->ndata] = sidlib_strdup_convert(chconv, fdata);
264
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
663 field->ndata++;
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
664 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
665
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
666 return THERR_OK;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
667 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
668
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
669
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
670 static void sidlib_stildb_node_free(SIDLibSTILNode *node)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
671 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
672 if (node != NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
673 {
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
674 for (size_t nsubtune = 0; nsubtune < node->nsubtunes; nsubtune++)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
675 {
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
676 SIDLibSTILSubTune *subtune = &node->subtunes[nsubtune];
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
677 for (int nfield = 0; nfield < STF_LAST; nfield++)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
678 {
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
679 SIDLibSTILField *field = &subtune->fields[nfield];
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
680 for (int n = 0; n < field->ndata; n++)
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
681 th_free(field->data[n]);
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
682
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
683 th_free(field->data);
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
684 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
685 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
686
260
4a3e8960b3a9 Rename some struct fields.
Matti Hamalainen <ccr@tnsp.org>
parents: 258
diff changeset
687 th_free(node->subtunes);
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
688 th_free(node->filename);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
689 th_free(node);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
690 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
691 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
692
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
693
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
694 static int sidlib_stildb_node_new(SIDLibSTILNode **pnode, const char *filename,
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
695 SIDLibChConvCtx *chconv)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
696 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
697 // Allocate memory for new node
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
698 SIDLibSTILNode *node;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
699 int res;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
700
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
701 if ((node = *pnode = (SIDLibSTILNode *) th_malloc0(sizeof(SIDLibSTILNode))) == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
702 return THERR_MALLOC;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
703
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
704 // Allocate filename and initial space for one subtune
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
705 // NOTE! Filename is not converted even if chconv != NULL
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
706 if ((node->filename = th_strdup(filename)) == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
707 return THERR_MALLOC;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
708
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
709 if ((res = sidlib_stildb_entry_realloc(node, 1, FALSE, -1, NULL, chconv)) != THERR_OK)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
710 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
711 sidlib_stildb_node_free(node);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
712 return res;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
713 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
714
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
715 return res;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
716 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
717
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
718
254
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
719 /* Free a given STIL database
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
720 */
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
721 void sidlib_stildb_free(SIDLibSTILDB *dbh)
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
722 {
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
723 if (dbh != NULL)
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
724 {
255
3c1cb0f39703 OOoops. Use th_llist_free_func_node() instead of th_llist_free_func().
Matti Hamalainen <ccr@tnsp.org>
parents: 254
diff changeset
725 th_llist_free_func_node((th_llist_t *) dbh->nodes,
3c1cb0f39703 OOoops. Use th_llist_free_func_node() instead of th_llist_free_func().
Matti Hamalainen <ccr@tnsp.org>
parents: 254
diff changeset
726 (void (*)(th_llist_t *)) sidlib_stildb_node_free);
254
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
727
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
728 dbh->nodes = NULL;
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
729 dbh->nnodes = 0;
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
730
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
731 th_free_r(&dbh->pindex);
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
732 th_free(dbh);
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
733 }
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
734 }
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
735
cc6d8d47dbc2 More sidlib_stildb_free() to more logical position in the source.
Matti Hamalainen <ccr@tnsp.org>
parents: 253
diff changeset
736
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
737 /* Read database (additively) to given db-structure
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
738 */
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
739 enum
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
740 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
741 PM_EOF,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
742 PM_ERROR,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
743 PM_IDLE,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
744 PM_COMMENT,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
745 PM_NEXT,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
746 PM_ENTRY,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
747 PM_FIELD_NAME,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
748 PM_FIELD_DATA,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
749 PM_SUBTUNE,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
750
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
751 PM_LAST
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
752 };
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
753
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
754
266
254828e9213b Make sidlib_stil_fields[] public.
Matti Hamalainen <ccr@tnsp.org>
parents: 265
diff changeset
755 const char *sidlib_stil_fields[STF_LAST] =
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
756 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
757 "NAME",
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
758 "AUTHOR",
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
759 "TITLE",
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
760 "INFO",
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
761 "ARTIST",
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
762 "COMMENT",
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
763
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
764 // STF_LAST
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
765 };
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
766
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
767
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
768 typedef struct
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
769 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
770 size_t lineNum;
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
771 ssize_t linePos;
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
772 int ch, prevMode, nextMode, parseMode;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
773 BOOL lineStart;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
774 } SIDLibSTILParserCtx;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
775
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
776
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
777 static int sidlib_stildb_get_field(const char *name)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
778 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
779 for (int n = 0; n < STF_LAST; n++)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
780 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
781 if (strcmp(sidlib_stil_fields[n], name) == 0)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
782 return n;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
783 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
784
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
785 return -1;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
786 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
787
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
788
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
789 static void sidlib_stildb_set_parsemode(SIDLibSTILParserCtx *ctx, const int mode)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
790 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
791 ctx->prevMode = ctx->parseMode;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
792 ctx->parseMode = mode;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
793 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
794
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
795
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
796 static void sidlib_stildb_set_next_parsemode(SIDLibSTILParserCtx *ctx, const int mode)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
797 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
798 sidlib_stildb_set_parsemode(ctx, PM_NEXT);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
799 ctx->nextMode = mode;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
800 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
801
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
802
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
803 #define VADDCH(ch) if (strPos < SIDLIB_BUFFER_SIZE) { tmpStr[strPos++] = ch; }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
804
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
805
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
806 int sidlib_stildb_read(th_ioctx *fh, SIDLibSTILDB *dbh, SIDLibChConvCtx *chconv)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
807 {
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
808 int ret = THERR_OK, field = -1;
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
809 SIDLibSTILParserCtx ctx;
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
810 char *tmpStr = NULL, *fieldName = NULL;
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
811 size_t strPos;
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
812 SIDLibSTILNode *entry = NULL;
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
813 int subtune;
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
814
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
815 if (fh == NULL || dbh == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
816 return THERR_NULLPTR;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
817
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
818 if ((tmpStr = th_malloc(SIDLIB_BUFFER_SIZE + 1)) == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
819 return THERR_MALLOC;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
820
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
821 // Initialize values
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
822 memset(&ctx, 0, sizeof(ctx));
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
823 ctx.nextMode = ctx.prevMode = ctx.parseMode = PM_IDLE;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
824 ctx.ch = -1;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
825 ctx.lineStart = TRUE;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
826 strPos = 0;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
827
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
828 // Parse the STIL database
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
829 while (ctx.parseMode != PM_EOF && ctx.parseMode != PM_ERROR)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
830 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
831 if (ctx.ch == -1)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
832 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
833 // Get next character
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
834 switch (ctx.ch = thfgetc(fh))
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
835 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
836 case '\n':
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
837 fh->line++;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
838 ctx.linePos = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
839 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
840
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
841 default:
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
842 if (ctx.linePos < 0)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
843 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
844 ctx.lineStart = TRUE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
845 ctx.linePos = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
846 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
847 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
848 ctx.linePos++;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
849 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
850 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
851
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
852 switch (ctx.parseMode)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
853 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
854 case PM_COMMENT:
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
855 // Comment parsing mode
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
856 if (ctx.ch == '\n')
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
857 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
858 // End of line, end of comment
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
859 sidlib_stildb_set_parsemode(&ctx, ctx.prevMode);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
860 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
861 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
862 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
863
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
864 case PM_NEXT:
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
865 case PM_IDLE:
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
866 // Normal parsing mode
261
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
867 if (ctx.ch == EOF)
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
868 {
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
869 sidlib_stildb_set_parsemode(&ctx, PM_EOF);
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
870 }
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
871 else
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
872 if (ctx.ch == '#')
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
873 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
874 sidlib_stildb_set_parsemode(&ctx, PM_COMMENT);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
875 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
876 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
877 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
878 if (th_iscrlf(ctx.ch) || th_isspace(ctx.ch))
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
879 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
880 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
881 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
882 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
883 if (ctx.parseMode == PM_IDLE)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
884 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
885 // PM_IDLE
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
886 strPos = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
887 if (ctx.ch == '/')
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
888 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
889 sidlib_stildb_set_parsemode(&ctx, PM_ENTRY);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
890 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
891 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
892 if (ctx.ch == '(')
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
893 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
894 sidlib_stildb_set_parsemode(&ctx, PM_SUBTUNE);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
895 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
896 ctx.lineStart = TRUE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
897 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
898 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
899 if (th_isalpha(ctx.ch))
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
900 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
901 sidlib_stildb_set_parsemode(&ctx, PM_FIELD_NAME);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
902 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
903 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
904 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
905 // Error! Invalid character found
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
906 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
907 "Unexpected character '%c'.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
908 ctx.ch);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
909 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
910 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
911 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
912 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
913 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
914 // PM_NEXT - Next item found
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
915 sidlib_stildb_set_parsemode(&ctx, ctx.nextMode);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
916 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
917 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
918
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
919 case PM_ENTRY:
261
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
920 if (ctx.ch == EOF || th_iscrlf(ctx.ch) || th_isspace(ctx.ch))
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
921 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
922 // A new file / entry, allocate and append
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
923 tmpStr[strPos] = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
924
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
925 if ((ret = sidlib_stildb_node_new(&entry, tmpStr, chconv)) != THERR_OK)
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
926 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
927
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
928 th_llist_append_node((th_llist_t **) &dbh->nodes, (th_llist_t *) entry);
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
929
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
930 // Default subtune is 0, for "main tune" information
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
931 subtune = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
932
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
933 sidlib_stildb_set_parsemode(&ctx, PM_IDLE);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
934 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
935 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
936 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
937 VADDCH(ctx.ch)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
938 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
939 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
940 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
941 "STIL entry filename too long.");
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
942 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
943 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
944 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
945 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
946 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
947
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
948 case PM_SUBTUNE:
261
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
949 if (ctx.ch == EOF || ctx.ch == ')')
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
950 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
951 BOOL neg = FALSE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
952
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
953 // Subtune indicator end
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
954 tmpStr[strPos] = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
955
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
956 if (!th_get_int(tmpStr, (unsigned int *) &subtune, &neg) || neg)
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
957 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
958 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
959 "Entry '%s' subtune indicator '%s' is not a valid integer.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
960 entry->filename, tmpStr);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
961 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
962 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
963
253
c98be346c706 Check for subtune <= 0 instead of == 0.
Matti Hamalainen <ccr@tnsp.org>
parents: 249
diff changeset
964 if (subtune <= 0 || subtune > 128)
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
965 {
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
966 th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
967 "Entry '%s' subtune number #%d is out of range/invalid.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
968 entry->filename, subtune);
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
969
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
970 subtune = -1;
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
971 }
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
972
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
973 sidlib_stildb_set_parsemode(&ctx, PM_IDLE);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
974 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
975 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
976 if (th_isdigit(ctx.ch))
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
977 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
978 if (ctx.lineStart)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
979 goto sub_unexpected;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
980
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
981 VADDCH(ctx.ch)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
982 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
983 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
984 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
985 "Subtune indicator too long.");
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
986 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
987 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
988 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
989 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
990 if ((ctx.ch == '#' && strPos > 0) || (ctx.ch != '#' && !th_isspace(ctx.ch)))
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
991 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
992 sub_unexpected:
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
993 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
994 "Unexpected character '%c' in subtune indicator.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
995 ctx.ch);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
996 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
997 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
998
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
999 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1000 ctx.lineStart = FALSE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1001 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1002
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1003 case PM_FIELD_NAME:
261
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
1004 if (ctx.ch == EOF || ctx.ch == ':' || th_iscrlf(ctx.ch) || th_isspace(ctx.ch))
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1005 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1006 tmpStr[strPos] = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1007 th_pstr_cpy(&fieldName, tmpStr);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1008
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1009 field = sidlib_stildb_get_field(tmpStr);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1010
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1011 if (entry == NULL)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1012 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1013 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1014 "No STIL entry allocated, but field '%s' found.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1015 fieldName);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1016 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1017 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1018
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1019 sidlib_stildb_set_next_parsemode(&ctx, PM_FIELD_DATA);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1020 ctx.lineStart = FALSE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1021 strPos = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1022 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1023 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1024 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1025 VADDCH(ctx.ch)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1026 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1027 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1028 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1029 "Field name too long.");
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1030 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1031 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1032 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1033
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1034 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1035 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1036
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1037 case PM_FIELD_DATA:
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1038 if (ctx.lineStart && th_isspace(ctx.ch) && ctx.linePos < 8)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1039 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1040 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1041 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1042 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1043 if (th_iscrlf(ctx.ch))
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1044 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1045 ctx.lineStart = TRUE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1046 ctx.ch = -1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1047 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1048 else
261
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
1049 if (ctx.ch == EOF || (ctx.lineStart && ctx.linePos < 8))
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1050 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1051 // Field done
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1052 tmpStr[strPos] = 0;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1053
249
1f1e7934ae61 Few improvements to validity checking of STIL file parsing.
Matti Hamalainen <ccr@tnsp.org>
parents: 242
diff changeset
1054 if (field >= 0 && subtune >= 0)
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1055 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1056 // Supported field, add it
264
5afa6052f796 Change SIDLibSTILSubTune::fields to new SIDLibSTILField structure for
Matti Hamalainen <ccr@tnsp.org>
parents: 263
diff changeset
1057 if ((ret = sidlib_stildb_entry_realloc(
319
6d0143e43edf Add functionality and API changes for doing on-the-fly character set
Matti Hamalainen <ccr@tnsp.org>
parents: 311
diff changeset
1058 entry, subtune, TRUE, field, tmpStr, chconv)) != THERR_OK)
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1059 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1060 ret = th_io_error(fh, THERR_MALLOC,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1061 "Could not allocate memory for field '%s'.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1062 fieldName);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1063 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1064 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1065 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1066
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1067 sidlib_stildb_set_parsemode(&ctx, PM_IDLE);
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1068 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1069 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1070 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1071 ctx.lineStart = FALSE;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1072 VADDCH(ctx.ch)
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1073 else
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1074 {
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1075 ret = th_io_error(fh, THERR_INVALID_DATA,
265
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1076 "Field '%s' data too long.",
05bbe428a0ab Unify SIDLib error messages.
Matti Hamalainen <ccr@tnsp.org>
parents: 264
diff changeset
1077 fieldName);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1078 goto out;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1079 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1080 ctx.ch = - 1;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1081 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1082 break;
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1083 }
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1084 }
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1085
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1086 out:
261
39a03560163d Improve STIL parsing reliability.
Matti Hamalainen <ccr@tnsp.org>
parents: 260
diff changeset
1087
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1088 th_free(tmpStr);
242
537420ccd05b More work on STIL parser.
Matti Hamalainen <ccr@tnsp.org>
parents: 241
diff changeset
1089 th_free(fieldName);
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1090
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1091 if (ret == THERR_OK && ctx.parseMode == PM_ERROR)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1092 ret = THERR_INVALID_DATA;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1093
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1094 return ret;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1095 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1096
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1097
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1098 /* Compare two nodes
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1099 */
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1100 static int sidlib_stildb_compare_subtunes(const void *node1, const void *node2)
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1101 {
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1102 return
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1103 ((SIDLibSTILSubTune *) node1)->tune - ((SIDLibSTILSubTune *) node2)->tune;
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1104 }
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1105
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1106
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1107 static int sidlib_stildb_compare_nodes(const void *node1, const void *node2)
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1108 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1109 // We assume here that we never ever get NULL-pointers or similar
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1110 return strcmp(
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1111 (*(SIDLibSTILNode * *) node1)->filename,
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1112 (*(SIDLibSTILNode * *) node2)->filename);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1113 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1114
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1115
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1116 /* (Re)create index
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1117 */
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1118 int sidlib_stildb_build_index(SIDLibSTILDB *dbh)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1119 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1120 if (dbh == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1121 return THERR_NULLPTR;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1122
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1123 // Free old index
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1124 th_free_r(&(dbh->pindex));
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1125
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1126 // Get size of db
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1127 dbh->nnodes = th_llist_length((th_llist_t *) dbh->nodes);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1128
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1129 // Check number of nodes
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1130 if (dbh->nnodes > 0)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1131 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1132 SIDLibSTILNode *node;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1133 size_t i;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1134
331
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
1135 // Check number of nodes against overflow
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
1136 if (dbh->nnodes > UINTPTR_MAX / sizeof(SIDLibSTILNode *))
e35e15f07c66 Add bounds checks for node index generation.
Matti Hamalainen <ccr@tnsp.org>
parents: 319
diff changeset
1137 return THERR_BOUNDS;
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1138
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1139 // Allocate memory for index-table
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1140 dbh->pindex = (SIDLibSTILNode **) th_malloc(sizeof(SIDLibSTILNode *) * dbh->nnodes);
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1141 if (dbh->pindex == NULL)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1142 return THERR_MALLOC;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1143
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1144 // Get node-pointers to table
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1145 for (i = 0, node = dbh->nodes; node != NULL && i < dbh->nnodes;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1146 node = (SIDLibSTILNode *) node->node.next)
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1147 {
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1148 dbh->pindex[i++] = node;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1149
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1150 // Sort the subtunes
332
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
1151 qsort(node->subtunes, node->nsubtunes,
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
1152 sizeof(SIDLibSTILSubTune), sidlib_stildb_compare_subtunes);
311
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1153 }
ee56f1f2b528 Change how the STIL subtune are handled internally. Also fix a bug that
Matti Hamalainen <ccr@tnsp.org>
parents: 292
diff changeset
1154
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1155 // Sort the indexes
332
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
1156 qsort(dbh->pindex, dbh->nnodes,
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
1157 sizeof(SIDLibSTILNode *), sidlib_stildb_compare_nodes);
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1158 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1159
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1160 return THERR_OK;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1161 }
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1162
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1163
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1164 /* Get STIL information node from database
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1165 */
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1166 SIDLibSTILNode *sidlib_stildb_get_node(SIDLibSTILDB *dbh, const char *filename)
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1167 {
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1168 SIDLibSTILNode keyItem, *key, **item;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1169
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1170 keyItem.filename = (char *) filename;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1171 key = &keyItem;
332
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
1172 item = bsearch(&key, dbh->pindex, dbh->nnodes,
629876cc0540 Indentation cosmetics.
Matti Hamalainen <ccr@tnsp.org>
parents: 331
diff changeset
1173 sizeof(SIDLibSTILNode *), sidlib_stildb_compare_nodes);
241
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1174
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1175 return item != NULL ? *item : NULL;
c9b57c8fd058 Begin work on STIL database parsing and handling.
Matti Hamalainen <ccr@tnsp.org>
parents: 239
diff changeset
1176 }