dvb: simplify ZAP file format parser
Simplify state handing, drop unneeded local vars, etc.
diff --git a/sys/dvb/parsechannels.c b/sys/dvb/parsechannels.c
index 9c46ddb..1a81582 100644
--- a/sys/dvb/parsechannels.c
+++ b/sys/dvb/parsechannels.c
@@ -54,6 +54,9 @@
gchar **lines;
gchar *line;
gchar **fields;
+ int i, parsedchannels = 0;
+ GHashTable *res;
+ GError *err = NULL;
const gchar *terrestrial[] = { "inversion", "bandwidth",
"code-rate-hp", "code-rate-lp", "modulation", "transmission-mode",
"guard", "hierarchy"
@@ -64,9 +67,6 @@
const gchar *cable[] = { "inversion", "symbol-rate", "code-rate-hp",
"modulation"
};
- int i, parsedchannels = 0;
- GHashTable *res;
- GError *err = NULL;
GST_INFO_OBJECT (dvbbasebin, "parsing '%s'", filename);
@@ -79,18 +79,37 @@
i = 0;
line = lines[0];
while (line != NULL) {
- if (line[0] != '#') {
- int numfields;
- gboolean parsed = FALSE;
- GHashTable *params = g_hash_table_new_full (g_str_hash, g_str_equal,
- g_free, g_free);
+ GHashTable *params;
+ int j, numfields;
- fields = g_strsplit (line, ":", 0);
- numfields = g_strv_length (fields);
- if (numfields == 8) {
- /* satellite */
- int j;
+ if (line[0] == '#')
+ goto next_line;
+ params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+ fields = g_strsplit (line, ":", 0);
+ numfields = g_strv_length (fields);
+
+ switch (numfields) {
+ case 13: /* terrestrial */
+ g_hash_table_insert (params, g_strdup ("type"),
+ g_strdup ("terrestrial"));
+ for (j = 2; j <= 9; j++) {
+ g_hash_table_insert (params, g_strdup (terrestrial[j - 2]),
+ g_strdup (fields[j]));
+ }
+ g_hash_table_insert (params, g_strdup ("frequency"),
+ g_strdup (fields[1]));
+ break;
+ case 9: /* cable */
+ g_hash_table_insert (params, g_strdup ("type"), g_strdup ("cable"));
+ for (j = 2; j <= 5; j++) {
+ g_hash_table_insert (params, g_strdup (cable[j - 2]),
+ g_strdup (fields[j]));
+ }
+ g_hash_table_insert (params, g_strdup ("frequency"),
+ g_strdup (fields[1]));
+ break;
+ case 8: /* satellite */
g_hash_table_insert (params, g_strdup ("type"), g_strdup ("satellite"));
for (j = 2; j <= 4; j++) {
g_hash_table_insert (params, g_strdup (satellite[j - 2]),
@@ -107,52 +126,31 @@
g_hash_table_insert (params, g_strdup ("frequency"),
g_strdup_printf ("%d", atoi (fields[1])));
}
- parsed = TRUE;
- } else if (numfields == 13) {
- /* terrestrial */
- int j;
-
- g_hash_table_insert (params, g_strdup ("type"),
- g_strdup ("terrestrial"));
- for (j = 2; j <= 9; j++) {
- g_hash_table_insert (params, g_strdup (terrestrial[j - 2]),
- g_strdup (fields[j]));
- }
- g_hash_table_insert (params, g_strdup ("frequency"),
- g_strdup (fields[1]));
- parsed = TRUE;
- } else if (numfields == 9) {
- /* cable */
- int j;
-
- g_hash_table_insert (params, g_strdup ("type"), g_strdup ("cable"));
- for (j = 2; j <= 5; j++) {
- g_hash_table_insert (params, g_strdup (cable[j - 2]),
- g_strdup (fields[j]));
- }
- g_hash_table_insert (params, g_strdup ("frequency"),
- g_strdup (fields[1]));
- parsed = TRUE;
- } else if (numfields == 6) {
- /* atsc (vsb/qam) */
+ break;
+ case 6: /* atsc (vsb/qam) */
g_hash_table_insert (params, g_strdup ("type"), g_strdup ("atsc"));
g_hash_table_insert (params, g_strdup ("modulation"),
g_strdup (fields[2]));
g_hash_table_insert (params, g_strdup ("frequency"),
g_strdup (fields[1]));
- parsed = TRUE;
- }
- if (parsed) {
- g_hash_table_insert (params, g_strdup ("sid"),
- g_strdup (fields[numfields - 1]));
- g_hash_table_insert (res, g_strdup (fields[0]), params);
- parsedchannels++;
- }
- g_strfreev (fields);
+ break;
+ default:
+ goto not_parsed;
}
+
+ /* parsed */
+ g_hash_table_insert (params, g_strdup ("sid"),
+ g_strdup (fields[numfields - 1]));
+ g_hash_table_insert (res, g_strdup (fields[0]), params);
+ parsedchannels++;
+
+ not_parsed:
+ g_strfreev (fields);
+ next_line:
line = lines[++i];
}
+
g_strfreev (lines);
g_free (contents);
@@ -162,25 +160,21 @@
return res;
open_fail:
- {
- if (err->code == G_FILE_ERROR_NOENT) {
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
- _("Couldn't find DVB channel configuration file"));
- } else {
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ,
- _("Couldn't load DVB channel configuration file: %s"), err->message);
- }
- g_clear_error (&err);
- return NULL;
+ if (err->code == G_FILE_ERROR_NOENT) {
+ g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
+ _("Couldn't find DVB channel configuration file"));
+ } else {
+ g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ,
+ _("Couldn't load DVB channel configuration file: %s"), err->message);
}
+ g_clear_error (&err);
+ return NULL;
no_channels:
- {
- g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
- _("DVB channel configuration file doesn't contain any channels"));
- g_hash_table_unref (res);
- return NULL;
- }
+ g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
+ _("DVB channel configuration file doesn't contain any channels"));
+ g_hash_table_unref (res);
+ return NULL;
}
static gboolean