static CDFstatus ValidateADR (struct CDFstruct *CDF, vFILE *fp, OFF_T offset, Logical debug) { struct ADRstruct64 ADR; CDFstatus status; if (debug) #if defined(win32) || defined(__MINGW32__) printf(" Checking ADR...@%I64d\n", offset); #else printf(" Checking ADR...@%lld\n", offset); #endif status = ReadADR64 (fp, offset, ADR_RECORD, &ADR, ADR_NULL); if (status != CDF_OK) return status; if (ADR.RecordType != ADR_) return QuitCDF ("CDF(ADR): record type is invalid ", offset, 4, 1, &(ADR.RecordType), 0, debug); if (ADR.RecordSize < ADR_BASE_SIZE64 || ADR.RecordSize > ADR_MAX_SIZE64) return QuitCDF ("CDF(ADR): record size is invalid ", offset, 8, 1, &(ADR.RecordSize), 0, debug); if (ADR.ADRnext < 0 || ((ADR.Num < (GDR.NumAttr-1)) && ADR.ADRnext == 0)) return QuitCDF ("CDF(ADR): offset to next ADR is invalid ", offset, 8, 1, &(ADR.ADRnext), 0, debug); if (ADR.AgrEDRhead < 0 || (ADR.NgrEntries > 0 && ADR.AgrEDRhead == 0)) return QuitCDF ("CDF(ADR): offset to AgrEDR is invalid ", offset, 8, 1, &(ADR.AgrEDRhead), 0, debug); if (!ValidAttrScope(ADR.Scope)) return QuitCDF ("CDF(ADR): scope is invalid ", offset, 4, 1, &(ADR.Scope), 0, debug); if (ADR.Num < 0 || ADR.Num > GDR.NumAttr) return QuitCDF ("CDF(ADR): attribute number is invalid ", offset, 4, 2, &(ADR.Num), &(GDR.NumAttr), debug); if (ADR.NgrEntries < 0) return QuitCDF ("CDF(ADR): number of g/rEntries is invalid ", offset, 4, 1, &(ADR.NgrEntries), 0, debug); if (ADR.MAXgrEntry < -1) return QuitCDF ("CDF(ADR): max g/rEntry is invalid ", offset, 4, 1, &(ADR.MAXgrEntry), 0, debug); if ((ADR.Scope == VARIABLE_SCOPE) && (ADR.MAXgrEntry < (ADR.NgrEntries-1))) return QuitCDF ("CDF(ADR): max rEntry is invalid ", offset, 4, 2, &(ADR.MAXgrEntry), &(ADR.NgrEntries), debug); if (ADR.AzEDRhead < 0 || (ADR.NzEntries > 0 && ADR.AzEDRhead == 0)) return QuitCDF ("CDF(ADR): offset to next AzEDR is invalid ", offset, 8, 1, &(ADR.AzEDRhead), 0, debug); if ((ADR.Scope == VARIABLE_SCOPE) && (ADR.MAXzEntry < (ADR.NzEntries-1))) return QuitCDF ("CDF(ADR): max zEntry is invalid ", offset, 4, 2, &(ADR.MAXzEntry), &(ADR.NzEntries), debug); if (!ValidAttrName(ADR.Name)) return QuitCDF ("CDF(ADR): attribute name is invalid ", offset, 0, 1, ADR.Name, 0, debug); return CDF_OK; }
CDFstatus ValidateADR (struct CDFstruct *CDF, vFILE *fp, Int32 offset, Logical debug) { struct ADRstruct ADR; CDFstatus status; if (debug) printf(" Checking ADR...@%d\n", (int) offset); status = ReadADR (fp, offset, ADR_RECORD, &ADR, ADR_NULL); if (status != CDF_OK) return status; if (ADR.RecordType != ADR_) return QuitCDF ("CDF: record type is invalid ", 4, 1, &(ADR.RecordType), 0, debug); if (ADR.RecordSize < ADR_BASE_SIZE || ADR.RecordSize > ADR_MAX_SIZE) return QuitCDF ("CDF: record size is invalid ", 4, 1, &(ADR.RecordSize), 0, debug); if (ADR.ADRnext < 0 || ((ADR.Num < (GDR.NumAttr-1)) && ADR.ADRnext == 0)) return QuitCDF ("CDF: offset to next ADR is invalid ", 4, 1, &(ADR.ADRnext), 0, debug); if (ADR.AgrEDRhead < 0 || (ADR.NgrEntries > 0 && ADR.AgrEDRhead == 0)) return QuitCDF ("CDF: record size is invalid ", 4, 1, &(ADR.AgrEDRhead), 0, debug); /* if ((ADR.Scope == GLOBAL_SCOPE) && (ADR.NzEntries > 0)) return QuitCDF ("CDF: attribute zEntries exist for a global attribute ", 4, 1, &(ADR.NzEntries), 0, debug); */ if (!ValidAttrScope(ADR.Scope)) return QuitCDF ("CDF: scope is invalid ", 4, 1, &(ADR.Scope), 0, debug); if (ADR.Num < 0 || ADR.Num > GDR.NumAttr) return QuitCDF ("CDF: attribute number is invalid ", 4, 2, &(ADR.Num), &(GDR.NumAttr), debug); if (ADR.NgrEntries < 0) return QuitCDF ("CDF: number of g/rEntries is invalid ", 4, 1, &(ADR.NgrEntries), 0, debug); /* if ((ADR.Scope == VARIABLE_SCOPE) && (ADR.NgrEntries > CDF->NrVars)) return QuitCDF ("CDF: number of rEntries is invalid ", 4, 1, &(ADR.NgrEntries), 0, debug); */ if (ADR.MAXgrEntry < -1) return QuitCDF ("CDF: max g/rEntry is invalid ", 4, 1, &(ADR.MAXgrEntry), 0, debug); if ((ADR.Scope == VARIABLE_SCOPE) && (ADR.MAXgrEntry < (ADR.NgrEntries-1))) return QuitCDF ("CDF: max rEntry is invalid ", 4, 2, &(ADR.MAXgrEntry), &(ADR.NgrEntries), debug); if (ADR.AzEDRhead < 0 || (ADR.NzEntries > 0 && ADR.AzEDRhead == 0)) return QuitCDF ("CD2: offset to next AzEDR is invalid ", 4, 1, &(ADR.AzEDRhead), 0, debug); /* if (ADR.NzEntries < 0 || ((ADR.Scope == VARIABLE_SCOPE) && (ADR.NzEntries > CDF->NzVars))) return QuitCDF ("CDF: number of zEntries is invalid ", 4, 2, &(ADR.NzEntries), &(CDF->NzVars), debug); if (ADR.MAXzEntry < -1 || ((ADR.Scope == VARIABLE_SCOPE) && (ADR.MAXzEntry > CDF->NzVars))) return QuitCDF ("CDF: max zEntry is invalid ", 4, 2, &(ADR.MAXzEntry), &(CDF->NzVars), debug); */ if ((ADR.Scope == VARIABLE_SCOPE) && (ADR.MAXzEntry < (ADR.NzEntries-1))) return QuitCDF ("CDF: max zEntry is invalid ", 4, 2, &(ADR.MAXzEntry), &(ADR.NzEntries), debug); if (!ValidAttrName(ADR.Name)) return QuitCDF ("CDF: attribute name is invalid ", 0, 1, ADR.Name, 0, debug); return CDF_OK; }