[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:54:01 UTC 2009
The following commit has been merged in the upstream branch:
commit 926dbead74cd3781df3660102a06df511a6920f1
Author: Stephane Popinet <popinet at users.sf.net>
Date: Fri Mar 2 12:25:30 2007 +1100
Unified script/code treatment for GfsGlobal, GfsEventScript and GfsOutput
This fixes a bug in GfsOutput and GfsEventScript where "#!" were
treated as comments.
darcs-hash:20070302012530-d4795-38d87cdc98465970b1f25d6b90547e249b1629b6.gz
diff --git a/src/event.c b/src/event.c
index 2fda25c..82781ac 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1512,7 +1512,7 @@ static void gfs_event_script_destroy (GtsObject * o)
{
GfsEventScript * s = GFS_EVENT_SCRIPT (o);
- if (s->script) g_string_free (s->script, TRUE);
+ g_free (s->script);
(* GTS_OBJECT_CLASS (gfs_event_script_class ())->parent_class->destroy) (o);
}
@@ -1527,15 +1527,13 @@ static void gfs_event_script_write (GtsObject * o, FILE * fp)
fputs (" {", fp);
if (s->script)
- fputs (s->script->str, fp);
+ fputs (s->script, fp);
fputc ('}', fp);
}
static void gfs_event_script_read (GtsObject ** o, GtsFile * fp)
{
GfsEventScript * s = GFS_EVENT_SCRIPT (*o);
- guint scope;
- gint c;
if (GTS_OBJECT_CLASS (gfs_event_script_class ())->parent_class->read)
(* GTS_OBJECT_CLASS (gfs_event_script_class ())->parent_class->read)
@@ -1543,24 +1541,9 @@ static void gfs_event_script_read (GtsObject ** o, GtsFile * fp)
if (fp->type == GTS_ERROR)
return;
- if (fp->type != '{') {
- gts_file_error (fp, "expecting an opening brace");
- return;
- }
- if (s->script)
- g_string_free (s->script, TRUE);
- s->script = g_string_new ("");
- scope = fp->scope_max;
- c = gts_file_getc (fp);
- while (c != EOF && fp->scope > scope) {
- g_string_append_c (s->script, c);
- c = gts_file_getc (fp);
- }
- if (fp->scope != scope) {
- gts_file_error (fp, "parse error");
- return;
- }
- gts_file_next_token (fp);
+ g_free (s->script);
+ if ((s->script = gfs_file_statement (fp)))
+ gts_file_next_token (fp);
}
static gboolean gfs_event_script_event (GfsEvent * event, GfsSimulation * sim)
@@ -1580,7 +1563,7 @@ static gboolean gfs_event_script_event (GfsEvent * event, GfsSimulation * sim)
return TRUE;
}
f = fdopen (sf, "w");
- fputs (s->script->str, f);
+ fputs (s->script, f);
fclose (f);
close (sf);
scommand = g_strdup_printf ("GfsTime=%g GfsIter=%d GfsPid=%d "
diff --git a/src/event.h b/src/event.h
index af1fefc..146677a 100644
--- a/src/event.h
+++ b/src/event.h
@@ -231,7 +231,7 @@ typedef struct _GfsEventScript GfsEventScript;
struct _GfsEventScript {
GfsEvent parent;
- GString * script;
+ gchar * script;
};
#define GFS_EVENT_SCRIPT(obj) GTS_OBJECT_CAST (obj,\
diff --git a/src/output.c b/src/output.c
index 14a018f..630b782 100644
--- a/src/output.c
+++ b/src/output.c
@@ -206,25 +206,11 @@ static void gfs_output_read (GtsObject ** o, GtsFile * fp)
output->first_call = TRUE;
if (fp->type == '{') {
- GString * format;
- guint scope;
- gint c;
-
- format = g_string_new ("{");
- scope = fp->scope_max;
- c = gts_file_getc (fp);
- while (c != EOF && fp->scope > scope) {
- g_string_append_c (format, c);
- c = gts_file_getc (fp);
- }
- if (fp->scope != scope) {
- gts_file_error (fp, "parse error");
- g_string_free (format, TRUE);
+ gchar * script = gfs_file_statement (fp);
+ if (script == NULL)
return;
- }
- g_string_append_c (format, '}');
- output->format = format->str;
- g_string_free (format, FALSE);
+ output->format = g_strconcat ("{", script, "}", NULL);
+ g_free (script);
gts_file_next_token (fp);
}
else if (fp->type != GTS_STRING) {
diff --git a/src/utils.c b/src/utils.c
index b86a51a..8568ef4 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -44,6 +44,45 @@ gboolean gfs_char_in_string (char c, const char * s)
return FALSE;
}
+/**
+ * gfs_file_statement:
+ * @fp: a #GtsFile.
+ *
+ * Reads the next brackets-delimited ({...}) statemement in @fp,
+ * including all comments.
+ *
+ * Returns: a newly allocated string containing the text of the next
+ * statement in @fp, or %NULL if an error occured in which case
+ * @fp->error is set.
+ */
+gchar * gfs_file_statement (GtsFile * fp)
+{
+ g_return_val_if_fail (fp != NULL, NULL);
+
+ if (fp->type != '{') {
+ gts_file_error (fp, "expecting an opening brace");
+ return NULL;
+ }
+ GString * s = g_string_new ("");
+ gchar empty[] = "", * comments = fp->comments;
+ fp->comments = empty;
+ guint scope = fp->scope_max;
+ gint c = gts_file_getc (fp);
+ while (c != EOF && fp->scope > scope) {
+ g_string_append_c (s, c);
+ c = gts_file_getc (fp);
+ }
+ fp->comments = comments;
+ if (fp->scope != scope) {
+ gts_file_error (fp, "parse error");
+ g_string_free (s, TRUE);
+ return NULL;
+ }
+ gchar * ret = s->str;
+ g_string_free (s, FALSE);
+ return ret;
+}
+
typedef gdouble (* GfsFunctionFunc) (const FttCell * cell,
const FttCellFace * face,
GfsSimulation * sim);
@@ -71,20 +110,20 @@ struct _GfsGlobal {
GtsObject parent;
/*< public >*/
- GString * s;
+ gchar * s;
guint line;
};
static void global_destroy (GtsObject * object)
{
- g_string_free (GFS_GLOBAL (object)->s, TRUE);
+ g_free (GFS_GLOBAL (object)->s);
(* gfs_global_class ()->parent_class->destroy) (object);
}
static void global_write (GtsObject * object, FILE * fp)
{
fprintf (fp, "%s {", object->klass->info.name);
- fputs (GFS_GLOBAL (object)->s->str, fp);
+ fputs (GFS_GLOBAL (object)->s, fp);
fputs ("}\n", fp);
}
@@ -107,26 +146,10 @@ static void global_read (GtsObject ** object, GtsFile * fp)
return;
}
gts_file_next_token (fp);
- if (fp->type != '{') {
- gts_file_error (fp, "expecting an opening brace");
- return;
- }
global->line = fp->line;
- gchar * comments = fp->comments;
- fp->comments = g_strdup ("");
- guint scope = fp->scope_max;
- gint c = gts_file_getc (fp);
- while (c != EOF && fp->scope > scope) {
- g_string_append_c (global->s, c);
- c = gts_file_getc (fp);
- }
- g_free (fp->comments);
- fp->comments = comments;
- if (fp->scope != scope) {
- gts_file_error (fp, "parse error");
- return;
- }
- gts_file_next_token (fp);
+ g_free (global->s);
+ if ((global->s = gfs_file_statement (fp)))
+ gts_file_next_token (fp);
}
static void gfs_global_class_init (GtsObjectClass * klass)
@@ -136,11 +159,6 @@ static void gfs_global_class_init (GtsObjectClass * klass)
klass->write = global_write;
}
-static void gfs_global_init (GfsGlobal * object)
-{
- object->s = g_string_new ("");
-}
-
GtsObjectClass * gfs_global_class (void)
{
static GtsObjectClass * klass = NULL;
@@ -151,7 +169,7 @@ GtsObjectClass * gfs_global_class (void)
sizeof (GfsGlobal),
sizeof (GtsObjectClass),
(GtsObjectClassInitFunc) gfs_global_class_init,
- (GtsObjectInitFunc) gfs_global_init,
+ (GtsObjectInitFunc) NULL,
(GtsArgSetFunc) NULL,
(GtsArgGetFunc) NULL
};
@@ -500,7 +518,7 @@ static void function_read (GtsObject ** o, GtsFile * fp)
i = sim->globals;
while (i) {
fprintf (fin, "#line %d \"GfsGlobal\"\n", GFS_GLOBAL (i->data)->line);
- fputs (GFS_GLOBAL (i->data)->s->str, fin);
+ fputs (GFS_GLOBAL (i->data)->s, fin);
fputc ('\n', fin);
i = i->next;
}
diff --git a/src/utils.h b/src/utils.h
index 224c236..80d3c34 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -30,6 +30,7 @@ extern "C" {
#define GFS_DOUBLE_TO_POINTER(d) (*((gpointer *) &(d)))
gboolean gfs_char_in_string (char c, const char * s);
+gchar * gfs_file_statement (GtsFile * fp);
/* GfsGlobal: Header */
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list