Exemple #1
0
static CDFstatus ValidateVDR (struct CDFstruct *CDF, vFILE *fp, OFF_T offset,
                              Logical zVar, Logical debug)
{
    struct VDRstruct64 VDR;
    void *padValue;
    Int32 nDims, numVars;
    int ix;
    CDFstatus status;
    size_t nBytes;

    if (debug)
#if defined(win32) || defined(__MINGW32__)
        printf("  Checking VDR...@%I64d\n", offset);
#else
        printf("  Checking VDR...@%lld\n", offset);
#endif
    status = ReadVDR64 (CDF, fp, offset, zVar,
                        VDR_RECORD, &VDR, NULL,
                        VDR_NULL);
    if (status != CDF_OK) return status;
    if ((zVar && VDR.RecordType != zVDR_) || (!zVar && VDR.RecordType != rVDR_))
        return QuitCDF ("CDF(VDR): record type is invalid ", offset,
                        4, 1, &(VDR.RecordType), 0, debug);
    if (VDR.RecordSize < (zVar ? zVDR_BASE_SIZE64 : rVDR_BASE_SIZE64))
        return QuitCDF ("CDF(VDR): record size is invalid ", offset,
                        8, 1, &(VDR.RecordSize), 0, debug);
    if (!ValidDataType(VDR.DataType))
        return QuitCDF ("CDF(VDR): data type is invalid ", offset,
                        4, 1, &(VDR.DataType), 0, debug);
    if (VDR.MaxRec < -1)
        return QuitCDF ("CDF(VDR): max record is invalid ", offset,
                        4, 1, &(VDR.MaxRec), 0, debug);
    if (VDR.NumElems < 1 || (!STRINGdataType(VDR.DataType) && VDR.NumElems != 1))
        return QuitCDF ("CDF(VDR): number of elements is invalid ", offset,
                        4, 1, &(VDR.NumElems), 0, debug);
    if (zVar) numVars = CDF->NzVars;
    else numVars = CDF->NrVars;
    if (VDR.Num < 0 || VDR.Num > numVars)
        return QuitCDF ("CDF(VDR): variable number is invalid ", offset,
                        4, 2, &(VDR.Num), &numVars, debug);
    if ((VDR.Num < (numVars-1)) && (VDR.VDRnext < 1))
        return QuitCDF ("CDF(VDR): offset to next VDR is invalid ", offset,
                        8, 1, &(VDR.VDRnext), 0, debug);
    if (VARcompressionBITset(VDR.Flags) && VDR.CPRorSPRoffset <= NO_OFFSET64)
        return QuitCDF ("CDF(VDR): offset to CPRorSPR is invalid ", offset,
                        8, 1, &(VDR.CPRorSPRoffset), 0, debug);
    if (VDR.blockingFactor < 0)
        return QuitCDF ("CDF(VDR): blocking factor is invalid ", offset,
                        4, 1, &(VDR.blockingFactor), 0, debug);
    if (!ValidVarName(VDR.Name))
        return QuitCDF ("CDF(VDR): variable name is invalid ",  offset,
                        0, 1, VDR.Name, 0, debug);
    if (zVar) {
        if (VDR.zNumDims < 0 || VDR.zNumDims > CDF_MAX_DIMS)
            return QuitCDF ("CDF(VDR): number of dimensions is invalid ", offset,
                            4, 1, &(VDR.zNumDims), 0, debug);
        for (ix = 0; ix < (int)VDR.zNumDims; ++ix)
            if (VDR.zDimSizes[ix] < 1)
                return QuitCDF ("CDF(VDR): dimensional size is invalid ", offset,
                                4, 1, &(VDR.zDimSizes[ix]), 0, debug);
    }
    nBytes = (size_t) (CDFelemSize(VDR.DataType)*VDR.NumElems);
    if (nBytes < 1)
        return QuitCDF ("CDF(VDR): pad value size is invalid ", offset,
                        4, 1, &nBytes, 0, debug);
    if (VDR.RecordSize > ((zVar ? zVDR_MAX_SIZE64 : rVDR_MAX_SIZE64) + nBytes))
        return QuitCDF ("CDF(VDR): record size is invalid ", offset,
                        8, 1, &(VDR.RecordSize), 0, debug);
    return CDF_OK;
}
Exemple #2
0
CDFstatus ValidateVDR (struct CDFstruct *CDF, vFILE *fp, Int32 offset, 
		       Logical zVar, Logical debug)
{
  struct VDRstruct VDR;
  void *padValue;
  Int32 nDims, numVars;
  int ix;
  CDFstatus status;
  size_t nBytes;
  
  if (debug)
    printf("  Checking VDR...@%d\n", (int) offset);
  status = ReadVDR (CDF, fp, offset, zVar, 
                    VDR_RECORD, &VDR, NULL,
                    VDR_NULL);
  if (status != CDF_OK) return status;
  if ((!zVar && VDR.RecordType != rVDR_) || (zVar && VDR.RecordType != zVDR_))
    return QuitCDF ("CDF: record type is invalid ",
                    4, 1, &(VDR.RecordType), 0, debug);
  if (VDR.RecordSize < (zVar ? zVDR_BASE_SIZE : rVDR_BASE_SIZE)) 
    return QuitCDF ("CDF: record size is invalid ",
                    4, 1, &(VDR.RecordSize), 0, debug);
  if (!ValidDataType(VDR.DataType) || InValidDataType(VDR.DataType))
    return QuitCDF ("CDF: data type is invalid ",
                    4, 1, &(VDR.DataType), 0, debug);
  if (VDR.MaxRec < -1) 
    return QuitCDF ("CDF: max record is invalid ",
                    4, 1, &(VDR.MaxRec), 0, debug);
  if (VDR.NumElems < 1 || (!STRINGdataType(VDR.DataType) && VDR.NumElems != 1))
    return QuitCDF ("CDF: number of elements is invalid ",
                    4, 1, &(VDR.NumElems), 0, debug);
  if (zVar) numVars = CDF->NzVars;
  else numVars = CDF->NrVars;
  if (VDR.Num < 0 || VDR.Num > numVars)
    return QuitCDF ("CDF: variable number is invalid ",
                    4, 2, &(VDR.Num), &numVars, debug);
  if ((VDR.Num < (numVars-1)) && VDR.VDRnext < 1) 
    return QuitCDF ("CDF: offset to next VDR is invalid ",
                    4, 1, &(VDR.VDRnext), 0, debug);
  if (VARcompressionBITset(VDR.Flags) && VDR.CPRorSPRoffset <= (int) NO_OFFSET) 
    return QuitCDF ("CDF: offset to CPRorSPR is invalid ",
                    4, 1, &(VDR.CPRorSPRoffset), 0, debug);
  if (VDR.blockingFactor < 0) 
    return QuitCDF ("CDF: blocking factor is invalid ",
                    4, 1, &(VDR.blockingFactor), 0, debug);
  if (!ValidVarName(VDR.Name)) 
    return QuitCDF ("CDF: variable name is invalid ", 
                    0, 1, VDR.Name, 0, debug);
  if (zVar) {
    if (VDR.zNumDims < 0 || VDR.zNumDims > CDF_MAX_DIMS) 
    return QuitCDF ("CDF: number of dimensions is invalid ",
                    4, 1, &(VDR.zNumDims), 0, debug);
    for (ix = 0; ix < (int)VDR.zNumDims; ++ix)
      if (VDR.zDimSizes[ix] < 1) 
    return QuitCDF ("CDF: dimensional size is invalid ",
                    4, 1, &(VDR.zDimSizes[ix]), 0, debug);
  }
  nBytes = (size_t) (CDFelemSize(VDR.DataType)*VDR.NumElems);
  if (nBytes < 1)
    return QuitCDF ("CDF: pad value size is invalid ",
                    4, 1, &nBytes, 0, debug);
  if (VDR.RecordSize > ((zVar ? zVDR_MAX_SIZE : rVDR_MAX_SIZE) + nBytes +
                         (CDF->wastedSpace ? VDR_WASTED_SIZE : 0)))
    return QuitCDF ("CDF: record size is invalid ",
                    4, 1, &(VDR.RecordSize), 0, debug);
  return CDF_OK;
}