コード例 #1
0
ファイル: misc.c プロジェクト: MicBosi/GTS
/**
 * gts_file_first_token_after:
 * @f: a #GtsFile.
 * @type: a #GtsTokenType.
 *
 * Finds and sets the first token of a type different from @type 
 * occuring after a token of type @type.
 */
void gts_file_first_token_after (GtsFile * f, GtsTokenType type)
{
  g_return_if_fail (f != NULL);

  while (f->type != GTS_ERROR && 
	 f->type != GTS_NONE &&
	 f->type != type)
    gts_file_next_token (f);
  while (f->type == type)
    gts_file_next_token (f);
}
コード例 #2
0
ファイル: refine.c プロジェクト: Exteris/Gerris
static void gfs_refine_read (GtsObject ** o, GtsFile * fp)
{
  GfsRefine * refine = GFS_REFINE (*o);
  GtsObjectClass * klass;
  gboolean class_changed = FALSE;

  if (fp->type != GTS_STRING) {
    gts_file_error (fp, "expecting a string (GfsRefineClass)");
    return;
  }
  klass = gfs_object_class_from_name (fp->token->str);
  if (klass == NULL) {
    gts_file_error (fp, "unknown class `%s'", fp->token->str);
    return;
  }
  if (!gts_object_class_is_from_class (klass, gfs_refine_class ())) {
    gts_file_error (fp, "`%s' is not a GfsRefine", fp->token->str);
    return;
  }
  if (klass != (*o)->klass) {
    *o = gts_object_new (klass);
    gts_object_destroy (GTS_OBJECT (refine));
    refine = GFS_REFINE (*o);
    class_changed = TRUE;
  }
  gts_file_next_token (fp);

  gfs_function_read (refine->maxlevel, gfs_object_simulation (refine), fp);
  if (fp->type == GTS_ERROR)
    return;

  if (class_changed && fp->type != '\n' && klass->read)
    (* klass->read) (o, fp);
}
コード例 #3
0
ファイル: misc.c プロジェクト: MicBosi/GTS
/**
 * gts_file_new:
 * @fp: a file pointer.
 *
 * Returns: a new #GtsFile.
 */
GtsFile * gts_file_new (FILE * fp)
{
  GtsFile * f;

  g_return_val_if_fail (fp != NULL, NULL);

  f = file_new ();
  f->fp = fp;
  gts_file_next_token (f);

  return f;
}
コード例 #4
0
ファイル: misc.c プロジェクト: MicBosi/GTS
/**
 * gts_file_new_from_buffer:
 * @buf: a buffer.
 * @len: the size of the buffer.
 *
 * Returns: a new #GtsFile.
 */
GtsFile * gts_file_new_from_buffer (gchar * buf, size_t len)
{
  GtsFile * f;

  g_return_val_if_fail (buf != NULL, NULL);

  f = file_new ();
  f->buf = buf;
  f->len = len;
  gts_file_next_token (f);

  return f;
}
コード例 #5
0
GtsFile *gts_file_new( FILE *fp )
{
  int ebx;
  GtsFile *f;
{
  /* phantom */ int _g_boolean_var_;
  if ( fp == 0 )
  {
    f = 0;
    g_return_if_fail_warning( 0, __PRETTY_FUNCTION__, "fp != NULL" );
    return f;
  }
  f = &fp[0]._flags;
  gts_file_next_token( file_new( ) );
  return *ebp_24;
}
}
コード例 #6
0
ファイル: misc.c プロジェクト: MicBosi/GTS
/**
 * gts_file_assign_start:
 * @f: a #GtsFile.
 * @vars: a %GTS_NONE terminated array of #GtsFileVariable.
 *
 * Opens a block delimited by braces to read a list of optional
 * arguments specified by @vars.  
 *
 * If an error is encountered the @error field of @f is set.
 */
void gts_file_assign_start (GtsFile * f, GtsFileVariable * vars)
{
  GtsFileVariable * var;

  g_return_if_fail (f != NULL);
  g_return_if_fail (vars != NULL);

  var = vars;
  while (var->type != GTS_NONE)
    (var++)->set = FALSE;

  if (f->type != '{') {
    gts_file_error (f, "expecting an opening brace");
    return;
  }

  f->scope_max++;
  gts_file_next_token (f);
}
コード例 #7
0
GtsFile *gts_file_new_from_string( gchar *s )
{
  int ebx;
  int esi;
  GtsFile *f;
{
  /* phantom */ int _g_boolean_var_;
  if ( s == 0 )
  {
    f = 0;
    g_return_if_fail_warning( 0, __PRETTY_FUNCTION__, "s != NULL" );
    return f;
  }
  f = file_new( );
  f->s = g_strdup( s );
  f->s1 = g_strdup( s );
  gts_file_next_token( f );
  return f;
}
}
コード例 #8
0
ファイル: misc.c プロジェクト: MicBosi/GTS
/**
 * gts_file_assign_next:
 * @f: a #GtsFile.
 * @vars: a %GTS_NONE terminated array of #GtsFileVariable.
 *
 * Assigns the next optional argument of @vars read from @f.
 *
 * Returns: the variable of @vars which has been assigned or %NULL if
 * no variable has been assigned (if an error has been encountered the
 * @error field of @f is set).  
 */
GtsFileVariable * gts_file_assign_next (GtsFile * f, GtsFileVariable * vars)
{
  GtsFileVariable * var;
  gboolean found = FALSE;

  g_return_val_if_fail (f != NULL, NULL);
  g_return_val_if_fail (vars != NULL, NULL);

  while (f->type == '\n')
    gts_file_next_token (f);
  if (f->type == '}') {
    f->scope_max--;
    gts_file_next_token (f);
    return NULL;
  }
  if (f->type == GTS_ERROR)
    return NULL;

  var = vars;
  while (f->type != GTS_ERROR && var->type != GTS_NONE && !found) {
    if (!strcmp (var->name, f->token->str)) {
      found = TRUE;
      if (var->unique && var->set)
	gts_file_error (f, "variable `%s' was already set at line %d:%d", 
			var->name, var->line, var->pos);
      else {
	var->line = f->line;
	var->pos = f->pos;
	gts_file_next_token (f);
	if (f->type != '=')
	  gts_file_error (f, "expecting `='");
	else {
	  var->set = TRUE;
	  switch (var->type) {
	  case GTS_FILE:
	    break;
	  case GTS_INT:
	    gts_file_next_token (f);
	    if (f->type != GTS_INT) {
	      gts_file_error (f, "expecting an integer");
	      var->set = FALSE;
	    }
	    else if (var->data)
	      *((gint *) var->data) = atoi (f->token->str); 
	    break;
	  case GTS_UINT:
	    gts_file_next_token (f);
	    if (f->type != GTS_INT) {
	      gts_file_error (f, "expecting an integer");
	      var->set = FALSE;
	    }
	    else if (var->data)
	      *((guint *) var->data) = atoi (f->token->str); 
	    break;
	  case GTS_FLOAT:
	    gts_file_next_token (f);
	    if (f->type != GTS_INT && f->type != GTS_FLOAT) {
	      gts_file_error (f, "expecting a number");
	      var->set = FALSE;
	    }
	    else if (var->data)
	      *((gfloat *) var->data) = atof (f->token->str); 
	    break;
	  case GTS_DOUBLE:
	    gts_file_next_token (f);
	    if (f->type != GTS_INT && f->type != GTS_FLOAT) {
	      gts_file_error (f, "expecting a number");
	      var->set = FALSE;
	    }
	    else if (var->data)
	      *((gdouble *) var->data) = atof (f->token->str); 
	    break;
	  case GTS_OBJ:
	    gts_file_next_token (f);
	    if (var->data) {
	      GtsObject ** object = var->data;
	      g_return_val_if_fail (GTS_IS_OBJECT (*object), NULL);
	      (* (*object)->klass->read) (object, f);
	    }
	    break;
	  case GTS_STRING:
	    gts_file_next_token (f);
	    if (f->type != GTS_INT && 
		f->type != GTS_FLOAT && 
		f->type != GTS_STRING) {
	      gts_file_error (f, "expecting a string");
	      var->set = FALSE;
	    }
	    else {
	      if (f->token->str[0] != '"') { /* simple string */
		if (var->data)
		  *((gchar **) var->data) = g_strdup (f->token->str); 
	      }
	      else { 
		/* quoted string */
		gint len = strlen (f->token->str);
		if (f->token->str[len - 1] == '"') { 
		  /* simple quoted string */
		  f->token->str[len - 1] = '\0';
		  if (var->data)
		    *((gchar **) var->data) = g_strdup (&(f->token->str[1]));
		  f->token->str[len - 1] = '"';
		}
		else { 
		  /* multiple parts */
		  GString * s = g_string_new (&(f->token->str[1]));
		  g_string_append_c (s, ' ');
		  int c = gts_file_getc (f);
		  while (c != '"' && c != EOF) {
		    g_string_append_c (s, c);
		    c = gts_file_getc (f);
		  }
		  if (var->data)
		    *((gchar **) var->data) = g_strdup (s->str);
		  g_string_free (s, TRUE);
		}
	      }
	    }
	    break;
	  default:
	    g_assert_not_reached ();
	  }
	}
      }
    }
    else
      var++;
  }
  if (!found)
    gts_file_error (f, "unknown identifier `%s'", f->token->str);
  else if (f->type != GTS_ERROR) {
    g_assert (var->set);
    if (f->type != '}')
      gts_file_next_token (f);
    return var;
  }
  return NULL;
}
コード例 #9
0
ファイル: porous.c プロジェクト: suhasjains/Gerris
static void gfs_porous_read (GtsObject ** o, GtsFile * fp)
{


	/* call read method of parent */
	(* GTS_OBJECT_CLASS (gfs_porous_class ())->parent_class->read) (o, fp);
	if (fp->type == GTS_ERROR)
		return;

	GfsPorous * por = GFS_POROUS (*o);
	GfsSimulation * sim = GFS_SIMULATION (por);
	/* do object-specific read here */

	if (fp->type != '{') {
		gts_file_error (fp, "expecting an opening brace");
		return;
	}

	fp->scope_max++;
	gts_file_next_token (fp);

	while (fp->type != GTS_ERROR && fp->type != '}') {
		if (fp->type == '\n') {
			gts_file_next_token (fp);
			continue;
		}

		if (fp->type != GTS_STRING) {
			gts_file_error (fp, "expecting a keyword");
			return;
		}

		if (!strcmp (fp->token->str, "porosity")) {
			gts_file_next_token (fp);
			if (fp->type != '=')
				gts_file_error (fp, "expecting `='");
			else{
				gts_file_next_token (fp);
				gfs_function_read (por->porosity, sim, fp);
			}
		}


		if (!strcmp (fp->token->str, "K")) {
			gts_file_next_token (fp);
			if (fp->type != '=')
				gts_file_error (fp, "expecting `='");
			else{
				gts_file_next_token (fp);
				gfs_function_read (por-> K, sim , fp);
			}
		}
	}
	if (fp->type == GTS_ERROR)
		return;
	if (fp->type != '}') {
		gts_file_error (fp, "expecting a closing brace");
		return;

		fp->scope_max--;
		gts_file_next_token (fp);
		/* do not forget to prepare for next read */
	}
}
コード例 #10
0
ファイル: fft.c プロジェクト: Exteris/Gerris
static void output_spectra_read (GtsObject ** o, GtsFile * fp)
{
  (* GTS_OBJECT_CLASS (gfs_output_spectra_class ())->parent_class->read) (o, fp); 
  if (fp->type == GTS_ERROR)
    return;
  GfsOutputSpectra * v = GFS_OUTPUT_SPECTRA (*o);

  if (fp->type != GTS_STRING) {
    gts_file_error (fp, "expecting a string (v)");
    return;
  }
  GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
  if (!(v->v = gfs_variable_from_name (domain->variables, fp->token->str))) {
    gts_file_error (fp, "unknown variable `%s'", fp->token->str);
    return;
  }
  gts_file_next_token (fp);

  GtsFileVariable var[] = {
    {GTS_DOUBLE, "x",  TRUE, &v->pos.x},
    {GTS_DOUBLE, "y",  TRUE, &v->pos.y},
    {GTS_DOUBLE, "z",  TRUE, &v->pos.z},
    {GTS_DOUBLE, "Lx", TRUE, &v->L.x},
    {GTS_DOUBLE, "Ly", TRUE, &v->L.y},
    {GTS_DOUBLE, "Lz", TRUE, &v->L.z},
    {GTS_NONE}
  };
  gts_file_assign_variables (fp, var);
  if (fp->type == GTS_ERROR)
    return;

  if (fp->type == GTS_INT) {
    v->level = atoi (fp->token->str);
    gts_file_next_token (fp);
  }
  else
    v->level = gfs_domain_depth (domain);

  guint i, j, k, size = 1;

  v->cgd = gfs_cartesian_grid_new (gfs_cartesian_grid_class ()); 

  /* number of dims of the fft */
  v->cgd->N = 3;
  v->Ndim = 0;
  k = 0;
  for (i = 0; i < 3; i++) {
    if ((&(v->L.x))[i] != 0) {
      v->Ndim++;
      v->dir[k] = i;
      k++;
    }
  }

  if (v->Ndim == 0) {
    gts_file_error (fp, "There must be at least one L component larger than 0");
    return;
  }

  /* number of points in each direction */
  v->cgd->n = g_malloc (3*sizeof (guint));  
  for (i = 0; i < 3; i++) {
    if ((&(v->L.x))[i] == 0 )
      v->cgd->n[i] = 1;
    else
      v->cgd->n[i] = pow(2,v->level);
    size *= v->cgd->n[i];
  }

  /* mesh coordinates */
  v->cgd->x = g_malloc0 (3*sizeof (gdouble *));
  for (i = 0; i < 3; i++) {
    v->cgd->x[i] = g_malloc (v->cgd->n[i]*sizeof (gdouble));
    if (v->cgd->n[i] != 1)
      for (j = 0; j < v->cgd->n[i]; j++)
        v->cgd->x[i][j] = 
	  (&(v->pos.x))[i] + (&(v->L.x))[i]*(gdouble)j/((gdouble)(v->cgd->n[i]-1)) - 0.5;
    else
      v->cgd->x[i][0] = (&(v->pos.x))[i];
  }

  /* memory data allocation */
  v->cgd->v = g_malloc0( sizeof ( gdouble ) * 2*(size/2+1)  );
}