libgimpconfig: add a GimpScanner typedef and make it a boxed type

Replace _destroy() by _ref() and _unref().
This commit is contained in:
Michael Natterer 2019-08-09 12:42:52 +02:00
parent 41fb552988
commit d3d621b502
12 changed files with 173 additions and 118 deletions

View file

@ -138,7 +138,7 @@ gimp_modules_load (Gimp *gimp)
g_clear_error (&error);
}
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
}
if (module_load_inhibit)

View file

@ -283,7 +283,7 @@ gimp_unitrc_load (Gimp *gimp)
gimp_config_file_backup_on_error (file, "unitrc", NULL);
}
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
g_object_unref (file);
}

View file

@ -139,7 +139,7 @@ gimp_palette_mru_load (GimpPaletteMru *mru,
}
end:
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
}
void

View file

@ -317,7 +317,7 @@ session_init (Gimp *gimp)
gimp_config_file_backup_on_error (file, "sessionrc", NULL);
}
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
g_object_unref (file);
dialogs_load_recent_docks (gimp);

View file

@ -257,7 +257,7 @@ plug_in_rc_parse (Gimp *gimp,
g_type_class_unref (enum_class);
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
return g_slist_reverse (plug_in_defs);
}

View file

@ -200,7 +200,7 @@ gimp_action_history_init (Gimp *gimp)
}
done:
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
}
void

View file

@ -497,7 +497,7 @@ gimp_config_deserialize_file (GimpConfig *config,
g_object_thaw_notify (G_OBJECT (config));
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
if (! success)
g_assert (error == NULL || *error != NULL);
@ -545,7 +545,7 @@ gimp_config_deserialize_gfile (GimpConfig *config,
g_object_thaw_notify (G_OBJECT (config));
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
if (! success)
g_assert (error == NULL || *error != NULL);
@ -593,7 +593,7 @@ gimp_config_deserialize_stream (GimpConfig *config,
g_object_thaw_notify (G_OBJECT (config));
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
if (! success)
g_assert (error == NULL || *error != NULL);
@ -640,7 +640,7 @@ gimp_config_deserialize_string (GimpConfig *config,
g_object_thaw_notify (G_OBJECT (config));
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
if (! success)
g_assert (error == NULL || *error != NULL);

View file

@ -29,6 +29,7 @@
typedef struct _GimpConfig GimpConfig; /* dummy typedef */
typedef struct _GimpConfigWriter GimpConfigWriter;
typedef gchar * GimpConfigPath; /* to satisfy docs */
typedef struct _GScanner GimpScanner;
typedef struct _GimpColorConfig GimpColorConfig;

View file

@ -349,7 +349,7 @@ gimp_config_writer_ref (GimpConfigWriter *writer)
* @writer: #GimpConfigWriter to unref
*
* Unref a #GimpConfigWriter. If the reference count drops to zero, the
* array including its contents are freed.
* writer is freed.
*
* Note that at least one of the references has to be dropped using
* gimp_config_writer_finish().

View file

@ -50,6 +50,7 @@
typedef struct
{
gint ref_count;
gchar *name;
GMappedFile *mapped;
gchar *text;
@ -57,15 +58,20 @@ typedef struct
} GimpScannerData;
G_DEFINE_BOXED_TYPE (GimpScanner, gimp_scanner,
gimp_scanner_ref, gimp_scanner_unref)
/* local function prototypes */
static GScanner * gimp_scanner_new (const gchar *name,
GMappedFile *mapped,
gchar *text,
GError **error);
static void gimp_scanner_message (GScanner *scanner,
gchar *message,
gboolean is_error);
static GimpScanner * gimp_scanner_new (const gchar *name,
GMappedFile *mapped,
gchar *text,
GError **error);
static void gimp_scanner_message (GimpScanner *scanner,
gchar *message,
gboolean is_error);
/* public functions */
@ -75,16 +81,16 @@ static void gimp_scanner_message (GScanner *scanner,
* @filename:
* @error:
*
* Returns:
* Returns: (transfer full): The new #GimpScanner.
*
* Since: 2.4
**/
GScanner *
GimpScanner *
gimp_scanner_new_file (const gchar *filename,
GError **error)
{
GScanner *scanner;
GFile *file;
GimpScanner *scanner;
GFile *file;
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@ -101,16 +107,16 @@ gimp_scanner_new_file (const gchar *filename,
* @file: a #GFile
* @error: return location for #GError, or %NULL
*
* Returns: The new #GScanner.
* Returns: (transfer full): The new #GimpScanner.
*
* Since: 2.10
**/
GScanner *
GimpScanner *
gimp_scanner_new_gfile (GFile *file,
GError **error)
{
GScanner *scanner;
gchar *path;
GimpScanner *scanner;
gchar *path;
g_return_val_if_fail (G_IS_FILE (file), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@ -179,15 +185,15 @@ gimp_scanner_new_gfile (GFile *file,
* @input: a #GInputStream
* @error: return location for #GError, or %NULL
*
* Returns: The new #GScanner.
* Returns: (transfer full): The new #GimpScanner.
*
* Since: 2.10
**/
GScanner *
GimpScanner *
gimp_scanner_new_stream (GInputStream *input,
GError **error)
{
GScanner *scanner;
GimpScanner *scanner;
GFile *file;
const gchar *path;
GString *string;
@ -252,16 +258,16 @@ gimp_scanner_new_stream (GInputStream *input,
* @text_len:
* @error:
*
* Returns:
* Returns: (transfer full): The new #GimpScanner.
*
* Since: 2.4
**/
GScanner *
GimpScanner *
gimp_scanner_new_string (const gchar *text,
gint text_len,
GError **error)
{
GScanner *scanner;
GimpScanner *scanner;
g_return_val_if_fail (text != NULL || text_len == 0, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
@ -276,23 +282,24 @@ gimp_scanner_new_string (const gchar *text,
return scanner;
}
static GScanner *
static GimpScanner *
gimp_scanner_new (const gchar *name,
GMappedFile *mapped,
gchar *text,
GError **error)
{
GScanner *scanner;
GimpScanner *scanner;
GimpScannerData *data;
scanner = g_scanner_new (NULL);
data = g_slice_new0 (GimpScannerData);
data->name = g_strdup (name);
data->mapped = mapped;
data->text = text;
data->error = error;
data->ref_count = 1;
data->name = g_strdup (name);
data->mapped = mapped;
data->text = text;
data->error = error;
scanner->user_data = data;
scanner->msg_handler = gimp_scanner_message;
@ -308,14 +315,41 @@ gimp_scanner_new (const gchar *name,
}
/**
* gimp_scanner_destroy:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* gimp_scanner_ref:
* @scanner: #GimpScanner to ref
*
* Adds a reference to a #GimpScanner.
*
* Returns: the same @scanner.
*
* Since: 3.0
*/
GimpScanner *
gimp_scanner_ref (GimpScanner *scanner)
{
GimpScannerData *data;
g_return_val_if_fail (scanner != NULL, NULL);
data = scanner->user_data;
data->ref_count++;
return scanner;
}
/**
* gimp_scanner_unref:
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
*
* Since: 2.4
* Unref a #GimpScanner. If the reference count drops to zero, the
* scanner is freed.
*
* Since: 3.0
**/
void
gimp_scanner_destroy (GScanner *scanner)
gimp_scanner_unref (GimpScanner *scanner)
{
GimpScannerData *data;
@ -323,21 +357,26 @@ gimp_scanner_destroy (GScanner *scanner)
data = scanner->user_data;
if (data->mapped)
g_mapped_file_unref (data->mapped);
data->ref_count--;
if (data->text)
g_free (data->text);
if (data->ref_count < 1)
{
if (data->mapped)
g_mapped_file_unref (data->mapped);
g_free (data->name);
g_slice_free (GimpScannerData, data);
if (data->text)
g_free (data->text);
g_scanner_destroy (scanner);
g_free (data->name);
g_slice_free (GimpScannerData, data);
g_scanner_destroy (scanner);
}
}
/**
* gimp_scanner_parse_token:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @token: the #GTokenType expected as next token.
*
@ -346,8 +385,8 @@ gimp_scanner_destroy (GScanner *scanner)
* Since: 2.4
**/
gboolean
gimp_scanner_parse_token (GScanner *scanner,
GTokenType token)
gimp_scanner_parse_token (GimpScanner *scanner,
GTokenType token)
{
if (g_scanner_peek_next_token (scanner) != token)
return FALSE;
@ -359,7 +398,7 @@ gimp_scanner_parse_token (GScanner *scanner,
/**
* gimp_scanner_parse_identifier:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @identifier: the expected identifier.
*
@ -369,7 +408,7 @@ gimp_scanner_parse_token (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_identifier (GScanner *scanner,
gimp_scanner_parse_identifier (GimpScanner *scanner,
const gchar *identifier)
{
if (g_scanner_peek_next_token (scanner) != G_TOKEN_IDENTIFIER)
@ -385,7 +424,7 @@ gimp_scanner_parse_identifier (GScanner *scanner,
/**
* gimp_scanner_parse_string:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Return location for the parsed string
*
@ -394,8 +433,8 @@ gimp_scanner_parse_identifier (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_string (GScanner *scanner,
gchar **dest)
gimp_scanner_parse_string (GimpScanner *scanner,
gchar **dest)
{
if (g_scanner_peek_next_token (scanner) != G_TOKEN_STRING)
return FALSE;
@ -422,7 +461,7 @@ gimp_scanner_parse_string (GScanner *scanner,
/**
* gimp_scanner_parse_string_no_validate:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Return location for the parsed string
*
@ -431,8 +470,8 @@ gimp_scanner_parse_string (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_string_no_validate (GScanner *scanner,
gchar **dest)
gimp_scanner_parse_string_no_validate (GimpScanner *scanner,
gchar **dest)
{
if (g_scanner_peek_next_token (scanner) != G_TOKEN_STRING)
return FALSE;
@ -449,7 +488,7 @@ gimp_scanner_parse_string_no_validate (GScanner *scanner,
/**
* gimp_scanner_parse_data:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @length: Length of the data to parse
* @dest: Return location for the parsed data
@ -459,9 +498,9 @@ gimp_scanner_parse_string_no_validate (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_data (GScanner *scanner,
gint length,
guint8 **dest)
gimp_scanner_parse_data (GimpScanner *scanner,
gint length,
guint8 **dest)
{
if (g_scanner_peek_next_token (scanner) != G_TOKEN_STRING)
return FALSE;
@ -478,7 +517,7 @@ gimp_scanner_parse_data (GScanner *scanner,
/**
* gimp_scanner_parse_int:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Return location for the parsed integer
*
@ -487,8 +526,8 @@ gimp_scanner_parse_data (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_int (GScanner *scanner,
gint *dest)
gimp_scanner_parse_int (GimpScanner *scanner,
gint *dest)
{
gboolean negate = FALSE;
@ -513,7 +552,7 @@ gimp_scanner_parse_int (GScanner *scanner,
/**
* gimp_scanner_parse_int64:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Return location for the parsed integer
*
@ -522,8 +561,8 @@ gimp_scanner_parse_int (GScanner *scanner,
* Since: 2.8
**/
gboolean
gimp_scanner_parse_int64 (GScanner *scanner,
gint64 *dest)
gimp_scanner_parse_int64 (GimpScanner *scanner,
gint64 *dest)
{
gboolean negate = FALSE;
@ -548,7 +587,7 @@ gimp_scanner_parse_int64 (GScanner *scanner,
/**
* gimp_scanner_parse_float:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Return location for the parsed float
*
@ -557,8 +596,8 @@ gimp_scanner_parse_int64 (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_float (GScanner *scanner,
gdouble *dest)
gimp_scanner_parse_float (GimpScanner *scanner,
gdouble *dest)
{
gboolean negate = FALSE;
@ -596,7 +635,7 @@ gimp_scanner_parse_float (GScanner *scanner,
/**
* gimp_scanner_parse_boolean:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Return location for the parsed boolean
*
@ -605,8 +644,8 @@ gimp_scanner_parse_float (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_boolean (GScanner *scanner,
gboolean *dest)
gimp_scanner_parse_boolean (GimpScanner *scanner,
gboolean *dest)
{
if (g_scanner_peek_next_token (scanner) != G_TOKEN_IDENTIFIER)
return FALSE;
@ -647,7 +686,7 @@ enum
/**
* gimp_scanner_parse_color:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: (out caller-allocates): Pointer to a color to store the result
*
@ -656,8 +695,8 @@ enum
* Since: 2.4
**/
gboolean
gimp_scanner_parse_color (GScanner *scanner,
GimpRGB *dest)
gimp_scanner_parse_color (GimpScanner *scanner,
GimpRGB *dest)
{
guint scope_id;
guint old_scope_id;
@ -767,7 +806,7 @@ gimp_scanner_parse_color (GScanner *scanner,
/**
* gimp_scanner_parse_matrix2:
* @scanner: A #GScanner created by gimp_scanner_new_file() or
* @scanner: A #GimpScanner created by gimp_scanner_new_file() or
* gimp_scanner_new_string()
* @dest: Pointer to a matrix to store the result
*
@ -776,7 +815,7 @@ gimp_scanner_parse_color (GScanner *scanner,
* Since: 2.4
**/
gboolean
gimp_scanner_parse_matrix2 (GScanner *scanner,
gimp_scanner_parse_matrix2 (GimpScanner *scanner,
GimpMatrix2 *dest)
{
guint scope_id;
@ -851,9 +890,9 @@ gimp_scanner_parse_matrix2 (GScanner *scanner,
/* private functions */
static void
gimp_scanner_message (GScanner *scanner,
gchar *message,
gboolean is_error)
gimp_scanner_message (GimpScanner *scanner,
gchar *message,
gboolean is_error)
{
GimpScannerData *data = scanner->user_data;

View file

@ -28,40 +28,55 @@
#define __GIMP_SCANNER_H__
GScanner * gimp_scanner_new_file (const gchar *filename,
GError **error);
GScanner * gimp_scanner_new_gfile (GFile *file,
GError **error);
GScanner * gimp_scanner_new_stream (GInputStream *input,
GError **error);
GScanner * gimp_scanner_new_string (const gchar *text,
gint text_len,
GError **error);
void gimp_scanner_destroy (GScanner *scanner);
/**
* GIMP_TYPE_SCANNER:
*
* The type ID of the GIMP scanner type which is a boxed type, used to
* read config files.
*
* Since: 3.0
*/
#define GIMP_TYPE_SCANNER (gimp_scnner_get_type ())
gboolean gimp_scanner_parse_token (GScanner *scanner,
GTokenType token);
gboolean gimp_scanner_parse_identifier (GScanner *scanner,
const gchar *identifier);
gboolean gimp_scanner_parse_string (GScanner *scanner,
gchar **dest);
gboolean gimp_scanner_parse_string_no_validate (GScanner *scanner,
gchar **dest);
gboolean gimp_scanner_parse_data (GScanner *scanner,
gint length,
guint8 **dest);
gboolean gimp_scanner_parse_int (GScanner *scanner,
gint *dest);
gboolean gimp_scanner_parse_int64 (GScanner *scanner,
gint64 *dest);
gboolean gimp_scanner_parse_float (GScanner *scanner,
gdouble *dest);
gboolean gimp_scanner_parse_boolean (GScanner *scanner,
gboolean *dest);
gboolean gimp_scanner_parse_color (GScanner *scanner,
GimpRGB *dest);
gboolean gimp_scanner_parse_matrix2 (GScanner *scanner,
GimpMatrix2 *dest);
GType gimp_scanner_get_type (void) G_GNUC_CONST;
GimpScanner * gimp_scanner_new_file (const gchar *filename,
GError **error);
GimpScanner * gimp_scanner_new_gfile (GFile *file,
GError **error);
GimpScanner * gimp_scanner_new_stream (GInputStream *input,
GError **error);
GimpScanner * gimp_scanner_new_string (const gchar *text,
gint text_len,
GError **error);
GimpScanner * gimp_scanner_ref (GimpScanner *scanner);
void gimp_scanner_unref (GimpScanner *scanner);
gboolean gimp_scanner_parse_token (GimpScanner *scanner,
GTokenType token);
gboolean gimp_scanner_parse_identifier (GimpScanner *scanner,
const gchar *identifier);
gboolean gimp_scanner_parse_string (GimpScanner *scanner,
gchar **dest);
gboolean gimp_scanner_parse_string_no_validate (GimpScanner *scanner,
gchar **dest);
gboolean gimp_scanner_parse_data (GimpScanner *scanner,
gint length,
guint8 **dest);
gboolean gimp_scanner_parse_int (GimpScanner *scanner,
gint *dest);
gboolean gimp_scanner_parse_int64 (GimpScanner *scanner,
gint64 *dest);
gboolean gimp_scanner_parse_float (GimpScanner *scanner,
gdouble *dest);
gboolean gimp_scanner_parse_boolean (GimpScanner *scanner,
gboolean *dest);
gboolean gimp_scanner_parse_color (GimpScanner *scanner,
GimpRGB *dest);
gboolean gimp_scanner_parse_matrix2 (GimpScanner *scanner,
GimpMatrix2 *dest);
#endif /* __GIMP_SCANNER_H__ */

View file

@ -680,7 +680,7 @@ gimp_color_profile_store_load (GimpColorProfileStore *store,
_("fatal parse error"), TRUE);
}
gimp_scanner_destroy (scanner);
gimp_scanner_unref (scanner);
return TRUE;
}