/** * gimp_scanner_new_file: * @filename: * @error: * * Return value: * * Since: GIMP 2.4 **/ GScanner * gimp_scanner_new_file (const gchar *filename, GError **error) { GScanner *scanner; GMappedFile *file; g_return_val_if_fail (filename != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); file = g_mapped_file_new (filename, FALSE, error); if (! file) { if (error) { (*error)->domain = GIMP_CONFIG_ERROR; (*error)->code = ((*error)->code == G_FILE_ERROR_NOENT ? GIMP_CONFIG_ERROR_OPEN_ENOENT : GIMP_CONFIG_ERROR_OPEN); } return NULL; } /* gimp_scanner_new() takes a "name" for the scanner, not a filename */ scanner = gimp_scanner_new (gimp_filename_to_utf8 (filename), file, error); g_scanner_input_text (scanner, g_mapped_file_get_contents (file), g_mapped_file_get_length (file)); return scanner; }
/** * gimp_scanner_new_string: * @text: * @text_len: * @error: * * Return value: * * Since: 2.4 **/ GScanner * gimp_scanner_new_string (const gchar *text, gint text_len, GError **error) { GScanner *scanner; g_return_val_if_fail (text != NULL || text_len == 0, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (text_len < 0) text_len = strlen (text); scanner = gimp_scanner_new (NULL, NULL, NULL, error); g_scanner_input_text (scanner, text, text_len); return scanner; }
/** * gimp_scanner_new_stream: * @input: a #GInputStream * @error: return location for #GError, or %NULL * * Return value: The new #GScanner. * * Since: 2.10 **/ GScanner * gimp_scanner_new_stream (GInputStream *input, GError **error) { GScanner *scanner; GFile *file; const gchar *path; GString *string; gchar buffer[4096]; gsize bytes_read; g_return_val_if_fail (G_IS_INPUT_STREAM (input), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); file = g_object_get_data (G_OBJECT (input), "gimp-file"); if (file) path = gimp_file_get_utf8_name (file); else path = "stream"; string = g_string_new (NULL); do { GError *my_error = NULL; gboolean success; success = g_input_stream_read_all (input, buffer, sizeof (buffer), &bytes_read, NULL, &my_error); if (bytes_read > 0) g_string_append_len (string, buffer, bytes_read); if (! success) { if (string->len > 0) { g_printerr ("%s: read error in '%s', trying to scan " "partial content: %s", G_STRFUNC, path, my_error->message); g_clear_error (&my_error); break; } g_string_free (string, TRUE); g_propagate_error (error, my_error); return NULL; } } while (bytes_read == sizeof (buffer)); /* gimp_scanner_new() takes a "name" for the scanner, not a filename */ scanner = gimp_scanner_new (path, NULL, string->str, error); bytes_read = string->len; g_scanner_input_text (scanner, g_string_free (string, FALSE), bytes_read); return scanner; }
/** * gimp_scanner_new_gfile: * @file: a #GFile * @error: return location for #GError, or %NULL * * Return value: The new #GScanner. * * Since: 2.10 **/ GScanner * gimp_scanner_new_gfile (GFile *file, GError **error) { GScanner *scanner; gchar *path; g_return_val_if_fail (G_IS_FILE (file), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); path = g_file_get_path (file); if (path) { GMappedFile *mapped; mapped = g_mapped_file_new (path, FALSE, error); g_free (path); if (! mapped) { if (error) { (*error)->domain = GIMP_CONFIG_ERROR; (*error)->code = ((*error)->code == G_FILE_ERROR_NOENT ? GIMP_CONFIG_ERROR_OPEN_ENOENT : GIMP_CONFIG_ERROR_OPEN); } return NULL; } /* gimp_scanner_new() takes a "name" for the scanner, not a filename */ scanner = gimp_scanner_new (gimp_file_get_utf8_name (file), mapped, NULL, error); g_scanner_input_text (scanner, g_mapped_file_get_contents (mapped), g_mapped_file_get_length (mapped)); } else { GInputStream *input; input = G_INPUT_STREAM (g_file_read (file, NULL, error)); if (! input) { if (error) { (*error)->domain = GIMP_CONFIG_ERROR; (*error)->code = ((*error)->code == G_IO_ERROR_NOT_FOUND ? GIMP_CONFIG_ERROR_OPEN_ENOENT : GIMP_CONFIG_ERROR_OPEN); } return NULL; } g_object_set_data (G_OBJECT (input), "gimp-data", file); scanner = gimp_scanner_new_stream (input, error); g_object_unref (input); } return scanner; }