[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