예제 #1
0
int
ReadFieldList(FieldList *list,
	      int arch,
	      FILE *file)
{
    switch (arch)
    {
    case EDR1:
	return ReadEdrFieldList(list, file, EDR1);
	break;
    case EDR2:
	return ReadEdrFieldList(list, file, EDR2);
	break;
    case NATIVE:
	return ReadNativeFieldList(list, file);
	break;
    case ASCII:
	return ReadAsciiFieldList(list, file);
	break;
    default:
	return FALSE;
	break;
    }
}
예제 #2
0
static FieldSpec *
ReadNativeFieldSpec(FILE *file)
{
   char *name;          /* field name */
   short        type;           /* data type code */
   short        rank;           /* number of dimensions */
   int          i;              /* loop index */
   FieldSpec    *field;         /* field spec being read */
   long num_ax_names;   /* number of axis names */

   /* Read name, type, rank. */

   if (!ReadNativeString(&name, file))
      return NULL;              /* Failure getting field name. */

   if (fread(&type, sizeof(short), 1, file) != 1)
      return NULL;              /* Couldn't get type. */

   if (fread(&rank, sizeof(short), 1, file) != 1)
      return NULL;              /* Couldn't get rank. */

   /* Allocate structure. */

   field = NewFieldSpec(type, rank);
   if (field == NULL)
      return NULL;              /* Couldn't create field spec. */

   field->name = name;

   /* Read dimensions. */

   if (rank != 0 && field->dim == NULL)
      return NULL;              /* Inconsistent rank and dimensions. */

   if (fread(field->dim, sizeof(long), rank, file) != rank)
      return NULL;              /* Couldn't get dimensions. */

   /* Read units, scale, offset, axis_names. */

   if (!ReadNativeString(&field->units, file))
      return NULL;

   if (fread(&field->scale, sizeof(double), 1, file) != 1)
      return NULL;              /* Couldn't get scale. */

   if (fread(&field->offset, sizeof(double), 1, file) != 1)
      return NULL;              /* Couldn't get offset. */

   if (fread(&num_ax_names, sizeof(long), 1, file) != 1)
      return NULL;              /* Couldn't get number of axis names. */

   if (num_ax_names > rank)
      return NULL;              /* Bad value for num_ax_names. */

   if (num_ax_names != 0)
      {
         field->axis_names = (char **) malloc(rank * sizeof(char *));
         if (field->axis_names == NULL)
            return NULL;        /* Allocation failure. */

         for (i = 0; i < num_ax_names; i++)
            ReadNativeString(&field->axis_names[i], file);

         for ( ; i < rank; i++)
            field->axis_names[i] = NULL;
      }

   /* Read occurrence class. */

   if (fread(&field->occurrence, sizeof(short), 1, file) != 1)
      return NULL;              /* Couldn't get occurrence code. */

   /* Read data if required. */

   if (type != NO_TYPE
       && field->occurrence != REQUIRED && field->occurrence != OPTIONAL)
      {
         if (!ReadNativeData(field, file))
            return NULL;        /* Failure reading data. */
      }

   /* Read subfield list. */

   if (!ReadNativeFieldList(&field->subfields, file))
      {
         FreeFieldSpec(field);
         return NULL;           /* Failure getting subfields. */
      }

   return field;                /* Success. */
}
예제 #3
0
FieldList
ReadHeader(char     **version,	/* version (output) */
	   int      *arch,	/* architecture (output) */
	   long     *pre_size,	/* preamble size  (output) */
	   long     *hdr_size,	/* header size (output) */
	   long     *rec_size,	/* record size (output) */
	   FILE     *file)	/* input file */
{
    FieldList	list;
    char	*architecture;

    if (!ReadPreamble(version,
		      &architecture, pre_size, hdr_size, rec_size, file))
	return NULL;	/* Bad preamble. */
    if (strcmp(architecture, EsignalArch) == 0)    /* native architecture */
    {
	if (arch != NULL)
	    *arch = NATIVE;

	if (!ReadNativeFieldList(&list, file))
	    return NULL;
    }
    else if (strcmp(architecture, "EDR1") == 0)
    {
	if (arch != NULL)
	    *arch = EDR1;

	/*
	 * On machines whose native architecture is EDR1, could call
	 * ReadNativeFieldList here.
	 */
	if (!ReadEdrFieldList(&list, file, EDR1))
	    return NULL;
    }
    else if (strcmp(architecture, "EDR2") == 0)
    {
	if (arch != NULL)
	    *arch = EDR2;
	/*
	 * On machines whose native architecture is EDR2, could call
	 * ReadNativeFieldList here.
	 */
	if (!ReadEdrFieldList(&list, file, EDR2))
	    return NULL;
    }
    else if (strcmp(architecture, "ASCII") == 0)
    {
	if (arch != NULL)
	    *arch = ASCII;

	if (!ReadAsciiFieldList(&list, file))
	    return NULL;
    }
    else
    {
	if (arch != NULL)
	    *arch = UNKNOWN;

	return NULL;		/* Unsupported architecture. */
    }

    return list;
}