[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203

Stephane Popinet popinet at users.sf.net
Fri May 15 02:55:21 UTC 2009


The following commit has been merged in the upstream branch:
commit 9adecef12302246cecd0fa960bc1ef7e95e4a0d6
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Tue May 13 12:58:24 2008 +1000

    Improved path system for Terrain module
    
    darcs-hash:20080513025824-d4795-b18ac787168367552588fbf76b1186c6554c916c.gz

diff --git a/modules/terrain.mod b/modules/terrain.mod
index e9f5a0d..16544e6 100644
--- a/modules/terrain.mod
+++ b/modules/terrain.mod
@@ -25,7 +25,7 @@
 #include "solid.h"
 #include "rsurface.h"
 
-static gchar * default_dir = "/home/popinet/Projects/GIS/rsurfaces";
+static gchar * default_path = ".";
 
 /* GfsRefineTerrain: Header */
 
@@ -793,32 +793,32 @@ static void refine_terrain_read (GtsObject ** o, GtsFile * fp)
   t->name = g_strdup (fp->token->str);
   gts_file_next_token (fp);
 
-  gchar * dir = NULL;
+  gchar * path = NULL;
   if (fp->type == '{') {
     GtsFileVariable var[] = {
       {GTS_STRING, "basename", TRUE},
-      {GTS_STRING, "dir",      TRUE},
+      {GTS_STRING, "path",      TRUE},
       {GTS_NONE}
     };
     gchar * basename = NULL;
     var[0].data = &basename;
-    var[1].data = &dir;
+    var[1].data = &path;
     gts_file_assign_variables (fp, var);
     if (fp->type == GTS_ERROR)
       return;
     if (var[0].set) { g_free (t->basename); t->basename = basename; }
-    if (!var[1].set) dir = g_strdup (default_dir);
+    if (!var[1].set) path = g_strdup (default_path);
   }
   else
-    dir = g_strdup (default_dir);
+    path = g_strdup (default_path);
 
   if (!strcmp (t->basename, "*")) { /* file globbing */
-    gchar * pattern = g_strconcat (dir, "/*.Data", NULL);
+    gchar * pattern = g_strconcat (path, "/*.Data", NULL);
     glob_t pglob;
     if (glob (pattern, GLOB_ERR, NULL, &pglob)) {
-      gts_file_error (fp, "cannot find/open RSurface files in path:\n%s", pattern);
+      gts_file_error (fp, "cannot find/open terrain databases in path:\n%s", pattern);
       g_free (pattern);
-      g_free (dir);
+      g_free (path);
       return;
     }
     g_free (pattern);
@@ -830,15 +830,15 @@ static void refine_terrain_read (GtsObject ** o, GtsFile * fp)
       t->rs = g_realloc (t->rs, (t->nrs + 1)*sizeof (RSurface *));
       t->rs[t->nrs] = r_surface_open (pglob.gl_pathv[i], "r", -1);
       if (!t->rs[t->nrs]) {
-	gts_file_error (fp, "cannot open RSurface `%s'", pglob.gl_pathv[i]);
+	gts_file_error (fp, "cannot open terrain database `%s'", pglob.gl_pathv[i]);
 	globfree (&pglob);
-	g_free (dir);
+	g_free (path);
 	return;
       }
       if (t->basename) {
-	gchar * dirbasename = g_strconcat (t->basename, ",", pglob.gl_pathv[i], NULL);
+	gchar * pathbasename = g_strconcat (t->basename, ",", pglob.gl_pathv[i], NULL);
 	g_free (t->basename);
-	t->basename = dirbasename;
+	t->basename = pathbasename;
       }
       else
 	t->basename = g_strdup (pglob.gl_pathv[i]);
@@ -847,40 +847,51 @@ static void refine_terrain_read (GtsObject ** o, GtsFile * fp)
     globfree (&pglob);
   }
   else { /* basename is of the form: set1,set2,set3... */
-    gchar * basename = g_strdup (t->basename);
-    if (dir) {
+    gchar ** names = g_strsplit (t->basename, ",", 0);
+    if (path) {
       g_free (t->basename);
       t->basename = NULL;
     }
-    gchar * s = strtok (basename, ",");
-    while (s) {
+    gchar ** s = names;
+    while (*s) {
       t->rs = g_realloc (t->rs, (t->nrs + 1)*sizeof (RSurface *));
-      if (dir) {
-	gchar * fname = s[0] == '/' ? g_strdup (s) : g_strconcat (dir, "/", s, NULL);
-	t->rs[t->nrs] = r_surface_open (fname, "r", -1);
+      if (path) {
+	/* search path */
+	gchar ** pathes = g_strsplit (path, ":", 0);
+	gchar ** spath = pathes, * fname;
+	g_assert (*spath);
+	do {
+	  fname = (*s)[0] == '/' ? g_strdup (*s) : g_strconcat (*spath, "/", *s, NULL);
+	  t->rs[t->nrs] = r_surface_open (fname, "r", -1);
+	} while (t->rs[t->nrs] == NULL && *(++spath));
+	g_strfreev (pathes);
+
 	if (t->basename) {
-	  gchar * dirbasename = g_strconcat (t->basename, ",", fname, NULL);
+	  gchar * pathbasename = g_strconcat (t->basename, ",", fname, NULL);
 	  g_free (t->basename);
-	  t->basename = dirbasename;
+	  t->basename = pathbasename;
 	  g_free (fname);
 	}
 	else
 	  t->basename = fname;
       }
       else
-	t->rs[t->nrs] = r_surface_open (s, "r", -1);
+	t->rs[t->nrs] = r_surface_open (*s, "r", -1);
       if (!t->rs[t->nrs]) {
-	gts_file_error (fp, "cannot open RSurface `%s'", s);
-	g_free (basename);
-	g_free (dir);
+	if (path)
+	  gts_file_error (fp, "cannot find/open terrain database `%s' in path:\n%s", *s, path);
+	else
+	  gts_file_error (fp, "cannot open terrain database `%s'", *s);
+	g_strfreev (names);
+	g_free (path);
 	return;
       }
       t->nrs++;
-      s = strtok (NULL, ",");
+      s++;
     }
-    g_free (basename);
+    g_strfreev (names);
   }
-  g_free (dir);
+  g_free (path);
 
   GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
   guint i;
@@ -1151,9 +1162,9 @@ const gchar * g_module_check_init (void);
 
 const gchar * g_module_check_init (void)
 {
-  gchar * dir = getenv ("GFS_RSURFACES_PATH");
-  if (dir)
-    default_dir = dir;
+  gchar * path = getenv ("GFS_TERRAIN_PATH");
+  if (path)
+    default_path = path;
   gfs_refine_terrain_class ();
   gfs_terrain_class ();
   return NULL;

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list