Esempio n. 1
0
/*-------------------------------------------------------------------------
 * Function:	lite_PD_copy_syment
 *
 * Purpose:	Make and return a copy of the given syment.
 *
 * Return:	Success:	a new syment
 *
 *		Failure:
 *
 * Programmer:	Adapted from PACT PDB
 *		Mar  6, 1996 11:39 AM EST
 *
 * Modifications:
 *    Eric Brugger, Tue Dec  8 15:16:07 PST 1998
 *    Remove unnecessary calls to lite_SC_mark, since reference count now
 *    set when allocated.
 *
 *-------------------------------------------------------------------------
 */
syment *
lite_PD_copy_syment (syment *osym) {

    int i, n;
    char *ntype;
    syment *nsym;
    symblock *nsp, *osp;
    dimdes *ndims;

    if (osym == NULL) return(NULL);

    nsym = FMAKE(syment, "PD_COPY_SYMENT:nsym");

    n   = PD_n_blocks(osym);
    osp = PD_entry_blocks(osym);
    nsp = FMAKE_N(symblock, n, "PD_COPY_SYMENT:blocks");
    for (i = 0; i < n; i++) nsp[i] = osp[i];

    ntype = lite_SC_strsavef(PD_entry_type(osym),
                             "char*:PD_COPY_SYMENT:type");
    ndims = lite_PD_copy_dims(PD_entry_dimensions(osym));

    PD_entry_blocks(nsym)     = nsp;
    PD_entry_type(nsym)       = ntype;
    PD_entry_dimensions(nsym) = ndims;
    PD_entry_number(nsym)     = PD_entry_number(osym);
    PD_entry_indirects(nsym)  = PD_entry_indirects(osym);

    return(nsym);
}
Esempio n. 2
0
/*-------------------------------------------------------------------------
 * Function:	lite_PD_read_as_alt
 *
 * Purpose:	Read part of an entry from the PDB file pointed to by the
 *		symbol table into the location pointed to by VR.  IND contains
 *		one triplet of long ints per variable dimension specifying
 *		start, stop, and step for the index.
 *
 * Note:	The entry must be an array (either a static array or
 *		a pointer)
 *
 * Note:	VR must be a pointer to an object with the type of
 *		the object associated with NAME (PDBLib will allocate space
 *		if necessary)!
 *
 * Return:	Success:	Number of items successfully read.
 *
 *		Failure:	0
 *
 * Programmer:	Adapted from PACT PDB
 *		Mar  4, 1996 11:49 AM EST
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
int
lite_PD_read_as_alt (PDBfile *file, char *name, char *type, lite_SC_byte *vr,
		     long *ind) {

   char		fullpath[MAXLINE];
   dimdes	*pd, *dims;
   syment	*ep;
   int		nd;

   switch (setjmp(_lite_PD_read_err)) {
   case ABORT:
      return(FALSE);
   case ERR_FREE:
      return(TRUE);
   default:
      memset(lite_PD_err, 0, MAXLINE);
      break;
   }

   /*
    * Look up the variable name and return FALSE if it is not there.
    */
   ep = _lite_PD_effective_ep(file, name, TRUE, fullpath);
   if (ep == NULL)
      lite_PD_error("ENTRY NOT IN SYMBOL TABLE - PD_READ_AS_ALT", PD_READ);

   dims = PD_entry_dimensions(ep);
   for (nd = 0, pd = dims; pd != NULL; pd = pd->next, nd++) /*void*/ ;

   return _lite_PD_indexed_read_as (file, fullpath, type, vr, nd, ind, ep);
}
Esempio n. 3
0
/*-------------------------------------------------------------------------
 * Function:	_lite_PD_rl_syment_d
 *
 * Purpose:	Reclaim the space of the given syment including its
 *		dimensions.
 *
 * Return:	void
 *
 * Programmer:	Adapted from PACT PDB
 *		Mar  5, 1996 12:06 PM EST
 *
 * Modifications:
 *
 *-------------------------------------------------------------------------
 */
void
_lite_PD_rl_syment_d (syment *ep) {

    if (ep == NULL) return;

    _lite_PD_rl_dimensions(PD_entry_dimensions(ep));
    _lite_PD_rl_syment(ep);
}
Esempio n. 4
0
/*-------------------------------------------------------------------------
 * Function:	_lite_PD_mk_syment
 *
 * Purpose:	Make and return a pointer to an entry for the symbol table.
 *
 * Return:	Success:
 *
 *		Failure:
 *
 * Programmer:	Adapted from PACT PDB
 *		Mar  5, 1996  2:16 PM EST
 *
 * Modifications:
 *    Eric Brugger, Tue Dec  8 15:16:07 PST 1998
 *    Remove unnecessary calls to lite_SC_mark, since reference count now
 *    set when allocated.
 *
 *-------------------------------------------------------------------------
 */
syment *
_lite_PD_mk_syment (char *type, long numb, long addr,
                    symindir *indr, dimdes *dims) {

    syment *ep;
    symblock *sp;
    char *t;

    ep = FMAKE(syment, "_PD_MK_SYMENT:ep");
    sp = FMAKE(symblock, "_PD_MK_SYMENT:sp");

    PD_entry_blocks(ep) = sp;

    sp->number   = numb;
    sp->diskaddr = addr;

    if (type == NULL) {
        t = NULL;
    } else {
        t = lite_SC_strsavef(type, "char*:_PD_MK_SYMENT:type");
    }

    PD_entry_type(ep)       = t;
    PD_entry_number(ep)     = numb;
    PD_entry_dimensions(ep) = dims;

    if (indr == NULL) {
        symindir iloc;
        iloc.addr       = 0L;
        iloc.n_ind_type = 0L;
        iloc.arr_offs = 0L;
        PD_entry_indirects(ep) = iloc;
    } else {
        PD_entry_indirects(ep)  = *indr;
    }

    return(ep);
}
Esempio n. 5
0
bool
PDBFileObject::SymbolExists(const char *name, TypeEnum *t,
    std::string &typeString, int *nTotalElements, int **dimensions,
    int *nDims)
{
    bool retval = false;
    syment *ep = 0;

    // Indicate that there is no type initially.
    if (t)
        *t = NO_TYPE;
    if (nTotalElements)
        *nTotalElements = 0;
    if (dimensions)
        *dimensions = 0;
    if (nDims)
        *nDims = 0;

    if(AutoOpen())
    {
        if((ep = PD_inquire_entry(pdb, (char *)name, 0, NULL)) != NULL)
        {
            dimdes *dimptr = NULL;
            int i = 0, nd = 0, length = 1;
            int *dims = 0;

            // Return the actual name of type
            typeString = PD_entry_type(ep);

            // Figure out the number of dimensions and the number of elements
            // that are in the entire array.
            dimptr = PD_entry_dimensions(ep);
            if(dimptr != NULL)
            {
                // Figure out the number of dimensions.
                while(dimptr != NULL)
                {
                    length *= dimptr->number;
                    dimptr = dimptr->next;
                    ++nd;
                }

                // Store the dimensions of the array.
                dims = new int[nd];
                dimptr = PD_entry_dimensions(ep);
                while(dimptr != NULL)
                {
                    dims[i++] = dimptr->number;
                    dimptr = dimptr->next;
                }
            }
            else
            {
                dims = new int[1];
                dims[0] = 1;
            }

            // Print the dimensions to the debug log.
            debug4 << "PDBFileObject::SymbolExists: name=" << name << ", dimensions={";
            for(i = 0; i < nd; ++i)
                debug4 << dims[i] << ", ";
            debug4 << "}" << endl;

            // Set some of the return values.
            if (dimensions)
                *dimensions = dims;
            if (nDims)
                *nDims = nd;
            if (nTotalElements)
                *nTotalElements = length;

            //
            // Take the storage type along with the length to determine the real
            // type that we want to report.
            //
            if (t)
            {
                if(strcmp(PD_entry_type(ep), "char") == 0 ||
                   strcmp(PD_entry_type(ep), "string") == 0)
                    *t = (length > 1) ? CHARARRAY_TYPE : CHAR_TYPE;
                else if(strcmp(PD_entry_type(ep), "short") == 0)
                    *t = (length > 1) ? SHORTARRAY_TYPE : SHORT_TYPE;
                else if(strcmp(PD_entry_type(ep), "int") == 0 ||
                        strcmp(PD_entry_type(ep), "integer") == 0)
                    *t = (length > 1) ? INTEGERARRAY_TYPE : INTEGER_TYPE;
                else if(strcmp(PD_entry_type(ep), "float") == 0)
                    *t = (length > 1) ? FLOATARRAY_TYPE : FLOAT_TYPE;
                else if(strcmp(PD_entry_type(ep), "double") == 0)
                    *t = (length > 1) ? DOUBLEARRAY_TYPE : DOUBLE_TYPE;
                else if(strcmp(PD_entry_type(ep), "long") == 0)
                    *t = (length > 1) ? LONGARRAY_TYPE : LONG_TYPE;
                else
                {
                    *t = OBJECT_TYPE;
                }
            }

            retval = true;
        }
    }

    return retval;
}
Esempio n. 6
0
int main(int argc, char** argv)
{
  if(argc < 4) {
    fprintf(stderr, "Useage: %s <input file> <output file> <t stride>\n", argv[0]);
    return 1;
  }

  int tstride;
  if(sscanf(argv[3], "%d", &tstride) != 1) {
    fprintf(stderr, "\tERROR: t stride must be an integer\n");
    return 1;
  }

  // Open input file
  PDBfile *in;
  if((in = PD_open(argv[1], "r")) == NULL) {
    fprintf(stderr, "\tERROR: Could not open input file '%s'\n", argv[1]);
    return 1;
  }

  // Open output file
  PDBfile *out;
  if((out = PD_open(argv[2], "w")) == NULL) {
    fprintf(stderr, "\tERROR: Could not open output file '%s'\n", argv[2]);
    return 1;
  }

  // Get list of variables
    
  int nvars;
  char **var_names = PD_ls(in, NULL, NULL, &nvars);
  if((var_names == (char**) NULL) || (nvars < 1)) {
    fprintf(stderr, "\tERROR: No variables\n");
    return 1;
  }
  
  // Go through the variables
  char *varname;
  for(int var=0;var<nvars;var++) {
    varname = var_names[var];

    syment *ep;  // PDB query types
    dimdes* dims;

    // Query size of the variable    
    if((ep = PD_query_entry(in, varname, NULL)) == (syment*) NULL) {
      fprintf(stderr, "\tError querying variable %s\n", varname);
      return 1;
    }
    dims = PD_entry_dimensions(ep);
    int nd = 0; // Count number of dimensions
    int varsize = 1; // Number of elements
    long inds[12];
    while(dims != (dimdes*) NULL) {
      long min, max;
      min = dims->index_min;
      max = dims->index_max;
      
      if(nd > 3) {
	fprintf(stderr, "\tERROR: Can't handle variable '%s': more than 4D\n", varname);
	return 2;
      }

      inds[3*nd] = min; inds[3*nd + 1] = max; inds[3*nd + 2] = 1L;
      
      varsize *= max - min + 1;

      nd++;
      dims = dims->next;
    }
    
    // Get variable type
    char *typ;
    typ = PD_entry_type(ep);

    if((strcmp(varname, "t_array") == 0) && (nd == 1)) {
      float *fdata = new float[varsize];

      // Read the data from the PDB file

      inds[2] = tstride;
      int nread;
      if( (nread = PD_read_as_alt(in, varname, "float", fdata, inds)) == 0) {
	fprintf(stderr, "\tWARNING: Could not read t_array. Ignoring\n");
	delete[] fdata;
	continue;
      }
      
      inds[0] = 0L;
      inds[1] = nread-1;
      inds[2] = 1L;
      
      if(PD_write_alt(out, varname, "float", fdata, 1, inds) == FALSE) {
	fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname);
      }

      delete[] fdata;

    }else if(nd == 4) {
      // Reducing time resolution
      
      if(strcasecmp(typ, "integer") == 0) {
	int *idata = new int[varsize];
	
	// Read the data from the PDB file
	inds[2] = tstride;
	int nread;
	if( (nread = PD_read_as_alt(in, varname, "integer", idata, inds)) == 0) {
	  fprintf(stderr, "\tWARNING: Could not read '%s'. Ignoring\n", varname);
	  delete[] idata;
	  continue;
	}
	
	if( nread % (varsize / (inds[1] - inds[0] + 1)) != 0 ) {
	  fprintf(stderr, "ERROR: Accounting error: (%ld, %ld), %d, %d\n", inds[0], inds[1], varsize, nread);
	  delete[] idata;
	  continue;
	}
	
	nread = nread / (varsize / (inds[1] - inds[0] + 1));

	inds[0] = 0L; 
	inds[1] = nread - 1;
	inds[2] = 1L;
	
	if(PD_write_alt(out, varname, "integer", idata, 4, inds) == FALSE) {
	  fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname);
	}
	
	delete[] idata;
	
      }else if( (strcasecmp(typ, "float") == 0) ||
		(strcasecmp(typ, "double") == 0) ) {
	// Convert doubles to floats
	
	float *fdata = new float[varsize];
	
	// Read the data from the PDB file
	inds[2] = tstride;
	int nread;
	if( (nread = PD_read_as_alt(in, varname, "float", fdata, inds)) == 0) {
	  fprintf(stderr, "\tWARNING: Could not read '%s'. Ignoring\n", varname);
	  delete[] fdata;
	  continue;
	}
	
	if( nread % (varsize / (inds[1] - inds[0] + 1)) != 0 ) {
	  fprintf(stderr, "ERROR: Accounting error: (%ld, %ld), %d, %d\n", inds[0], inds[1], varsize, nread);
	  delete[] fdata;
	  continue;
	}
	
	nread = nread / (varsize / (inds[1] - inds[0] + 1));

	inds[0] = 0L; 
	inds[1] = nread - 1;
	inds[2] = 1L;
	
	if(PD_write_alt(out, varname, "float", fdata, 4, inds) == FALSE) {
	  fprintf(stderr, "\tWARNING: Could not write '%s'. Ignoring\n", varname);
	}
	
	delete[] fdata;
	
      }else {
	fprintf(stderr, "\tWARNING: '%s' has unrecognised type '%s'. Ignoring\n", varname, typ);
      }
    }else {
      // Just copy the data across
      
      if(strcasecmp(typ, "integer") == 0) {
	
	int *idata = new int[varsize];
	
	// Read the data from the PDB file
	if (PD_read_as(in, varname, "integer", idata) == 0) {
	  fprintf(stderr, "\t\tWARNING: Could not read variable. Ignoring\n");
	  delete[] idata;
	  continue;
	}
	
	if(PD_write_alt(out, varname, "integer", idata, nd, inds) == FALSE) {
	  fprintf(stderr, "\tWARNING: Could not write variable '%s'\n", varname);
	}

	delete[] idata;
	
      }else if( (strcasecmp(typ, "float") == 0) ||
		(strcasecmp(typ, "double") == 0) ) {
	// Convert doubles to floats
	
	float *fdata = new float[varsize];
	
	// Read the data from the PDB file
	if (PD_read_as(in, varname, "float", fdata) == 0) {
	  fprintf(stderr, "\tWARNING: Could not read variable '%s'. Ignoring\n", varname);
	  delete[] fdata;
	  continue;
	}
	
	if(PD_write_alt(out, varname, "float", fdata, nd, inds) == FALSE) {
	  fprintf(stderr, "\tWARNING: Could not write variable '%s'\n", varname);
	}

	delete[] fdata;
      }else {
	fprintf(stderr, "WARNING: '%s' has unrecognised type '%s'. Ignoring\n", varname, typ);
      }
    }
  }
  
  PD_close(in);
  PD_close(out);
  
  return 0;
}