[kdbus] sync with kdbus (kdbus.h - commit: 5ae1ecac44cb)
[platform/upstream/glib.git] / gio / glib-compile-resources.c
index 1d67cc5..6bad64f 100644 (file)
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  * Author: Alexander Larsson <alexl@redhat.com>
  */
 #include <stdio.h>
 #include <locale.h>
 #include <errno.h>
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
+#ifdef G_OS_UNIX
+#include <unistd.h>
+#endif
+#ifdef G_OS_WIN32
+#include <io.h>
 #endif
 
 #include <gio/gmemoryoutputstream.h>
 #include <gio/gzlibcompressor.h>
 #include <gio/gconverteroutputstream.h>
 
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
 #include <glib.h>
 #include "gvdb/gvdb-builder.h"
 
 #include "gconstructor_as_data.h"
 
+#ifdef G_OS_WIN32
+#include "glib/glib-private.h"
+#endif
+
 typedef struct
 {
   char *filename;
@@ -181,10 +182,13 @@ find_file (const gchar *filename)
   gchar *real_file;
   gboolean exists;
 
+  if (g_path_is_absolute (filename))
+    return g_strdup (filename);
+
   /* search all the sourcedirs for the correct files in order */
   for (i = 0; sourcedirs[i] != NULL; i++)
     {
-       real_file = g_build_filename (sourcedirs[i], filename, NULL);
+       real_file = g_build_path ("/", sourcedirs[i], filename, NULL);
        exists = g_file_test (real_file, G_FILE_TEST_EXISTS);
        if (exists)
          return real_file;
@@ -281,7 +285,7 @@ end_element (GMarkupParseContext  *context,
               else
                 {
                   g_set_error (error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT,
-                               _("Unknown proprocessing options \"%s\""), options[i]);
+                               _("Unknown processing option \"%s\""), options[i]);
                   g_strfreev (options);
                   goto cleanup;
                 }
@@ -290,8 +294,8 @@ end_element (GMarkupParseContext  *context,
 
           if (xml_stripblanks && xmllint != NULL)
             {
-              gchar *argv[8];
-              int status, fd, argc;
+              int fd;
+             GSubprocess *proc;
 
               tmp_file = g_strdup ("resource-XXXXXXXX");
               if ((fd = g_mkstemp (tmp_file)) == -1)
@@ -307,41 +311,29 @@ end_element (GMarkupParseContext  *context,
                 }
               close (fd);
 
-              argc = 0;
-              argv[argc++] = (gchar *) xmllint;
-              argv[argc++] = "--nonet";
-              argv[argc++] = "--noblanks";
-              argv[argc++] = "--output";
-              argv[argc++] = tmp_file;
-              argv[argc++] = real_file;
-              argv[argc++] = NULL;
-              g_assert (argc <= G_N_ELEMENTS (argv));
-
-              if (!g_spawn_sync (NULL /* cwd */, argv, NULL /* envv */,
-                                 G_SPAWN_STDOUT_TO_DEV_NULL |
-                                 G_SPAWN_STDERR_TO_DEV_NULL,
-                                 NULL, NULL, NULL, NULL, &status, &my_error))
-                {
-                  g_propagate_error (error, my_error);
-                  goto cleanup;
-                }
-#ifdef HAVE_SYS_WAIT_H
-              if (!WIFEXITED (status) || WEXITSTATUS (status) != 0)
-                {
-                  g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-                                      _("Error processing input file with xmllint"));
+              proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, error,
+                                       xmllint, "--nonet", "--noblanks", "--output", tmp_file, real_file, NULL);
+              g_free (real_file);
+             real_file = NULL;
+
+             if (!proc)
+               goto cleanup;
+
+             if (!g_subprocess_wait_check (proc, NULL, error))
+               {
+                 g_object_unref (proc);
                   goto cleanup;
                 }
-#endif
 
-              g_free (real_file);
+             g_object_unref (proc);
+
               real_file = g_strdup (tmp_file);
             }
 
           if (to_pixdata)
             {
-              gchar *argv[4];
-              int status, fd, argc;
+              int fd;
+             GSubprocess *proc;
 
               if (gdk_pixbuf_pixdata == NULL)
                 {
@@ -365,31 +357,19 @@ end_element (GMarkupParseContext  *context,
                 }
               close (fd);
 
-              argc = 0;
-              argv[argc++] = (gchar *) gdk_pixbuf_pixdata;
-              argv[argc++] = real_file;
-              argv[argc++] = tmp_file2;
-              argv[argc++] = NULL;
-              g_assert (argc <= G_N_ELEMENTS (argv));
-
-              if (!g_spawn_sync (NULL /* cwd */, argv, NULL /* envv */,
-                                 G_SPAWN_STDOUT_TO_DEV_NULL |
-                                 G_SPAWN_STDERR_TO_DEV_NULL,
-                                 NULL, NULL, NULL, NULL, &status, &my_error))
-                {
-                  g_propagate_error (error, my_error);
-                  goto cleanup;
-                }
-#ifdef HAVE_SYS_WAIT_H
-              if (!WIFEXITED (status) || WEXITSTATUS (status) != 0)
-                {
-                  g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
-                                      _("Error processing input file with to-pixdata"));
+              proc = g_subprocess_new (G_SUBPROCESS_FLAGS_STDOUT_SILENCE, error,
+                                       gdk_pixbuf_pixdata, real_file, tmp_file2, NULL);
+              g_free (real_file);
+              real_file = NULL;
+
+             if (!g_subprocess_wait_check (proc, NULL, error))
+               {
+                 g_object_unref (proc);
                   goto cleanup;
-                }
-#endif
+               }
+
+             g_object_unref (proc);
 
-              g_free (real_file);
               real_file = g_strdup (tmp_file2);
             }
        }
@@ -599,9 +579,11 @@ main (int argc, char **argv)
   gboolean generate_source = FALSE;
   gboolean generate_header = FALSE;
   gboolean manual_register = FALSE;
+  gboolean internal = FALSE;
   gboolean generate_dependencies = FALSE;
   char *c_name = NULL;
   char *c_name_no_underscores;
+  const char *linkage = "extern";
   GOptionContext *context;
   GOptionEntry entries[] = {
     { "target", 0, 0, G_OPTION_ARG_FILENAME, &target, N_("name of the output file"), N_("FILE") },
@@ -611,12 +593,12 @@ main (int argc, char **argv)
     { "generate-source", 0, 0, G_OPTION_ARG_NONE, &generate_source, N_("Generate sourcecode used to link in the resource file into your code"), NULL },
     { "generate-dependencies", 0, 0, G_OPTION_ARG_NONE, &generate_dependencies, N_("Generate dependency list"), NULL },
     { "manual-register", 0, 0, G_OPTION_ARG_NONE, &manual_register, N_("Don't automatically create and register resource"), NULL },
+    { "internal", 0, 0, G_OPTION_ARG_NONE, &internal, N_("Don't export functions; declare them G_GNUC_INTERNAL"), NULL },
     { "c-name", 0, 0, G_OPTION_ARG_STRING, &c_name, N_("C identifier name used for the generated source code"), NULL },
     { NULL }
   };
 
 #ifdef G_OS_WIN32
-  extern gchar *_glib_get_locale_dir (void);
   gchar *tmp;
 #endif
 
@@ -635,8 +617,6 @@ main (int argc, char **argv)
   bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 #endif
 
-  g_type_init ();
-
   context = g_option_context_new (N_("FILE"));
   g_option_context_set_translation_domain (context, GETTEXT_PACKAGE);
   g_option_context_set_summary (context,
@@ -660,6 +640,9 @@ main (int argc, char **argv)
       return 1;
     }
 
+  if (internal)
+    linkage = "G_GNUC_INTERNAL";
+
   srcfile = argv[1];
 
   xmllint = g_strdup (g_getenv ("XMLLINT"));
@@ -801,16 +784,16 @@ main (int argc, char **argv)
               "\n"
               "#include <gio/gio.h>\n"
               "\n"
-              "extern GResource *%s_get_resource (void);\n",
-              c_name, c_name, c_name);
+              "%s GResource *%s_get_resource (void);\n",
+              c_name, c_name, linkage, c_name);
 
       if (manual_register)
        fprintf (file,
                 "\n"
-                "extern void %s_register_resource (void);\n"
-                "extern void %s_unregister_resource (void);\n"
+                "%s void %s_register_resource (void);\n"
+                "%s void %s_unregister_resource (void);\n"
                 "\n",
-                c_name, c_name);
+                linkage, c_name, linkage, c_name);
 
       fprintf (file,
               "#endif\n");
@@ -865,31 +848,31 @@ main (int argc, char **argv)
 
       fprintf (file,
               "\n"
-              "static GStaticResource static_resource = { %s_resource_data.data, sizeof (%s_resource_data.data) };\n"
-              "extern GResource *%s_get_resource (void);\n"
+              "static GStaticResource static_resource = { %s_resource_data.data, sizeof (%s_resource_data.data), NULL, NULL, NULL };\n"
+              "%s GResource *%s_get_resource (void);\n"
               "GResource *%s_get_resource (void)\n"
               "{\n"
               "  return g_static_resource_get_resource (&static_resource);\n"
               "}\n",
-              c_name, c_name, c_name, c_name);
+              c_name, c_name, linkage, c_name, c_name);
 
 
       if (manual_register)
        {
          fprintf (file,
                   "\n"
-                  "extern void %s_unregister_resource (void);\n"
+                  "%s void %s_unregister_resource (void);\n"
                   "void %s_unregister_resource (void)\n"
                   "{\n"
                   "  g_static_resource_fini (&static_resource);\n"
                   "}\n"
                   "\n"
-                  "extern void %s_register_resource (void);\n"
+                  "%s void %s_register_resource (void);\n"
                   "void %s_register_resource (void)\n"
                   "{\n"
                   "  g_static_resource_init (&static_resource);\n"
                   "}\n",
-                  c_name, c_name, c_name, c_name);
+                  linkage, c_name, c_name, linkage, c_name, c_name);
        }
       else
        {