DBInt RGlibDataStream2RGIS(DBObjData *outData, DBObjData *tmplData, FILE *inFile) { DBInt layerID = 0, itemSize; DBPosition pos; DBFloat val; void *data = (void *) NULL; MFVarHeader_t header; DBObjRecord *record; switch (tmplData->Type()) { case DBTypeVectorPoint: { DBInt itemID; DBDate date; DBObjTable *itemTable = outData->Table(DBrNItems); DBObjTableField *idField = new DBObjTableField("ItemID", DBTableFieldInt, "%6d", sizeof(DBInt), false); DBObjTableField *dateField = new DBObjTableField("Date", DBTableFieldDate, "%s", sizeof(DBDate), false); DBObjTableField *valField; DBVPointIF *pntIF = new DBVPointIF(tmplData); itemTable->AddField(idField); itemTable->AddField(dateField); while (MFVarReadHeader(&header, inFile)) { if (header.ItemNum != pntIF->ItemNum()) { CMmsgPrint(CMmsgUsrError, "Error: Datastream inconsistency %d %d!", header.ItemNum, pntIF->ItemNum()); return (DBFault); } if (data == (void *) NULL) { itemSize = MFVarItemSize(header.DataType); if ((data = (void *) realloc(data, header.ItemNum * itemSize)) == (void *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s %d", __FILE__, __LINE__); return (DBFault); } switch (header.DataType) { case MFByte: valField = new DBObjTableField("Value", DBTableFieldInt, "%2d", sizeof(char), false); case MFShort: valField = new DBObjTableField("Value", DBTableFieldInt, "%4d", sizeof(DBShort), false); case MFInt: valField = new DBObjTableField("Value", DBTableFieldInt, "%8d", sizeof(DBInt), false); case MFFloat: valField = new DBObjTableField("Value", DBTableFieldFloat, "%8.2f", sizeof(DBFloat4), false); case MFDouble: valField = new DBObjTableField("Value", DBTableFieldFloat, "%8.2f", sizeof(DBFloat), false); } itemTable->AddField(valField); } if ((int) fread(data, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Error: Data stream read in: %s %d", __FILE__, __LINE__); return (DBFault); } for (itemID = 0; itemID < header.ItemNum; ++itemID) { record = itemTable->Add(header.Date); date.Set(header.Date); idField->Int(record, itemID); dateField->Date(record, date); /* decDateField->Float (record,date); */ switch (header.DataType) { case MFByte: valField->Int(record, ((char *) data)[itemID]); break; case MFShort: valField->Int(record, ((short *) data)[itemID]); break; case MFInt: valField->Int(record, ((int *) data)[itemID]); break; case MFFloat: valField->Float(record, ((float *) data)[itemID]); break; case MFDouble: valField->Float(record, ((double *) data)[itemID]); break; } } } delete pntIF; } break; case DBTypeGridContinuous: case DBTypeGridDiscrete: { DBGridIF *gridIF = new DBGridIF(outData); while (MFVarReadHeader(&header, inFile)) { if (header.ItemNum != gridIF->RowNum() * gridIF->ColNum()) { CMmsgPrint(CMmsgUsrError, "Error: Datastream inconsistency!"); return (DBFault); } if (layerID == 0) { itemSize = MFVarItemSize(header.DataType); if ((data = (void *) realloc(data, header.ItemNum * itemSize)) == (void *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s %d", __FILE__, __LINE__); return (DBFault); } record = gridIF->Layer(layerID); gridIF->RenameLayer(header.Date); } else record = gridIF->AddLayer(header.Date); switch (header.DataType) { case MFByte: case MFShort: case MFInt: gridIF->MissingValue(record, header.Missing.Int); break; case MFFloat: case MFDouble: gridIF->MissingValue(record, header.Missing.Float); break; } if ((int) fread(data, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Error: Data stream read in: %s %d", __FILE__, __LINE__); return (DBFault); } for (pos.Row = 0; pos.Row < gridIF->RowNum(); ++pos.Row) for (pos.Col = 0; pos.Col < gridIF->ColNum(); ++pos.Col) { switch (header.DataType) { case MFByte: val = (DBFloat) (((char *) data)[pos.Row * gridIF->ColNum() + pos.Col]); break; case MFShort: val = (DBFloat) (((short *) data)[pos.Row * gridIF->ColNum() + pos.Col]); break; case MFInt: val = (DBFloat) (((int *) data)[pos.Row * gridIF->ColNum() + pos.Col]); break; case MFFloat: val = (DBFloat) (((float *) data)[pos.Row * gridIF->ColNum() + pos.Col]); break; case MFDouble: val = (DBFloat) (((double *) data)[pos.Row * gridIF->ColNum() + pos.Col]); break; } gridIF->Value(record, pos, val); } layerID++; } gridIF->RecalcStats(); } break; case DBTypeNetwork: { DBInt cellID; DBGridIF *gridIF = new DBGridIF(outData); DBNetworkIF *netIF = new DBNetworkIF(tmplData); while (MFVarReadHeader(&header, inFile)) { if (header.ItemNum != netIF->CellNum()) { CMmsgPrint(CMmsgUsrError, "Error: Datastream inconsistency!"); return (DBFault); } if (layerID == 0) { itemSize = MFVarItemSize(header.DataType); if ((data = (void *) realloc(data, header.ItemNum * itemSize)) == (void *) NULL) { CMmsgPrint(CMmsgSysError, "Memory allocation error in: %s %d", __FILE__, __LINE__); return (DBFault); } record = gridIF->Layer(layerID); gridIF->RenameLayer(header.Date); } else record = gridIF->AddLayer(header.Date); if ((int) fread(data, itemSize, header.ItemNum, inFile) != header.ItemNum) { CMmsgPrint(CMmsgSysError, "Error: Data stream read in: %s %d", __FILE__, __LINE__); delete netIF; return (DBFault); } for (pos.Row = 0; pos.Row < gridIF->RowNum(); ++pos.Row) for (pos.Col = 0; pos.Col < gridIF->ColNum(); ++pos.Col) gridIF->Value(record, pos, gridIF->MissingValue()); for (cellID = 0; cellID < netIF->CellNum(); ++cellID) { pos = netIF->CellPosition(netIF->Cell(cellID)); switch (header.DataType) { case MFByte: val = (DBFloat) (((char *) data)[cellID]); break; case MFShort: val = (DBFloat) (((short *) data)[cellID]); break; case MFInt: val = (DBFloat) (((int *) data)[cellID]); break; case MFFloat: val = (DBFloat) (((float *) data)[cellID]); break; case MFDouble: val = (DBFloat) (((double *) data)[cellID]); break; } gridIF->Value(record, pos, val); } layerID++; } gridIF->RecalcStats(); } break; } return (DBSuccess); }
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); }
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); }