Hello,
I have made several optimizations in loading script-fu extension making the loading process a bit faster. It's the first time I change something in an open source program and don't know best way to "announce" it and get it reviewed, so I send a patch in a mail.
The major speedup is caused by calling my function load_script_file instead of script_fu_run_command("(load ...."). Please review my changes and send an answer if the patch is OK.
diff -rup /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/scheme-wrapper.c gimp/plug-ins/script-fu/scheme-wrapper.c
--- /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/scheme-wrapper.c 2010-08-24 17:49:15.000000000 +0200
+++ gimp/plug-ins/script-fu/scheme-wrapper.c 2010-08-24 22:47:21.000000000 +0200
@@ -298,6 +298,14 @@ ts_interpret_stdin (void)
scheme_load_file (&sc, stdin);
}
+/* ==== modified by Lukasz Czerwinski (lc277642@xxxxxxxxxxxxxxxxxxxxx) */
+
+int load_script_file(const char *fname) {
+ return scheme_file_push(&sc,fname);
+}
+
+/* ==== end of modification ==== */
+
gint
ts_interpret_string (const gchar *expr)
{
diff -rup /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/scheme-wrapper.h gimp/plug-ins/script-fu/scheme-wrapper.h
--- /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/scheme-wrapper.h 2010-08-24 17:49:15.000000000 +0200
+++ gimp/plug-ins/script-fu/scheme-wrapper.h 2010-08-24 23:09:18.000000000 +0200
@@ -32,6 +32,10 @@ const gchar * ts_get_success_msg (v
void ts_interpret_stdin (void);
+/* ==== modified by Lukasz Czerwinski (lc277642@xxxxxxxxxxxxxxxxxxxxx) */
+int load_script_file(const char *fname);
+/* ==== end of modification ==== */
+
/* if the return value is 0, success. error otherwise. */
gint ts_interpret_string (const gchar *expr);
diff -rup /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/script-fu-scripts.c gimp/plug-ins/script-fu/script-fu-scripts.c
--- /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/script-fu-scripts.c 2010-08-24 17:49:15.000000000 +0200
+++ gimp/plug-ins/script-fu/script-fu-scripts.c 2010-08-25 16:58:31.000000000 +0200
@@ -589,6 +589,7 @@ script_fu_run_command (const gchar *com
return success;
}
+/* modified by Lukasz Czerwinski (lc277642@xxxxxxxxxxxxxxxxxxxxx) */
static void
script_fu_load_script (const GimpDatafileData *file_data,
gpointer user_data)
@@ -602,13 +603,15 @@ script_fu_load_script (const GimpDatafil
command = g_strdup_printf ("(load \"%s\")", escaped);
g_free (escaped);
- if (! script_fu_run_command (command, &error))
+// if (! script_fu_run_command (command, &error))
+ if (! load_script_file(file_data->filename))
{
gchar *display_name = g_filename_display_name (file_data->filename);
gchar *message = g_strdup_printf (_("Error while loading %s:"),
display_name);
+ g_message (message);
- g_message ("%s\n\n%s", message, error->message);
+// g_message ("%s\n\n%s", message, error->message);
g_clear_error (&error);
g_free (message);
@@ -625,6 +628,7 @@ script_fu_load_script (const GimpDatafil
g_free (command);
}
}
+/* end of modifications */
/*
* The following function is a GTraverseFunction.
diff -rup /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/tinyscheme/scheme.c gimp/plug-ins/script-fu/tinyscheme/scheme.c
--- /home/lukasz/OPOS/SOURCE/gimp-git-original/gimp/plug-ins/script-fu/tinyscheme/scheme.c 2010-08-24 17:49:15.000000000 +0200
+++ gimp/plug-ins/script-fu/tinyscheme/scheme.c 2010-08-25 17:08:44.000000000 +0200
@@ -125,6 +125,21 @@ static int utf8_stricmp(const char *s1,
return result;
}
+/* modified by Lukasz Czerwinski (lc277642@xxxxxxxxxxxxxxxxxxxxx) */
+#define stricmp_left_converted utf8_stricmp_left_converted
+static int utf8_stricmp_left_converted(const char *case_folded, const char *s2)
+{
+ char *t2a;
+ int result;
+
+ t2a = g_utf8_casefold(s2, -1);
+
+ result = strcmp(case_folded, t2a);
+ g_free(t2a);
+ return result;
+}
+/* end of modification */
+
#define min(a, b) ((a) <= (b) ? (a) : (b))
#if USE_STRLWR
@@ -898,15 +913,18 @@ static INLINE pointer oblist_find_by_nam
int location;
pointer x;
char *s;
+ gchar *name_case_folded = g_utf8_casefold(name, -1);
location = hash_fn(name, ivalue_unchecked(sc->oblist));
for (x = vector_elem(sc->oblist, location); x != sc->NIL; x = cdr(x)) {
s = symname(car(x));
/* case-insensitive, per R5RS section 2. */
- if(stricmp(name, s) == 0) {
+ if(stricmp_left_converted(name_case_folded, s) == 0) {
+ g_free(name_case_folded);
return car(x);
}
}
+ g_free(name_case_folded);
return sc->NIL;
}
@@ -1415,6 +1433,14 @@ static void finalize_cell(scheme *sc, po
/* ========== Routines for Reading ========== */
+/* modified by Lukasz Czerwinski (lc277642@xxxxxxxxxxxxxxxxxxxxx) */
+int scheme_file_push(scheme *sc, const char *fname) {
+ int ret = file_push(sc, fname);
+ file_pop(sc);
+ return ret;
+}
+/* end of modification */
+
static int file_push(scheme *sc, const char *fname) {
FILE *fin = NULL;
if (sc->file_i == MAXFIL-1)
diff -rup /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/tinyscheme/scheme.h gimp/plug-ins/script-fu/tinyscheme/scheme.h
--- /home/lukasz/OPOS/SOURCE/gimp-git-patched/gimp/plug-ins/script-fu/tinyscheme/scheme.h 2010-08-24 17:49:15.000000000 +0200
+++ gimp/plug-ins/script-fu/tinyscheme/scheme.h 2010-08-24 23:07:28.000000000 +0200
@@ -152,6 +152,11 @@ SCHEME_EXPORT pointer scheme_eval(scheme
void scheme_set_external_data(scheme *sc, void *p);
SCHEME_EXPORT void scheme_define(scheme *sc, pointer env, pointer symbol, pointer value);
+/* modified by Lukasz Czerwinski (lc277642@xxxxxxxxxxxxxxxxxxxxx) */
+SCHEME_EXPORT int scheme_file_push(scheme *sc, const char *fname);
+/* end of modification */
+
+
typedef pointer (*foreign_func)(scheme *, pointer);
pointer _cons(scheme *sc, pointer a, pointer b, int immutable);
Looking forward to your answer,
Łukasz Czerwiński
_______________________________________________ Gimp-developer mailing list Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer