Moved string functions to gm-string, improved file reading

This commit is contained in:
Jesse van den Kieboom 2005-11-15 12:02:38 +00:00
parent 5f77eaba58
commit 56a85b6557
2 changed files with 268 additions and 301 deletions

View File

@ -8,6 +8,8 @@
#include <string.h>
#include <stdio.h>
#include <locale.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <gtk/gtk.h>
#include <regex.h>
@ -76,17 +78,16 @@ gm_ansi_strip(gchar * s) {
}
int
garray_length(gchar **s) {
int i = 0;
gm_garray_length(gchar **s) {
gchar **iter = s;
while (s[i] != NULL) {
i++;
}
while (*iter++ != NULL)
;
return i;
return *iter - *s - 1;
}
void g_list_free_simple(GList *s) {
void gm_g_list_free_simple(GList *s) {
GList *tmp;
for (tmp = s; tmp; tmp = tmp->next) {
@ -97,7 +98,7 @@ void g_list_free_simple(GList *s) {
}
gchar *
g_list_find_simple(GList *s, gchar *f) {
gm_g_list_find_simple(GList *s, gchar *f) {
GList *tmp;
for (tmp = s; tmp; tmp = tmp->next) {
@ -118,8 +119,7 @@ gm_dialog(gchar * message, GtkMessageType messagebox_type,
//parent = GTK_WINDOW(if_main_get_widget("wndMain"));
}
dlg =
gtk_message_dialog_new(parent,
dlg = gtk_message_dialog_new(parent,
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
messagebox_type, GTK_BUTTONS_OK, message, NULL);
gtk_dialog_run(GTK_DIALOG(dlg));
@ -153,34 +153,6 @@ gm_do_events() {
}
}
gchar *
gm_str_escape(gchar * line) {
gchar *newLine;
int i, j = 0;
if (strlen(line) == 0) {
return g_strdup("");
}
if (strstr(line, "\"") || strstr(line, "\\")) {
newLine = g_new(gchar, (strlen(line) * 2) + 1);
for (i = 0; i < (int)strlen(line); i++) {
if (line[i] == '"' || line[i] == '\\') {
newLine[j] = '\\';
j++;
}
newLine[j] = line[i];
j++;
}
newLine[j] = '\0';
return newLine;
} else {
return g_strdup(line);
}
}
void
gm_directory_remove_all(const gchar * path, gboolean remove_self) {
GDir *cDir;
@ -195,6 +167,7 @@ gm_directory_remove_all(const gchar * path, gboolean remove_self) {
gm_directory_remove_all(newPath, TRUE);
g_free(newPath);
}
g_dir_close(cDir);
}
}
@ -245,24 +218,24 @@ gm_url_regex_match(const gchar *msg, int len, GArray *start, GArray *end) {
}
void
gm_open_url (const gchar *url) {
if (!url || strlen (url) == 0) {
gm_open_url(const gchar *url) {
if (url == NULL || *url == '\0') {
return;
}
/* gnome_url_show doesn't work when there's no protocol, so we might
* need to add one.
*/
if (strstr (url, "://") == NULL) {
if (strstr(url, "://") == NULL) {
gchar *tmp;
tmp = g_strconcat ("http://", url, NULL);
tmp = g_strconcat("http://", url, NULL);
gnome_url_show(tmp, NULL);
g_free (tmp);
g_free(tmp);
return;
}
gnome_url_show (url, NULL);
gnome_url_show(url, NULL);
}
void
@ -311,7 +284,7 @@ gm_fetch_progress(GnomeVFSAsyncHandle *handle,
GnomeVFSXferProgressInfo *info,
GmFetchHandle *g) {
gchar *name;
const gchar *err;
gchar const *err;
g->cur_phase = info->phase;
g->cur_file = info->file_index;
@ -345,7 +318,8 @@ gm_fetch_progress(GnomeVFSAsyncHandle *handle,
if (info->status == GNOME_VFS_XFER_PROGRESS_STATUS_OVERWRITE) {
name = gnome_vfs_get_local_path_from_uri(info->target_name);
gm_debug_msg(DEBUG_DEFAULT, "gnoemoe_fetch_progress: asking for overwriting %s: yes", name);
gm_debug_msg(DEBUG_DEFAULT, "GmFetchProgress: asking for overwriting "
"%s: yes", name);
g->prev_status = GNOME_VFS_XFER_PROGRESS_STATUS_OVERWRITE;
return GNOME_VFS_XFER_OVERWRITE_ACTION_REPLACE;
@ -354,7 +328,8 @@ gm_fetch_progress(GnomeVFSAsyncHandle *handle,
err = gnome_vfs_result_to_string(info->vfs_status);
gdk_threads_enter();
gm_debug_msg(DEBUG_DEFAULT, "gnoemoe_fetch_progress: error for %s: %s", name, err);
gm_debug_msg(DEBUG_DEFAULT, "GmFetchProgress: error for %s: %s", name,
err);
g->cb(g, g->user_data);
gdk_threads_leave();
@ -377,6 +352,7 @@ gm_fetch_progress(GnomeVFSAsyncHandle *handle,
g->done = TRUE;
g->cb(g, g->user_data);
gm_fetch_handle_free(g);
return TRUE;
}
@ -395,6 +371,7 @@ gm_fetch(const GList *source, const GList *dest,
GFunc cb, gpointer user_data) {
GmFetchHandle *g = gm_fetch_handle_create(cb, user_data);
gchar *uri;
GnomeVFSResult ret;
for (; source; source = source->next) {
uri = (gchar *)(source->data);
@ -406,13 +383,14 @@ gm_fetch(const GList *source, const GList *dest,
g->dest_uri = g_list_append(g->dest_uri, gnome_vfs_uri_new(uri));
}
gnome_vfs_async_xfer(&(g->handle), g->source_uri, g->dest_uri,
ret = gnome_vfs_async_xfer(&(g->handle), g->source_uri, g->dest_uri,
GNOME_VFS_XFER_DEFAULT|GNOME_VFS_XFER_RECURSIVE,
GNOME_VFS_XFER_ERROR_MODE_QUERY,
GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
GNOME_VFS_PRIORITY_DEFAULT,
(GnomeVFSAsyncXferProgressCallback)gm_fetch_progress,
g, gm_fetch_interact, g);
return g;
}
@ -446,64 +424,65 @@ gm_scroll_end(GtkTextView *view, gboolean needs) {
#define MAX_BUF 1024
GString *
gm_read_file(const gchar *fname, gboolean readall, OpenLogProgress func, gpointer user_data) {
FILE *f;
gchar line[MAX_BUF], *tmp;
GString *str = NULL;
long bytes_read = 0, bytes_total = 0;
gchar *
gm_read_file(const gchar *fname) {
int fd;
gchar *tmp, *mapped;
long bytes_total = 0;
if (!fname) {
return NULL;
}
f = fopen(fname, "r");
fd = open(fname, O_RDONLY);
if (f) {
fseek(f, 0, SEEK_END);
bytes_total = ftell(f);
rewind(f);
str = g_string_new("");
while (fgets((char *) &line, MAX_BUF, f) != NULL) {
bytes_read += strlen((char *)&line);
tmp = NULL;
if (g_utf8_validate(line, -1, NULL)) {
if (readall) {
str = g_string_append(str, line);
}
tmp = g_strdup(line);
} else {
tmp = g_locale_to_utf8(line, -1, NULL, NULL, NULL);
if (!tmp) {
tmp = g_convert(line, -1, "UTF-8", "ISO-8859-15", NULL, NULL, NULL);
}
if (!tmp) {
tmp = g_convert(line, -1, "UTF-8", "ISO-8859-15", NULL, NULL, NULL);
}
if (readall) {
str = g_string_append(str, tmp);
}
}
if (func != NULL) {
func(bytes_read, bytes_total, tmp, user_data);
} else {
g_free(tmp);
}
}
fclose(f);
return str;
} else {
gm_debug_msg(DEBUG_DEFAULT, "support_read_file: file (%s) could not be read: %s",
fname, strerror(errno));
if (fd == -1) {
gm_debug_msg(DEBUG_DEFAULT, "GmReadFile: file (%s) could not be read: "
"%s", fname, strerror(errno));
return NULL;
}
bytes_total = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
if (bytes_total == (off_t)-1) {
close(fd);
return NULL;
}
mapped = mmap(0, bytes_total, PROT_READ, MAP_PRIVATE, fd, 0);
if (mapped == MAP_FAILED) {
close(fd);
gm_debug_msg(DEBUG_DEFAULT, "GmReadFile: error while mapping file: %s",
strerror(errno));
return NULL;
}
if (g_utf8_validate(mapped, bytes_total, NULL)) {
// Easy, this is utf8!
tmp = g_strndup(mapped, bytes_total);
} else {
// Try locale
tmp = g_locale_to_utf8(mapped, bytes_total, NULL, NULL, NULL);
if (!tmp) {
// Now we're getting desperate... try ISO-8859-15
tmp = g_convert(mapped, bytes_total, "UTF-8", "ISO-8859-15", NULL,
NULL, NULL);
}
if (!tmp) {
// OMG try one last conversion to ISO-8859-1
tmp = g_convert(mapped, bytes_total, "UTF-8", "ISO-8859-1", NULL,
NULL, NULL);
}
}
munmap(mapped, bytes_total);
close(fd);
return tmp;
}
GtkWidget *
@ -558,10 +537,13 @@ gm_widget_destroy_data(GtkWidget *caller, GtkWidget *destroyer) {
const gchar *
gm_default_charset() {
const gchar *loc = NULL;
g_get_charset(&loc);
static const gchar *loc = NULL;
if (loc == NULL || strlen(loc) == 0) {
if (loc == NULL) {
g_get_charset(&loc);
}
if (loc == NULL || *loc == 0) {
loc = "ISO-8859-15";
}
@ -584,39 +566,6 @@ gm_notebook_focus_from_label(GtkNotebook *note, gchar *caption) {
}
}
void
gm_string_skip_space(gchar **ptr) {
while (**ptr != '\0' && g_unichar_isspace(g_utf8_get_char(*ptr))) {
*ptr = g_utf8_next_char(*ptr);
}
}
void
gm_string_skip_nonspace(gchar **ptr) {
while (**ptr != '\0' && !g_unichar_isspace(g_utf8_get_char(*ptr))) {
*ptr = g_utf8_next_char(*ptr);
}
}
void
gm_string_skip_till(gchar **ptr, gchar const *find) {
gchar const *fptr;
gunichar check;
while (**ptr != '\0') {
check = g_utf8_get_char(*ptr);
for (fptr = find; *fptr; ++fptr) {
// CHECK: find should also be treated as utf8!
if (check == (gunichar)(*fptr)) {
return;
}
}
*ptr = g_utf8_next_char(*ptr);
}
}
gchar *
gm_to_utf8_with_fallback(gchar const *text, gssize len, gchar const *from,
gchar const *fallback) {
@ -645,3 +594,25 @@ gm_to_utf8_with_fallback(gchar const *text, gssize len, gchar const *from,
g_string_free(str, FALSE);
return res;
}
GtkWidget *
gm_container_item(GtkContainer *cnt, GType type) {
GList *child_first = gtk_container_get_children(cnt);
GList *child;
GtkWidget *result = NULL;
for (child = child_first; child; child = child->next) {
if (G_TYPE_CHECK_INSTANCE_TYPE(child->data, type)) {
result = GTK_WIDGET(child->data);
break;
} else if (GTK_IS_CONTAINER(child->data)) {
if ((result = gm_container_item(
GTK_CONTAINER(child->data), type))) {
break;
}
}
}
g_list_free(child_first);
return result;
}

View File

@ -114,8 +114,8 @@ gchar *gm_fix_decimal_point(gchar *line, int len);
gchar *gm_fix_decimal_point_rev(gchar *line, int len);
gchar *gm_ansi_strip(gchar * s);
int garray_length(gchar **s);
void g_list_free_simple(GList *s);
gchar *g_list_find_simple(GList *s, gchar *f);
void gm_g_list_free_simple(GList *s);
gchar *gm_g_list_find_simple(GList *s, gchar *f);
void gm_error_dialog(gchar * message, GtkWindow * parent);
void gm_warning_dialog(gchar * message, GtkWindow * parent);
@ -124,11 +124,10 @@ void gm_question_dialog(gchar * message, GtkWindow * parent);
void gm_do_events();
gchar *gm_str_escape(gchar * line);
void gm_directory_remove_all(const gchar * path, gboolean remove_self);
gint gm_url_regex_match(const gchar *msg, int len, GArray *start, GArray *end);
void gm_open_url (const gchar *url);
void gm_open_url(const gchar *url);
GmFetchHandle * gm_fetch(const GList *source, const GList *dest,
GFunc cb, gpointer user_data);
@ -137,20 +136,17 @@ void gm_fetch_handle_free(GmFetchHandle *g);
gboolean gm_is_end_scrolled(GtkScrolledWindow *wnd, guint charHeight);
void gm_scroll_end(GtkTextView *view, gboolean needs);
typedef void (*OpenLogProgress) (long, long, gchar *, gpointer);
GString *gm_read_file(const gchar *fname, gboolean readall,
OpenLogProgress func, gpointer user_data);
typedef gboolean (*ReadProgressFunc) (long, long, gchar *, gpointer);
gchar *gm_read_file(gchar const *fname);
GtkWidget *gm_create_tab_label(const gchar *icon, const gchar *caption,
gboolean has_exit, GmLabelInfo *info);
void gm_widget_destroy_data(GtkWidget *caller, GtkWidget *destroyer);
const gchar *gm_default_charset();
void gm_notebook_focus_from_label(GtkNotebook *note, gchar *caption);
void gm_string_skip_space(gchar **ptr);
void gm_string_skip_nonspace(gchar **ptr);
void gm_string_skip_till(gchar **ptr, gchar const *find);
gchar *gm_to_utf8_with_fallback(gchar const *text, gssize len, gchar const *from,
gchar const *fallback);
GtkWidget *gm_container_item(GtkContainer *cnt, GType type);
#endif /* __GM_SUPPORT_H__ */