diff --git a/ChangeLog b/ChangeLog index a75eb2d4f..62077e1da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index a75eb2d4f..62077e1da 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,18 @@ +2000-07-12 Havoc Pennington + + * glib.h: #include + + * Makefile.am (include_HEADERS): Add gerror.h + (libglib_la_SOURCES): Add gbacktrace.c + + * gbacktrace.c: Move g_on_error_query() in here (moved on the + server, so history is preserved) + + * gerror.h: GError interface + + * gerror.c: GError implementation replaces stuff that's now in + gbacktrace.c + Sun Jul 9 21:20:45 2000 Owen Taylor * gunicode.h: Include stddef.h instead of stdlib.h diff --git a/Makefile.am b/Makefile.am index f47fff298..ae5fedc55 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,6 +38,7 @@ lib_LTLIBRARIES = libglib.la libglib_la_SOURCES = \ garray.c \ gasyncqueue.c \ + gbacktrace.c \ gcache.c \ gcompletion.c \ gdataset.c \ @@ -71,7 +72,7 @@ libglib_la_SOURCES = \ gunidecomp.c \ gutils.c -include_HEADERS = glib.h glib-object.h gunicode.h +include_HEADERS = glib.h glib-object.h gunicode.h gerror.h configexecincludedir = $(pkglibdir)/include #configexecinclude_DATA = glibconfig.h diff --git a/gerror.c b/gerror.c index 7fa77687c..42ea1b61f 100644 --- a/gerror.c +++ b/gerror.c @@ -24,275 +24,126 @@ * GLib at ftp://ftp.gtk.org/pub/gtk/. */ -/* - * MT safe ; except for g_on_error_stack_trace, but who wants thread safety - * then - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include #include "glib.h" -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_SYS_TIMES_H -#include -#endif -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* HAVE_SYS_SELECT_H */ - -#ifdef STDC_HEADERS -#include /* for bzero on BSD systems */ -#endif - -#ifdef G_OS_WIN32 -# define STRICT /* Strict typing, please */ -# include -# include /* For _getpid() */ -#endif - -#ifndef NO_FD_SET -# define SELECT_MASK fd_set -#else -# if defined(_IBMR2) -# define SELECT_MASK void -# else -# define SELECT_MASK int -# endif -#endif - - -static void stack_trace (char **args); - -extern volatile gboolean glib_on_error_halt; -volatile gboolean glib_on_error_halt = TRUE; - -void -g_on_error_query (const gchar *prg_name) +static GError* +g_error_new_valist(GQuark domain, + gint code, + const gchar *format, + va_list args) { -#ifndef G_OS_WIN32 - static const gchar *query1 = "[E]xit, [H]alt"; - static const gchar *query2 = ", show [S]tack trace"; - static const gchar *query3 = " or [P]roceed"; - gchar buf[16]; + GError *error; + + error = g_new (GError, 1); + + error->domain = domain; + error->code = code; + error->message = g_strdup_vprintf (format, args); + + return error; +} - if (!prg_name) - prg_name = g_get_prgname (); - - retry: - - if (prg_name) - fprintf (stdout, - "%s (pid:%u): %s%s%s: ", - prg_name, - (guint) getpid (), - query1, - query2, - query3); - else - fprintf (stdout, - "(process:%u): %s%s: ", - (guint) getpid (), - query1, - query3); - fflush (stdout); - - if (isatty(0) && isatty(1)) - fgets (buf, 8, stdin); - else - strcpy (buf, "E\n"); +GError* +g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) +{ + GError* error; + va_list args; - if ((buf[0] == 'E' || buf[0] == 'e') - && buf[1] == '\n') - _exit (0); - else if ((buf[0] == 'P' || buf[0] == 'p') - && buf[1] == '\n') - return; - else if (prg_name - && (buf[0] == 'S' || buf[0] == 's') - && buf[1] == '\n') - { - g_on_error_stack_trace (prg_name); - goto retry; - } - else if ((buf[0] == 'H' || buf[0] == 'h') - && buf[1] == '\n') - { - while (glib_on_error_halt) - ; - glib_on_error_halt = TRUE; - return; - } - else - goto retry; -#else - if (!prg_name) - prg_name = g_get_prgname (); + g_return_val_if_fail (format != NULL, NULL); + g_return_val_if_fail (domain != 0, NULL); + + va_start (args, format); + error = g_error_new_valist (domain, code, format, args); + va_end (args); + + return error; +} + +GError* +g_error_new_literal (GQuark domain, + gint code, + const gchar *message) +{ + GError* err; + + g_return_val_if_fail (message != NULL, NULL); + g_return_val_if_fail (domain != 0, NULL); + + err = g_new (GError, 1); + + err->domain = domain; + err->code = code; + err->message = g_strdup (message); - MessageBox (NULL, "g_on_error_query called, program terminating", - (prg_name && *prg_name) ? prg_name : NULL, - MB_OK|MB_ICONERROR); - _exit(0); -#endif + return err; } void -g_on_error_stack_trace (const gchar *prg_name) +g_error_free (GError *error) { -#ifdef G_OS_UNIX - pid_t pid; - gchar buf[16]; - gchar *args[4] = { "gdb", NULL, NULL, NULL }; + g_return_if_fail (error != NULL); - if (!prg_name) + g_free (error->message); + + g_free (error); +} + +GError* +g_error_copy (const GError *error) +{ + GError *copy; + + g_return_val_if_fail (error != NULL, NULL); + + copy = g_new (GError, 1); + + *copy = *error; + + copy->message = g_strdup (error->message); + + return copy; +} + +gboolean +g_error_matches (const GError *error, + GQuark domain, + gint code) +{ + return error && + error->domain == domain && + error->code == code; +} + +void +g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) +{ + va_list args; + + if (err == NULL) return; - sprintf (buf, "%u", (guint) getpid ()); - - args[1] = (gchar*) prg_name; - args[2] = buf; - - pid = fork (); - if (pid == 0) - { - stack_trace (args); - _exit (0); - } - else if (pid == (pid_t) -1) - { - perror ("unable to fork gdb"); - return; - } + if (*err != NULL) + g_warning ("GError set over the top of a previous GError or uninitialized memory.\n" + "This indicates a bug in someone's code. You must ensure an error is NULL before it's set."); - while (glib_on_error_halt) - ; - glib_on_error_halt = TRUE; -#else - abort (); -#endif + va_start (args, format); + *err = g_error_new_valist (domain, code, format, args); + va_end (args); } -static gboolean stack_trace_done = FALSE; - -static void -stack_trace_sigchld (int signum) +void +g_clear_error (GError **err) { - stack_trace_done = TRUE; -} - -static void -stack_trace (char **args) -{ -#ifdef G_OS_UNIX - pid_t pid; - int in_fd[2]; - int out_fd[2]; - SELECT_MASK fdset; - SELECT_MASK readset; - struct timeval tv; - int sel, index, state; - char buffer[256]; - char c; - - stack_trace_done = FALSE; - signal (SIGCHLD, stack_trace_sigchld); - - if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1)) - { - perror ("unable to open pipe"); - _exit (0); - } - - pid = fork (); - if (pid == 0) - { - close (0); dup (in_fd[0]); /* set the stdin to the in pipe */ - close (1); dup (out_fd[1]); /* set the stdout to the out pipe */ - close (2); dup (out_fd[1]); /* set the stderr to the out pipe */ - - execvp (args[0], args); /* exec gdb */ - perror ("exec failed"); - _exit (0); - } - else if (pid == (pid_t) -1) - { - perror ("unable to fork"); - _exit (0); - } - - FD_ZERO (&fdset); - FD_SET (out_fd[0], &fdset); - - write (in_fd[1], "backtrace\n", 10); - write (in_fd[1], "p x = 0\n", 8); - write (in_fd[1], "quit\n", 5); - - index = 0; - state = 0; - - while (1) - { - readset = fdset; - tv.tv_sec = 1; - tv.tv_usec = 0; - - sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv); - if (sel == -1) - break; - - if ((sel > 0) && (FD_ISSET (out_fd[0], &readset))) - { - if (read (out_fd[0], &c, 1)) - { - switch (state) - { - case 0: - if (c == '#') - { - state = 1; - index = 0; - buffer[index++] = c; - } - break; - case 1: - buffer[index++] = c; - if ((c == '\n') || (c == '\r')) - { - buffer[index] = 0; - fprintf (stdout, "%s", buffer); - state = 0; - index = 0; - } - break; - default: - break; - } - } - } - else if (stack_trace_done) - break; - } - - close (in_fd[0]); - close (in_fd[1]); - close (out_fd[0]); - close (out_fd[1]); - _exit (0); -#else - abort (); -#endif + if (err && *err) + { + g_error_free (*err); + *err = NULL; + } } diff --git a/gerror.h b/gerror.h new file mode 100644 index 000000000..a3a07d4d1 --- /dev/null +++ b/gerror.h @@ -0,0 +1,72 @@ +/* gerror.h - Error reporting system + * + * Copyright 2000 Red Hat, Inc. + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GERROR_H__ +#define __GERROR_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct _GError GError; + +struct _GError +{ + GQuark domain; + gint code; + gchar *message; +}; + +GError* g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (3, 4); + +GError* g_error_new_literal (GQuark domain, + gint code, + const gchar *message); + +void g_error_free (GError *error); +GError* g_error_copy (const GError *error); + +gboolean g_error_matches (const GError *error, + GQuark domain, + gint code); + +/* if (err) *err = g_error_new(domain, code, format, ...), also has + * some sanity checks. + */ +void g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (4, 5); + +/* if (err && *err) { g_error_free(*err); *err = NULL; } */ +void g_clear_error (GError **err); + + +#ifdef __cplusplus +} +#endif + +#endif /* __GERROR_H__ */ + diff --git a/glib.h b/glib.h index d7ac6d503..31f1e1aa2 100644 --- a/glib.h +++ b/glib.h @@ -3326,6 +3326,7 @@ guint g_thread_pool_get_num_unused_threads (void); void g_thread_pool_stop_unused_threads (void); #include +#include #ifdef __cplusplus } diff --git a/glib/Makefile.am b/glib/Makefile.am index f47fff298..ae5fedc55 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -38,6 +38,7 @@ lib_LTLIBRARIES = libglib.la libglib_la_SOURCES = \ garray.c \ gasyncqueue.c \ + gbacktrace.c \ gcache.c \ gcompletion.c \ gdataset.c \ @@ -71,7 +72,7 @@ libglib_la_SOURCES = \ gunidecomp.c \ gutils.c -include_HEADERS = glib.h glib-object.h gunicode.h +include_HEADERS = glib.h glib-object.h gunicode.h gerror.h configexecincludedir = $(pkglibdir)/include #configexecinclude_DATA = glibconfig.h diff --git a/glib/gerror.c b/glib/gerror.c index 7fa77687c..42ea1b61f 100644 --- a/glib/gerror.c +++ b/glib/gerror.c @@ -24,275 +24,126 @@ * GLib at ftp://ftp.gtk.org/pub/gtk/. */ -/* - * MT safe ; except for g_on_error_stack_trace, but who wants thread safety - * then - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include -#include #include "glib.h" -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_SYS_TIMES_H -#include -#endif -#include -#include -#ifdef HAVE_UNISTD_H -#include -#endif - -#ifdef HAVE_SYS_SELECT_H -#include -#endif /* HAVE_SYS_SELECT_H */ - -#ifdef STDC_HEADERS -#include /* for bzero on BSD systems */ -#endif - -#ifdef G_OS_WIN32 -# define STRICT /* Strict typing, please */ -# include -# include /* For _getpid() */ -#endif - -#ifndef NO_FD_SET -# define SELECT_MASK fd_set -#else -# if defined(_IBMR2) -# define SELECT_MASK void -# else -# define SELECT_MASK int -# endif -#endif - - -static void stack_trace (char **args); - -extern volatile gboolean glib_on_error_halt; -volatile gboolean glib_on_error_halt = TRUE; - -void -g_on_error_query (const gchar *prg_name) +static GError* +g_error_new_valist(GQuark domain, + gint code, + const gchar *format, + va_list args) { -#ifndef G_OS_WIN32 - static const gchar *query1 = "[E]xit, [H]alt"; - static const gchar *query2 = ", show [S]tack trace"; - static const gchar *query3 = " or [P]roceed"; - gchar buf[16]; + GError *error; + + error = g_new (GError, 1); + + error->domain = domain; + error->code = code; + error->message = g_strdup_vprintf (format, args); + + return error; +} - if (!prg_name) - prg_name = g_get_prgname (); - - retry: - - if (prg_name) - fprintf (stdout, - "%s (pid:%u): %s%s%s: ", - prg_name, - (guint) getpid (), - query1, - query2, - query3); - else - fprintf (stdout, - "(process:%u): %s%s: ", - (guint) getpid (), - query1, - query3); - fflush (stdout); - - if (isatty(0) && isatty(1)) - fgets (buf, 8, stdin); - else - strcpy (buf, "E\n"); +GError* +g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) +{ + GError* error; + va_list args; - if ((buf[0] == 'E' || buf[0] == 'e') - && buf[1] == '\n') - _exit (0); - else if ((buf[0] == 'P' || buf[0] == 'p') - && buf[1] == '\n') - return; - else if (prg_name - && (buf[0] == 'S' || buf[0] == 's') - && buf[1] == '\n') - { - g_on_error_stack_trace (prg_name); - goto retry; - } - else if ((buf[0] == 'H' || buf[0] == 'h') - && buf[1] == '\n') - { - while (glib_on_error_halt) - ; - glib_on_error_halt = TRUE; - return; - } - else - goto retry; -#else - if (!prg_name) - prg_name = g_get_prgname (); + g_return_val_if_fail (format != NULL, NULL); + g_return_val_if_fail (domain != 0, NULL); + + va_start (args, format); + error = g_error_new_valist (domain, code, format, args); + va_end (args); + + return error; +} + +GError* +g_error_new_literal (GQuark domain, + gint code, + const gchar *message) +{ + GError* err; + + g_return_val_if_fail (message != NULL, NULL); + g_return_val_if_fail (domain != 0, NULL); + + err = g_new (GError, 1); + + err->domain = domain; + err->code = code; + err->message = g_strdup (message); - MessageBox (NULL, "g_on_error_query called, program terminating", - (prg_name && *prg_name) ? prg_name : NULL, - MB_OK|MB_ICONERROR); - _exit(0); -#endif + return err; } void -g_on_error_stack_trace (const gchar *prg_name) +g_error_free (GError *error) { -#ifdef G_OS_UNIX - pid_t pid; - gchar buf[16]; - gchar *args[4] = { "gdb", NULL, NULL, NULL }; + g_return_if_fail (error != NULL); - if (!prg_name) + g_free (error->message); + + g_free (error); +} + +GError* +g_error_copy (const GError *error) +{ + GError *copy; + + g_return_val_if_fail (error != NULL, NULL); + + copy = g_new (GError, 1); + + *copy = *error; + + copy->message = g_strdup (error->message); + + return copy; +} + +gboolean +g_error_matches (const GError *error, + GQuark domain, + gint code) +{ + return error && + error->domain == domain && + error->code == code; +} + +void +g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) +{ + va_list args; + + if (err == NULL) return; - sprintf (buf, "%u", (guint) getpid ()); - - args[1] = (gchar*) prg_name; - args[2] = buf; - - pid = fork (); - if (pid == 0) - { - stack_trace (args); - _exit (0); - } - else if (pid == (pid_t) -1) - { - perror ("unable to fork gdb"); - return; - } + if (*err != NULL) + g_warning ("GError set over the top of a previous GError or uninitialized memory.\n" + "This indicates a bug in someone's code. You must ensure an error is NULL before it's set."); - while (glib_on_error_halt) - ; - glib_on_error_halt = TRUE; -#else - abort (); -#endif + va_start (args, format); + *err = g_error_new_valist (domain, code, format, args); + va_end (args); } -static gboolean stack_trace_done = FALSE; - -static void -stack_trace_sigchld (int signum) +void +g_clear_error (GError **err) { - stack_trace_done = TRUE; -} - -static void -stack_trace (char **args) -{ -#ifdef G_OS_UNIX - pid_t pid; - int in_fd[2]; - int out_fd[2]; - SELECT_MASK fdset; - SELECT_MASK readset; - struct timeval tv; - int sel, index, state; - char buffer[256]; - char c; - - stack_trace_done = FALSE; - signal (SIGCHLD, stack_trace_sigchld); - - if ((pipe (in_fd) == -1) || (pipe (out_fd) == -1)) - { - perror ("unable to open pipe"); - _exit (0); - } - - pid = fork (); - if (pid == 0) - { - close (0); dup (in_fd[0]); /* set the stdin to the in pipe */ - close (1); dup (out_fd[1]); /* set the stdout to the out pipe */ - close (2); dup (out_fd[1]); /* set the stderr to the out pipe */ - - execvp (args[0], args); /* exec gdb */ - perror ("exec failed"); - _exit (0); - } - else if (pid == (pid_t) -1) - { - perror ("unable to fork"); - _exit (0); - } - - FD_ZERO (&fdset); - FD_SET (out_fd[0], &fdset); - - write (in_fd[1], "backtrace\n", 10); - write (in_fd[1], "p x = 0\n", 8); - write (in_fd[1], "quit\n", 5); - - index = 0; - state = 0; - - while (1) - { - readset = fdset; - tv.tv_sec = 1; - tv.tv_usec = 0; - - sel = select (FD_SETSIZE, &readset, NULL, NULL, &tv); - if (sel == -1) - break; - - if ((sel > 0) && (FD_ISSET (out_fd[0], &readset))) - { - if (read (out_fd[0], &c, 1)) - { - switch (state) - { - case 0: - if (c == '#') - { - state = 1; - index = 0; - buffer[index++] = c; - } - break; - case 1: - buffer[index++] = c; - if ((c == '\n') || (c == '\r')) - { - buffer[index] = 0; - fprintf (stdout, "%s", buffer); - state = 0; - index = 0; - } - break; - default: - break; - } - } - } - else if (stack_trace_done) - break; - } - - close (in_fd[0]); - close (in_fd[1]); - close (out_fd[0]); - close (out_fd[1]); - _exit (0); -#else - abort (); -#endif + if (err && *err) + { + g_error_free (*err); + *err = NULL; + } } diff --git a/glib/gerror.h b/glib/gerror.h new file mode 100644 index 000000000..a3a07d4d1 --- /dev/null +++ b/glib/gerror.h @@ -0,0 +1,72 @@ +/* gerror.h - Error reporting system + * + * Copyright 2000 Red Hat, Inc. + * + * The Gnome Library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * The Gnome Library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with the Gnome Library; see the file COPYING.LIB. If not, + * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __GERROR_H__ +#define __GERROR_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + +typedef struct _GError GError; + +struct _GError +{ + GQuark domain; + gint code; + gchar *message; +}; + +GError* g_error_new (GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (3, 4); + +GError* g_error_new_literal (GQuark domain, + gint code, + const gchar *message); + +void g_error_free (GError *error); +GError* g_error_copy (const GError *error); + +gboolean g_error_matches (const GError *error, + GQuark domain, + gint code); + +/* if (err) *err = g_error_new(domain, code, format, ...), also has + * some sanity checks. + */ +void g_set_error (GError **err, + GQuark domain, + gint code, + const gchar *format, + ...) G_GNUC_PRINTF (4, 5); + +/* if (err && *err) { g_error_free(*err); *err = NULL; } */ +void g_clear_error (GError **err); + + +#ifdef __cplusplus +} +#endif + +#endif /* __GERROR_H__ */ + diff --git a/glib/glib.h b/glib/glib.h index d7ac6d503..31f1e1aa2 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -3326,6 +3326,7 @@ guint g_thread_pool_get_num_unused_threads (void); void g_thread_pool_stop_unused_threads (void); #include +#include #ifdef __cplusplus }