int main(int argc, char *argv[]) { int argPos = 0, argNum = argc, ret = CMfailed, itemSize, itemID; FILE *inFile = stdin, *outFile = stdout; void *items = (void *) NULL; MFVarHeader_t header; if (argNum < 2) goto Help; for (argPos = 1; argPos < argNum;) { if (CMargTest(argv[argPos], "-i", "--item")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) { CMmsgPrint(CMmsgUsrError, "Missing sampling item!"); return (CMfailed); } if ((sscanf(argv[argPos], "%d", &itemID)) != 1) { CMmsgPrint(CMmsgUsrError, "Invalid sampling item"); return (CMfailed); } if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } Help: if (CMargTest(argv[argPos], "-h", "--help")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) < argPos) break; CMmsgPrint(CMmsgUsrError, "%s [options] <in datastream> <out datastream>", CMfileName(argv[0])); CMmsgPrint(CMmsgUsrError, " -i, --item [item]"); CMmsgPrint(CMmsgUsrError, " -h,--help"); ret = CMsucceeded; goto Stop; } if ((argv[argPos][0] == '-') && (strlen(argv[argPos]) > 1)) { CMmsgPrint(CMmsgUsrError, "Unknown option: %s!", argv[argPos]); return (CMfailed); } argPos++; } if (argNum > 3) { CMmsgPrint(CMmsgUsrError, "Extra arguments!"); goto Stop; } if ((inFile = (argNum > 1) && (strcmp(argv[1], "-") != 0) ? fopen(argv[1], "r") : stdin) == (FILE *) NULL) { CMmsgPrint(CMmsgSysError, "Input file opening error in: %s %d", __FILE__, __LINE__); goto Stop; } if ((outFile = (argNum > 2) && (strcmp(argv[2], "-") != 0) ? fopen(argv[2], "w") : stdout) == (FILE *) NULL) { CMmsgPrint(CMmsgSysError, "Output file opening error in: %s %d", __FILE__, __LINE__); goto Stop; } while (MFVarReadHeader(&header, inFile)) { if (items == (void *) NULL) { itemSize = MFVarItemSize(header.DataType); if ((items = (void *) calloc(header.ItemNum, itemSize)) == (void *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s:%d", __FILE__, __LINE__); goto Stop; } } if ((int) fread(items, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Input reading error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((itemID < 0) || (itemID >= header.ItemNum)) { CMmsgPrint(CMmsgAppError, "Invalid Item id [%d]", itemID); continue; } switch (header.DataType) { case MFByte: if (((char *) items)[itemID] != header.Missing.Int) fprintf(outFile, "%s\t%d\n", header.Date, (int) ((char *) items)[itemID]); else fprintf(outFile, "%s\t\n", header.Date); break; case MFShort: if (header.Swap != 1) MFSwapHalfWord(((short *) items) + itemID); if (((short *) items)[itemID] != header.Missing.Int) fprintf(outFile, "\t%d\n", (int) ((short *) items)[itemID]); else fprintf(outFile, "%s\t\n", header.Date); break; case MFInt: if (header.Swap != 1) MFSwapWord(((int *) items) + itemID); if (((int *) items)[itemID] != header.Missing.Int) fprintf(outFile, "%s\t%d\n", header.Date, (int) ((int *) items)[itemID]); else fprintf(outFile, "%s\t\n", header.Date); break; case MFFloat: if (header.Swap != 1) MFSwapWord(((float *) items) + itemID); if (CMmathEqualValues(((float *) items)[itemID], header.Missing.Float) == false) fprintf(outFile, "%s\t%f\n", header.Date, (float) ((float *) items)[itemID]); else fprintf(outFile, "%s\t\n", header.Date); break; case MFDouble: if (header.Swap != 1) MFSwapLongWord(((double *) items) + itemID); if (CMmathEqualValues(((double *) items)[itemID], header.Missing.Float) == false) fprintf(outFile, "%s\t%lf\n", header.Date, (double) ((double *) items)[itemID]); else fprintf(outFile, "%s\t\n", header.Date); break; } } ret = CMsucceeded; Stop: if (inFile != stdin) fclose(inFile); if (outFile != stdout) fclose(outFile); return (ret); }
MFDomain_t *MFDomainGet (FILE *inFile) { int objID, i; MFDomain_t *domain; if ((domain = (MFDomain_t *) calloc (1,sizeof (MFDomain_t))) == (MFDomain_t *) NULL) return ((MFDomain_t *) NULL); domain->Objects = (MFObject_t *) NULL; if (fread (domain,sizeof (MFDomain_t) - sizeof (MFObject_t *),1,inFile) != 1) { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } if (domain->Swap != 1) { MFSwapHalfWord (&(domain->Type)); MFSwapWord (&(domain->ObjNum)); } if ((domain->Objects = (MFObject_t *) calloc (domain->ObjNum,sizeof (MFObject_t))) == (MFObject_t *) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } for (objID = 0;objID < domain->ObjNum;++objID) { domain->Objects [objID].DLinks = (size_t *) NULL; domain->Objects [objID].ULinks = (size_t *) NULL; } for (objID = 0;objID < domain->ObjNum;++objID) { if (fread (domain->Objects + objID,sizeof (MFObject_t) - 2 * sizeof (MFObject_t *),1,inFile) != 1) { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } if (domain->Swap != 1) { MFSwapWord (&(domain->Objects [objID].ID)); MFSwapHalfWord (&(domain->Objects [objID].DLinkNum)); MFSwapHalfWord (&(domain->Objects [objID].ULinkNum)); MFSwapWord (&(domain->Objects [objID].XCoord)); MFSwapWord (&(domain->Objects [objID].YCoord)); MFSwapWord (&(domain->Objects [objID].Lon)); MFSwapWord (&(domain->Objects [objID].Lat)); MFSwapWord (&(domain->Objects [objID].Area)); MFSwapWord (&(domain->Objects [objID].Length)); } if (domain->Objects [objID].DLinkNum > 0) { domain->Objects [objID].DLinks = (size_t *) calloc (domain->Objects [objID].DLinkNum,sizeof (size_t *)); if (domain->Objects [objID].DLinks == (size_t *) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } if (fread (domain->Objects [objID].DLinks,sizeof (size_t),domain->Objects [objID].DLinkNum,inFile) == domain->Objects [objID].DLinkNum) { if (domain->Swap != 1) for (i = 0;i < domain->Objects [objID].DLinkNum; ++i) MFSwapWord (domain->Objects [objID].DLinks + i); } else { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } } if (domain->Objects [objID].ULinkNum > 0) { domain->Objects [objID].ULinks = (size_t *) calloc (domain->Objects [objID].ULinkNum,sizeof (size_t)); if (domain->Objects [objID].ULinks == (size_t *) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } if (fread (domain->Objects [objID].ULinks,sizeof (size_t),domain->Objects [objID].ULinkNum,inFile) == domain->Objects [objID].ULinkNum) { if (domain->Swap != 1) for (i = 0;i < domain->Objects [objID].ULinkNum; ++i) MFSwapWord (domain->Objects [objID].ULinks + i); } else { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d\n",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_t *) NULL); } } } return (domain); }
MFDomain_p MFDomainRead (FILE *inFile) { int objID, i; MFDomain_p domain; if ((domain = (MFDomain_p) calloc (1,sizeof (MFDomain_t))) == (MFDomain_p) NULL) return ((MFDomain_p) NULL); domain->Objects = (MFObject_p) NULL; if (fread (domain,sizeof (MFDomain_t) - sizeof (MFObject_p),1,inFile) != 1) { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } if (domain->Swap != 1) { MFSwapHalfWord (&(domain->Type)); MFSwapWord (&(domain->ObjNum)); } if ((domain->Objects = (MFObject_p) calloc (domain->ObjNum,sizeof (MFObject_t))) == (MFObject_p) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } for (objID = 0;objID < domain->ObjNum;++objID) { domain->Objects [objID].DLinks = (size_t *) NULL; domain->Objects [objID].ULinks = (size_t *) NULL; domain->Objects [objID].DWeights = (float *) NULL; domain->Objects [objID].UWeights = (float *) NULL; } for (objID = 0;objID < domain->ObjNum;++objID) { if (fread (domain->Objects + objID,sizeof (MFObject_t) - 2 * sizeof (MFObject_p),1,inFile) != 1) { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } if (domain->Swap != 1) { MFSwapWord (&(domain->Objects [objID].ID)); MFSwapHalfWord (&(domain->Objects [objID].DLinkNum)); MFSwapHalfWord (&(domain->Objects [objID].ULinkNum)); MFSwapWord (&(domain->Objects [objID].XCoord)); MFSwapWord (&(domain->Objects [objID].YCoord)); MFSwapWord (&(domain->Objects [objID].Lon)); MFSwapWord (&(domain->Objects [objID].Lat)); MFSwapWord (&(domain->Objects [objID].Area)); MFSwapWord (&(domain->Objects [objID].Length)); } if (domain->Objects [objID].DLinkNum > 0) { domain->Objects [objID].DLinks = (size_t *) calloc (domain->Objects [objID].DLinkNum,sizeof (size_t *)); if (domain->Objects [objID].DLinks == (size_t *) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } domain->Objects [objID].DWeights = (float *) calloc (domain->Objects [objID].DLinkNum,sizeof (float)); if (domain->Objects [objID].DWeights == (float*) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } if (fread (domain->Objects [objID].DLinks,sizeof (size_t),domain->Objects [objID].DLinkNum,inFile) == domain->Objects [objID].DLinkNum) { if (domain->Swap != 1) for (i = 0;i < domain->Objects [objID].DLinkNum; ++i) MFSwapWord (domain->Objects [objID].DLinks + i); for (i = 0; i < domain->Objects [objID].DLinkNum; ++i) { // assume network originates with single downlink. if (i>1) CMmsgPrint(CMmsgSysError, "Bifurcation code assumption of single inital downlink WRONG at %s:%d",__FILE__,__LINE__); domain->Objects[objID].DWeights[i] = 1.0; } } else { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } } if (domain->Objects [objID].ULinkNum > 0) { domain->Objects [objID].ULinks = (size_t *) calloc (domain->Objects [objID].ULinkNum,sizeof (size_t)); if (domain->Objects [objID].ULinks == (size_t *) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } domain->Objects [objID].UWeights = (float *) calloc (domain->Objects [objID].ULinkNum,sizeof (float)); if (domain->Objects [objID].UWeights == (float*) NULL) { CMmsgPrint (CMmsgSysError,"Memory Allocation Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } if (fread (domain->Objects [objID].ULinks,sizeof (size_t),domain->Objects [objID].ULinkNum,inFile) == domain->Objects [objID].ULinkNum) { if (domain->Swap != 1) for (i = 0;i < domain->Objects [objID].ULinkNum; ++i) MFSwapWord (domain->Objects [objID].ULinks + i); for (i = 0; i < domain->Objects [objID].ULinkNum; ++i) { // Weights refer to fraction of UPSTREAM CELL outflow. So all the UWeights could be more or less than 1, but all the DWeights for a cell sum to 1. // again, assuming single downlinks, so initial weight of each downlink is 1 domain->Objects[objID].UWeights[i] = 1.0; } } else { CMmsgPrint (CMmsgSysError,"File Reading Error in: %s:%d",__FILE__,__LINE__); MFDomainFree (domain); return ((MFDomain_p) NULL); } } } return (domain); }
int MFDataStreamRead (MFVariable_t *var) { int i, sLen; MFVarHeader_t header; if (var->InStream->Type == MFConst) { if (var->Header.ItemNum < 1) { sLen = strlen (var->InPath); for (i = strlen (MFconstStr);i < sLen;++i) if (var->InPath [i] == '.') break; if (i == sLen) { if (sscanf (var->InPath + strlen (MFconstStr),"%d",&(var->InStream->Handle.Int)) != 1) { CMmsgPrint (CMmsgAppError,"Error: Reading constant [%s]!\n",var->Name); return (CMfailed); } if (var->InStream->Handle.Int < 127) { var->Header.DataType = MFByte; var->Header.Missing.Int = MFDefaultMissingByte; } else if (var->InStream->Handle.Int < 32767) { var->Header.DataType = MFShort; var->Header.Missing.Int = MFDefaultMissingInt; } else { var->Header.DataType = MFInt; var->Header.Missing.Int = MFDefaultMissingInt; } if (var->Header.Missing.Int == var->InStream->Handle.Int) var->Header.Missing.Int = (int) 0; } else { var->Header.DataType = MFFloat; if (sscanf (var->InPath + strlen (MFconstStr),"%lf",&var->InStream->Handle.Float) != 1) { CMmsgPrint (CMmsgAppError,"Error: Reading constant [%s]!\n",var->Name); return (CMfailed); } var->Header.Missing.Float = CMmathEqualValues (var->InStream->Handle.Float,MFDefaultMissingFloat) ? (float) 0.0 : MFDefaultMissingFloat; } } strcpy (var->Header.Date,MFDateClimatologyStr); } else { if (var->InStream->Handle.File == (FILE *) NULL) return (CMfailed); if (!MFVarReadHeader (&header,var->InStream->Handle.File)) return (MFStop); if (var->Data == (void *) NULL) { if ((var->Data = (void *) realloc (var->Data,header.ItemNum * MFVarItemSize (header.DataType))) == (void *) NULL) { CMmsgPrint (CMmsgSysError,"Variable [%s] allocation error in: %s:%d\n",var->Name,__FILE__,__LINE__); return (CMfailed); } var->Header.ItemNum = header.ItemNum; var->Header.DataType = header.DataType; switch (var->Header.DataType) { case MFByte: case MFShort: case MFInt: var->Header.Missing.Int = header.Missing.Int; break; case MFFloat: case MFDouble: var->Header.Missing.Float = header.Missing.Float; break; } } else if (header.DataType != var->Header.DataType) { CMmsgPrint (CMmsgAppError,"Record Type Missmatch [%d,%d] in: %s:%d varName %s \n", header.DataType, var->Header.DataType,__FILE__,__LINE__, var->Name); return (CMfailed); } else if (header.ItemNum != var->Header.ItemNum) { CMmsgPrint (CMmsgAppError,"Record Size Missmatch [%d,%d] in: %s:%d\n", header.ItemNum, var->Header.ItemNum, __FILE__,__LINE__); return (CMfailed); } if ((int) fread (var->Data,MFVarItemSize (header.DataType),header.ItemNum,var->InStream->Handle.File) != header.ItemNum) { CMmsgPrint (CMmsgSysError,"Data Reading error in: %s:%d\n",__FILE__,__LINE__); return (CMfailed); } strncpy (var->Header.Date, header.Date, sizeof (header.Date)); if (header.Swap != 1) switch (header.DataType) { case MFShort: for (i = 0;i < var->Header.ItemNum;++i) MFSwapHalfWord ((short *) (var->Data) + i); break; case MFInt: for (i = 0;i < var->Header.ItemNum;++i) MFSwapWord ((int *) (var->Data) + i); break; case MFFloat: for (i = 0;i < var->Header.ItemNum;++i) MFSwapWord ((float *) (var->Data) + i); break; case MFDouble: for (i = 0;i < var->Header.ItemNum;++i) MFSwapLongWord ((double *) (var->Data) + i); break; default: break; } } return (MFContinue); }
int main(int argc, char *argv[]) { int argPos, argNum = argc, ret = CMfailed, itemSize, i, bin, binNum = 1000, percent; bool valueMode = false; FILE *inFile = (FILE *) NULL, *outFile = stdout; char *fileName = (char *) NULL; void *items = (void *) NULL; double *max = (double *) NULL; double *min = (double *) NULL; float *output = (float *) NULL; int *bins = (int *) NULL; double value, binSize, binMax, binMin, percentMin; /* percentMax */ MFdsHeader_t header, outHeader; if (argNum < 2) goto Help; for (argPos = 1; argPos < argNum;) { if (CMargTest(argv[argPos], "-i", "--input")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; fileName = argv[argPos]; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos], "-b", "--bins")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; if (sscanf(argv[argPos], "%d", &binNum) != 1) { CMmsgPrint(CMmsgUsrError, "Ilformed bin number!"); goto Stop; } if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest (argv[argPos], "-m", "--mode")) { int mode; const char *modes[] = {"percent", "value", (char *) NULL}; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) { CMmsgPrint(CMmsgUsrError, "Missing savesteps!"); return (CMfailed); } if ((mode = CMoptLookup(modes, argv[argPos], true)) == CMfailed) { CMmsgPrint(CMmsgUsrError, "Invalid savesteps mode!"); return (CMfailed); } valueMode = mode == 1 ? true : false; if ((argNum = CMargShiftLeft(argPos, argv, argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos], "-h", "--help")) { if ((argNum = CMargShiftLeft(argPos, argv, argNum)) < argPos) break; Help: CMmsgPrint(CMmsgUsrError, "%s [options] <out datastream>", CMfileName(argv[0])); CMmsgPrint(CMmsgUsrError, " -i, --input [input datastream]"); CMmsgPrint(CMmsgUsrError, " -b, --bins [# of bins]"); CMmsgPrint(CMmsgUsrError, " -m, --mode [percent|value]"); CMmsgPrint(CMmsgUsrError, " -h,--help"); ret = CMsucceeded; goto Stop; } if ((argv[argPos][0] == '-') && (strlen(argv[argPos]) > 1)) { CMmsgPrint(CMmsgUsrError, "Unknown option: %s!", argv[argPos]); return (CMfailed); } argPos++; } if (argNum > 2) { CMmsgPrint(CMmsgUsrError, "Extra arguments!"); goto Stop; } if (fileName == (char *) NULL) { CMmsgPrint(CMmsgUsrError, "Missing input file!"); goto Stop; } if ((outFile = (argNum > 2) && (strcmp(argv[1], "-") != 0) ? fopen(argv[1], "w") : stdout) == (FILE *) NULL) { CMmsgPrint(CMmsgSysError, "Output file opening error in: %s %d", __FILE__, __LINE__); goto Stop; } if ((inFile = fopen(fileName, "r")) == (FILE *) NULL) { CMmsgPrint(CMmsgSysError, "Input file opening error in: %s %d", __FILE__, __LINE__); goto Stop; } while (MFdsHeaderRead(&header, inFile) == CMsucceeded) { if (items == (void *) NULL) { itemSize = MFVarItemSize(header.Type); if ((items = (void *) calloc(header.ItemNum, itemSize)) == (void *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((max = (double *) calloc(header.ItemNum, sizeof(double))) == (double *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((min = (double *) calloc(header.ItemNum, sizeof(double))) == (double *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((output = (float *) calloc(header.ItemNum, sizeof(float))) == (float *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((bins = (int *) calloc(header.ItemNum * binNum, sizeof(int))) == (int *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s:%d", __FILE__, __LINE__); goto Stop; } for (i = 0; i < header.ItemNum; i++) { max[i] = -HUGE_VAL; min[i] = HUGE_VAL; for (bin = 0; bin < binNum; ++bin) bins[bin * header.ItemNum + i] = 0; } outHeader.Swap = 1; outHeader.Type = MFFloat; outHeader.ItemNum = header.ItemNum; outHeader.Missing.Float = MFDefaultMissingFloat; } if ((int) fread(items, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Input reading error in: %s:%d", __FILE__, __LINE__); goto Stop; } switch (header.Type) { case MFByte: for (i = 0; i < header.ItemNum; i++) { if (((char *) items)[i] == header.Missing.Int) continue; value = (double) (((char *) items)[i]); if (max[i] < value) max[i] = value; if (min[i] > value) min[i] = value; } break; case MFShort: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapHalfWord(((short *) items) + i); if (((short *) items)[i] == header.Missing.Int) continue; value = (double) (((short *) items)[i]); if (max[i] < value) max[i] = value; if (min[i] > value) min[i] = value; } break; case MFInt: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapWord(((int *) items) + i); if (((int *) items)[i] == header.Missing.Int) continue; value = (double) (((int *) items)[i]); if (max[i] < value) max[i] = value; if (min[i] > value) min[i] = value; } break; case MFFloat: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapWord(((float *) items) + i); if (CMmathEqualValues(((float *) items)[i], header.Missing.Float) == true) continue; value = (double) (((float *) items)[i]); if (max[i] < value) max[i] = value; if (min[i] > value) min[i] = value; } break; case MFDouble: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapLongWord(((double *) items) + i); if (CMmathEqualValues(((double *) items)[i], header.Missing.Float) == true) continue; value = (double) (((double *) items)[i]); if (max[i] < value) max[i] = value; if (min[i] > value) min[i] = value; } break; } } if (ferror (inFile) != 0) { CMmsgPrint(CMmsgSysError, "Input file reading error in: %s %d", __FILE__, __LINE__); goto Stop; } rewind(inFile); while (MFdsHeaderRead(&header, inFile) == CMsucceeded) { if ((int) fread(items, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Input reading error in: %s:%d", __FILE__, __LINE__); goto Stop; } switch (header.Type) { case MFByte: for (i = 0; i < header.ItemNum; i++) { if (((char *) items)[i] == header.Missing.Int) continue; if (!CMmathEqualValues(max[i], min[i])) { value = (double) (((char *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); for (; bin >= 0; bin--) bins[bin * header.ItemNum + i] += 1; } } break; case MFShort: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapHalfWord(((short *) items) + i); if (((short *) items)[i] == header.Missing.Int) continue; if (!CMmathEqualValues(max[i], min[i])) { value = (double) (((short *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); for (; bin >= 0; bin--) bins[bin * header.ItemNum + i] += 1; } } break; case MFInt: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapWord(((int *) items) + i); if (((int *) items)[i] == header.Missing.Int) continue; if (!CMmathEqualValues(max[i], min[i])) { value = (double) (((int *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); for (; bin >= 0; bin--) bins[bin * header.ItemNum + i] += 1; } } break; case MFFloat: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapWord(((float *) items) + i); if (CMmathEqualValues(((float *) items)[i], header.Missing.Float) == true) continue; if (!CMmathEqualValues(max[i], min[i])) { value = (double) (((float *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); for (; bin >= 0; bin--) bins[bin * header.ItemNum + i] += 1; } } break; case MFDouble: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapLongWord(((double *) items) + i); if (CMmathEqualValues(((double *) items)[i], header.Missing.Float) == true) continue; if (!CMmathEqualValues(max[i], min[i])) { value = (double) (((double *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); for (; bin >= 0; bin--) bins[bin * header.ItemNum + i] += 1; } } break; } } if (ferror (inFile) != 0) { CMmsgPrint(CMmsgSysError, "Input file reading error in: %s %d", __FILE__, __LINE__); goto Stop; } if (valueMode) { for (percent = 0; percent < 100; ++percent) { for (i = 0; i < header.ItemNum; i++) { binSize = (max[i] - min[i]) / (float) binNum; if (CMmathEqualValues(binSize, 0.0)) output[i] = min[i]; else { for (bin = 0; bin < binNum; ++bin) { percentMin = bins[bin * header.ItemNum + i] / bins[i] * 100.0; if ((float) percent > percentMin) break; } binMax = bin < binNum ? (float) bin * binSize + min[i] : max[i]; binMin = bin > 0 ? (float) (bin - 1) * binSize + min[i] : min[i]; // percentMax = bin < binNum ? bins [bin * header.ItemNum + i] / bins [i] * 100.0 : 100.0; output[i] = (binMax + binMin) / 2.0; } } sprintf(outHeader.Date, "%3d", percent + 1); if (MFdsHeaderWrite (&outHeader, outFile) == CMsucceeded) { CMmsgPrint(CMmsgSysError, "Output writing error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((int) fwrite(output, sizeof(float), outHeader.ItemNum, outFile) != outHeader.ItemNum) { CMmsgPrint(CMmsgSysError, "Output reading error in: %s:%d", __FILE__, __LINE__); goto Stop; } } ret = CMsucceeded; } else { rewind(inFile); while (MFdsHeaderRead (&header, inFile) == CMsucceeded) { if ((int) fread(items, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Input reading error in: %s:%d", __FILE__, __LINE__); goto Stop; } switch (header.Type) { case MFByte: for (i = 0; i < header.ItemNum; i++) { if (((char *) items)[i] == header.Missing.Int) output[i] = outHeader.Missing.Float; else if (bins[i] > 0) { value = (double) (((char *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); output[i] = 100.0 * (double) bins[bin * header.ItemNum + i] / (double) bins[i]; } else output[i] = 100.0; } break; case MFShort: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapHalfWord(((short *) items) + i); if (((short *) items)[i] == header.Missing.Int) output[i] = outHeader.Missing.Float; else if (bins[i] > 0) { value = (double) (((short *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); output[i] = 100.0 * (double) bins[bin * header.ItemNum + i] / (double) bins[i]; } else output[i] = 100.0; } break; case MFInt: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapWord(((int *) items) + i); if (((int *) items)[i] == header.Missing.Int) output[i] = outHeader.Missing.Float; else if (bins[i] > 0) { value = (double) (((int *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); output[i] = 100.0 * (double) bins[bin * header.ItemNum + i] / (double) bins[i]; } else output[i] = 100.0; } break; case MFFloat: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapWord(((float *) items) + i); if (CMmathEqualValues(((float *) items)[i], header.Missing.Float) == true) output[i] = outHeader.Missing.Float; else if (bins[i] > 0) { value = (double) (((float *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); output[i] = 100.0 * (double) bins[bin * header.ItemNum + i] / (double) bins[i]; } else output[i] = 100.0; } break; case MFDouble: for (i = 0; i < header.ItemNum; i++) { if (header.Swap != 1) MFSwapLongWord(((double *) items) + i); if (CMmathEqualValues(((double *) items)[i], header.Missing.Float) == true) output[i] = outHeader.Missing.Float; else if (bins[i] > 0) { value = (double) (((double *) items)[i]); bin = (int) floor((double) (binNum - 1) * (value - min[i]) / (max[i] - min[i])); output[i] = 100.0 * (double) bins[bin * header.ItemNum + i] / (double) bins[i]; } else output[i] = 100.0; } break; } strcpy(outHeader.Date, header.Date); if (MFdsHeaderWrite(&outHeader, outFile) == CMsucceeded) { CMmsgPrint(CMmsgSysError, "Output writing error in: %s:%d", __FILE__, __LINE__); goto Stop; } if ((int) fwrite(output, sizeof(float), outHeader.ItemNum, outFile) != outHeader.ItemNum) { CMmsgPrint(CMmsgSysError, "Output reading error in: %s:%d", __FILE__, __LINE__); goto Stop; } } if (ferror (inFile) != 0) { CMmsgPrint(CMmsgSysError, "Input file reading error in: %s %d", __FILE__, __LINE__); goto Stop; } ret = CMsucceeded; } Stop: if (items != (void *) NULL) free(items); if (max != (double *) NULL) free(max); if (min != (double *) NULL) free(min); if (inFile != (FILE *) NULL) fclose(inFile); if (outFile != stdout) fclose(outFile); return (ret); }