Update to version 2.39.3
[profile/ivi/libsoup2.4.git] / libsoup / tld-parser.c
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2 /*
3  * tld-parser.c
4  *
5  * Copyright (C) 2012 Igalia S.L.
6  */
7 #ifdef HAVE_CONFIG_H
8 #include <config.h>
9 #endif
10
11 #include <glib.h>
12 #include <glib/gprintf.h>
13 #include <gio/gio.h>
14 #include "soup-tld-private.h"
15
16 #define MAX_LINE_LENGTH 256
17
18 int
19 main(int argc, char **argv)
20 {
21         GFile *tlds_file, *inc_file;
22         GFileInputStream *file_reader;
23         GFileOutputStream *file_writer;
24         GDataInputStream *data_reader;
25         char *rule;
26
27         g_type_init ();
28
29         tlds_file = g_file_new_for_path (argv[1]);
30         file_reader = g_file_read (tlds_file, NULL, NULL);
31         g_object_unref (tlds_file);
32
33         if (!file_reader)
34                 return 1;
35
36         data_reader = g_data_input_stream_new (G_INPUT_STREAM (file_reader));
37         g_object_unref (file_reader);
38         if (!data_reader)
39                 return 1;
40
41         inc_file = g_file_new_for_path (argv[2]);
42         file_writer = g_file_replace (inc_file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL);
43         g_object_unref (inc_file);
44
45         if (!file_writer) {
46                 g_object_unref (data_reader);
47                 return 1;
48         }
49
50         do {
51                 char *domain;
52                 gsize size;
53                 char output_line[MAX_LINE_LENGTH];
54                 guint flags;
55
56                 rule = g_data_input_stream_read_line (data_reader, &size, NULL, NULL);
57
58                 if (!rule)
59                         break;
60
61                 /* If the line is empty or is a comment then ignore. */
62                 if (!size || g_str_has_prefix (rule, "//")) {
63                         g_free (rule);
64                         continue;
65                 }
66
67                 flags = 0;
68                 domain = rule;
69                 /* Lines starting with '!' are exceptions to the rules */
70                 if (*rule == '!') {
71                         domain++;
72                         flags |= SOUP_TLD_RULE_EXCEPTION;
73                 }
74
75                 if (g_str_has_prefix (domain, "*.")) {
76                         domain += 2;
77                         flags |= SOUP_TLD_RULE_MATCH_ALL;
78                 }
79
80                 /* Skip the leading dot (is optional) */
81                 if (*domain == '.')
82                         domain++;
83
84                 size = g_snprintf (output_line, MAX_LINE_LENGTH, "{ \"%s\", %d },\n", g_strstrip(domain), flags);
85                 g_output_stream_write (G_OUTPUT_STREAM (file_writer), output_line, size, NULL, NULL);
86
87                 g_free (rule);
88
89         } while (TRUE);
90
91         g_object_unref (data_reader);
92         g_object_unref (file_writer);
93
94         return 0;
95 }