Example #1
0
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);
}
Example #2
0
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);
}	
Example #3
0
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);
}
Example #4
0
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);
}
Example #5
0
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);
}