int main(int argc, char *argv[]) { int i, verbose = false; char *ghaasMetaDB = (char *) NULL, metaFileName[DBDataFileNameLen]; DBObjData *dbData; DBDataset *dbDataset; DBObjectLIST<DBObjMetaEntry> *metaList; DBObjMetaEntry *metaEntry; if (argc < 2) { Usage(argv[0]); return (0); } for (i = 1; i < argc; ++i) { if ((strcmp(argv[i], "-h") == 0) || (strcmp(argv[i], "--help") == 0)) { Usage(argv[0]); return (0); } else if ((strcmp(argv[i], "-V") == 0) || (strcmp(argv[i], "--verbose") == 0)) verbose = true; else if (((strcmp(argv[i], "-m") == 0) || (strcmp(argv[i], "--MetaDB") == 0)) && (argc > i + 1)) { if (++i < argc) { ghaasMetaDB = argv[i]; break; } else { Usage(argv[0]); return (0); } } } if (i == argc) i = 0; if (verbose) RGlibPauseOpen(argv[0]); if (ghaasMetaDB == (char *) NULL) { sprintf(metaFileName, "%s/GHAASMetadb", getenv("GHAAS_DIR") == NULL ? getenv("HOME") : getenv("GHAAS_DIR")); ghaasMetaDB = metaFileName; } dbDataset = new DBDataset((char *) "GHAASmetadb", ghaasMetaDB); metaList = dbDataset->MetaList(); for (; i < argc - 1; ++i) { dbData = new DBObjData(); if (dbData->Read(argv[i + 1]) == DBSuccess) { dbData->FileName(argv[i + 1]); dbDataset->Data(dbData); printf("%s\n", dbData->Name()); metaEntry = metaList->Item(dbData->Name()); metaEntry->FileName(dbData->FileName()); dbDataset->RemoveData(dbData); } delete dbData; } delete dbDataset; if (verbose) RGlibPauseClose(); return (0); }
static void _RGISGridGroupListCBK (Widget widget,RGISGrpPanel *grpPanel, XmListCallbackStruct *callData) { DBObjData *data; DBObjTable *groupTable; DBObjectLIST<DBObjTableField> *groups; DBObjTableField *group = (DBObjTableField *) NULL; XtVaGetValues (widget,XmNuserData, &data, NULL); if (data == (DBObjData *) NULL) return; if ((groupTable = data->Table (DBrNGroups)) != (DBObjTable *) NULL) { groups = groupTable->Fields (); if ((group = groups->Item (callData->item_position - 1)) != (DBObjTableField *) NULL) grpPanel->Current (group); } }
CMreturn Configure(bool shrink, bool flat, char *expStr) { size_t i; DBInt recID, layerID; DBFloat floatVal; DBObject *obj; DBObjTableField *fieldPTR; Operand = new DBMathOperand(expStr); if (Operand->Expand(Variables) == DBFault) return (CMfailed); CellSize.X = CellSize.Y = DBHugeVal; for (recID = 0; recID < Variables->ItemNum(); ++recID) { obj = Variables->Item(recID); if ((fieldPTR = Table->Field(obj->Name())) != (DBObjTableField *) NULL) continue; if ((GrdVar = (CMDgrdVariable **) realloc(GrdVar, sizeof(CMDgrdVariable *) * (VarNum + 1))) == (CMDgrdVariable **) NULL) { CMmsgPrint(CMmsgSysError, "Memory Allocation Error in: %s %d", __FILE__, __LINE__); return (CMfailed); } GrdVar[VarNum] = new CMDgrdVariable(obj->Name()); if (GrdVar[VarNum]->Configure(Table, flat) == DBFault) { for (i = 0; i <= VarNum; ++i) delete GrdVar[i]; free(GrdVar); return (CMfailed); } Extent.Expand(GrdVar[VarNum]->Extent()); floatVal = GrdVar[VarNum]->CellWidth(); if (CellSize.X > floatVal) CellSize.X = floatVal; floatVal = GrdVar[VarNum]->CellHeight(); if (CellSize.Y > floatVal) CellSize.Y = floatVal; layerID = (GrdVar[VarNum])->LayerNum(); if (LayerNum < layerID) { LayerNum = layerID; MasterVar = VarNum; } VarNum++; } for (i = 0; i < ExpNum; ++i) if (Expressions[i]->Configure(Table) == DBFault) return (CMfailed); Operand->Configure(Table->Fields()); if (shrink) for (i = 0; i < VarNum; ++i) Extent.Shrink(GrdVar[i]->Extent()); return (CMsucceeded); }
void DBVLineIF::Vertexes (DBObjRecord *lineRec,DBCoordinate *coord,DBInt vertexNum) { DBInt vertex; DBFloat length = 0; DBCoordinate *vertexes, prevCoord; DBObjRecord *dataRec = (DBObjRecord *) NULL; DBObjectLIST<DBObjRecord> *dataArrays = Data ()->Arrays (); DBRegion lineExtent, dataExtent = Data ()->Extent (); DBMathDistanceFunction distFunc = DBMathGetDistanceFunction (Data ()); prevCoord = NodeCoordFLD->Coordinate (FromNodeFLD->Record (lineRec)); lineExtent.Expand (prevCoord); if (vertexNum > 0) { if ((dataRec = dataArrays->Item (lineRec->RowID ())) == (DBObjRecord *) NULL) { if ((dataRec = new DBObjRecord (lineRec->Name (),((size_t) vertexNum) * sizeof (DBCoordinate),sizeof (DBFloat))) == (DBObjRecord *) NULL) return; dataArrays->Add (dataRec); } else dataRec->Realloc (vertexNum * sizeof (DBCoordinate)); if ((vertexes = (DBCoordinate *) dataRec->Data ()) == NULL) { CMmsgPrint (CMmsgSysError, "Memory Allocation Error in: %s %d",__FILE__,__LINE__); return; } for (vertex = 0;vertex < vertexNum;vertex++) { lineExtent.Expand (vertexes [vertex] = coord [vertex]); length += DBMathCoordinateDistance (distFunc,prevCoord,coord [vertex]); prevCoord = coord [vertex]; } } VertexesFLD->Record (lineRec,dataRec); VertexNumFLD->Int (lineRec,vertexNum); length += DBMathCoordinateDistance (distFunc,prevCoord,NodeCoordFLD->Coordinate (ToNodeFLD->Record (lineRec))); PerimeterFLD->Float (lineRec,length); lineExtent.Expand (NodeCoordFLD->Coordinate (ToNodeFLD->Record (lineRec))); ExtentFLD->Region (lineRec,lineExtent); dataExtent.Expand (lineExtent); Data ()->Extent (dataExtent); }
int DBImportARCLine (DBObjData *vecData,const char *arcCov) { FILE *inFile; DBInt arcNum, vertex, swap = DBByteOrder (DBByteOrderLITTLE), floatCov; char fileName [DBDataFileNameLen], objName [DBStringLength]; short infoHeader [50]; DBARCRecord arcRecord; DBObjTable *lines; DBObjTable *nodes; DBObjectLIST<DBObjRecord> *data; DBObjRecord *lineRec, *nodeRec, *dataRec; DBRegion dataExtent = vecData->Extent (), itemExtent; DBObjTableField *fromNodeFLD; DBObjTableField *toNodeFLD; DBObjTableField *leftPolyFLD; DBObjTableField *rightPolyFLD; DBObjTableField *vertexesFLD; DBObjTableField *vertexNumFLD; DBObjTableField *extentFLD; DBObjTableField *coordFLD; DBObjTableField *linkNumFLD; DBCoordinate *vertexes, nodeCoord; DBFloat4 floatVAR [2]; switch (vecData->Type ()) { case DBTypeVectorLine: lines = vecData->Table (DBrNItems); break; case DBTypeVectorPolygon: lines = vecData->Table (DBrNContours); break; default: CMmsgPrint (CMmsgAppError, "Invalide Vector Data Type in: %s %d",__FILE__,__LINE__); return (DBFault); } fromNodeFLD = lines->Field (DBrNFromNode); toNodeFLD = lines->Field (DBrNToNode); leftPolyFLD = lines->Field (DBrNLeftPoly); rightPolyFLD= lines->Field (DBrNRightPoly); vertexesFLD = lines->Field (DBrNVertexes); vertexNumFLD= lines->Field (DBrNVertexNum); extentFLD = lines->Field (DBrNRegion); nodes = vecData->Table (DBrNNodes); coordFLD = nodes->Field (DBrNCoord); linkNumFLD = nodes->Field (DBrNLinkNum); data = vecData->Arrays (); sprintf (fileName,"%s/arc",arcCov); if (access (fileName,R_OK) == DBFault) sprintf (fileName,"%s/arc.adf",arcCov); if ((inFile = fopen (fileName,"r")) == NULL) { CMmsgPrint (CMmsgSysError, "File Opening Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (fread (infoHeader,sizeof (short),50,inFile) != 50) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } arcNum = 0; for (lineRec = lines->First ();arcRecord.Read (inFile,swap) != DBFault;lineRec = lines->Next ()) { if (lineRec == NULL) { sprintf (objName,"Line: %5d",arcRecord.ID () + 1); if ((lineRec = lines->Add (objName)) == (DBObjRecord *) NULL) return (DBFault); } else DBPause ((++arcNum * 100) / lines->ItemNum ()); floatCov = arcRecord.RecordLength () - 12 == arcRecord.NumOfPnts () * (DBInt) sizeof (float) ? true : false; while (arcRecord.FromNode () > nodes->ItemNum ()) { sprintf (objName,"Node: %5d",nodes->ItemNum () + 1); nodes->Add (objName); if ((nodeRec = nodes->Item ()) == NULL) return (DBFault); linkNumFLD->Int (nodeRec,0); } if ((nodeRec = nodes->Item (arcRecord.FromNode () - 1)) == (DBObjRecord *) NULL) { CMmsgPrint (CMmsgAppError, "Node Not Found in: %s %d",__FILE__,__LINE__); return (DBFault); } if (floatCov) { if (fread (floatVAR,sizeof (floatVAR),1,inFile) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) { DBByteOrderSwapWord (floatVAR); DBByteOrderSwapWord (floatVAR + 1); } nodeCoord.X = (DBFloat) floatVAR [0]; nodeCoord.Y = (DBFloat) floatVAR [1]; } else { if (fread (&nodeCoord,sizeof (DBCoordinate),1,inFile) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) nodeCoord.Swap (); } coordFLD->Coordinate (nodeRec,nodeCoord); fromNodeFLD->Record (lineRec,nodeRec); if (leftPolyFLD != (DBObjTableField *) NULL) leftPolyFLD->Record (lineRec,arcRecord.LeftPoly ()); if (rightPolyFLD != (DBObjTableField *) NULL) rightPolyFLD->Record (lineRec,arcRecord.RightPoly ()); itemExtent.LowerLeft = nodeCoord; itemExtent.UpperRight = nodeCoord; linkNumFLD->Int (nodeRec,linkNumFLD->Int (nodeRec) + 1); if (arcRecord.NumOfPnts () > 2) { if ((dataRec = data->Item (lineRec->RowID ())) == (DBObjRecord *) NULL) { if ((dataRec = new DBObjRecord ("LineData",0,sizeof (DBFloat))) == (DBObjRecord *) NULL) return (DBFault); data->Add (dataRec); } dataRec->Realloc ((arcRecord.NumOfPnts () - 2) * sizeof (DBCoordinate)); if ((vertexes = (DBCoordinate *) dataRec->Data ()) == NULL) { CMmsgPrint (CMmsgSysError, "Memory Allocation Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (floatCov) for (vertex = 0;vertex < arcRecord.NumOfPnts () - 2;++vertex) { if (fread (floatVAR,sizeof (floatVAR),1,inFile) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) { DBByteOrderSwapWord (floatVAR); DBByteOrderSwapWord (floatVAR + 1); } vertexes [vertex].X = (DBFloat) floatVAR [0]; vertexes [vertex].Y = (DBFloat) floatVAR [1]; dataExtent.Expand (vertexes [vertex]); itemExtent.Expand (vertexes [vertex]); } else for (vertex = 0;vertex < arcRecord.NumOfPnts () - 2;++vertex) { if (fread (vertexes + vertex,sizeof (DBCoordinate),1,inFile) != 1) { CMmsgPrint (CMmsgSysError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) vertexes [vertex].Swap (); dataExtent.Expand (vertexes [vertex]); itemExtent.Expand (vertexes [vertex]); } vertexesFLD->Record (lineRec,dataRec); } else vertexesFLD->Record (lineRec,(DBObjRecord *) NULL); vertexNumFLD->Int (lineRec,arcRecord.NumOfPnts () - 2); while (arcRecord.ToNode () > nodes->ItemNum ()) { sprintf (objName,"Node: %5d",nodes->ItemNum () + 1); nodes->Add (objName); if ((nodeRec = nodes->Item ()) == NULL) return (DBFault); linkNumFLD->Int (nodeRec,0); } if ((nodeRec = nodes->Item (arcRecord.ToNode () - 1)) == (DBObjRecord *) NULL) { CMmsgPrint (CMmsgAppError, "Node Not Found in: %s %d",__FILE__,__LINE__); return (DBFault); } if (floatCov) { if (fread (floatVAR,sizeof (floatVAR),1,inFile) != 1) { CMmsgPrint (CMmsgAppError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) { DBByteOrderSwapWord (floatVAR); DBByteOrderSwapWord (floatVAR + 1); } nodeCoord.X = (DBFloat) floatVAR [0]; nodeCoord.Y = (DBFloat) floatVAR [1]; } else { if (fread (&nodeCoord,sizeof (DBCoordinate),1,inFile) != 1) { CMmsgPrint (CMmsgAppError, "File Reading Error in: %s %d",__FILE__,__LINE__); return (DBFault); } if (swap) nodeCoord.Swap (); } itemExtent.Expand (nodeCoord); coordFLD->Coordinate (nodeRec,nodeCoord); linkNumFLD->Int (nodeRec,linkNumFLD->Int (nodeRec) + 1); toNodeFLD->Record (lineRec,nodeRec); extentFLD->Region (lineRec,itemExtent); } fclose (inFile); vertexesFLD->RecordProp ((DBInt) sizeof (DBFloat)); vecData->Extent (dataExtent); vecData->Projection (DBMathGuessProjection (dataExtent)); return (DBSuccess); }
int main (int argc,char **argv) { int argPos, argNum = argc; char *metaDB = (char *) NULL; int spin = true, progress = true; const char *modes [] = { (char *) "yes", (char *) "no", NULL }; int codes [] = { true, false }; Widget mainForm; RGISWorkspace *workspace; for (argPos = 1;argPos < argNum; ) { if (CMargTest (argv [argPos],"-m","--metadb")) { if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) { CMmsgPrint (CMmsgUsrError, "Missing metadb argument!"); return (CMfailed); } metaDB = argv [argPos]; if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) break; continue; } if (CMargTest (argv [argPos],"-p","--progress")) { if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing progress mode!"); return (CMfailed); } if ((progress = CMoptLookup (modes,argv [argPos],true)) == DBFault) { CMmsgPrint (CMmsgUsrError,"Invalid progress mode!"); return (CMfailed); } progress = codes [progress]; if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) break; continue; } if (CMargTest (argv [argPos],"-s","--spin")) { if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing spin mode!"); return (CMfailed); } if ((spin = CMoptLookup (modes,argv [argPos],true)) == DBFault) { CMmsgPrint (CMmsgUsrError,"Invalid spin mode!"); return (CMfailed); } spin = codes [spin]; if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) break; continue; } if (CMargTest (argv [argPos],"-P","--planet")) { int planet; const char *planets [] = { "Earth", "Mars", "Venus", NULL }; DBFloat radius [] = { 6371.2213, 6371.2213 * 0.53264, 6371.2213 * 0.94886 }; if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing planet!"); return (CMfailed); } if ((planet = CMoptLookup (planets,argv [argPos],true)) == DBFault) { if (sscanf (argv [argPos],"%lf",radius) != 1) { CMmsgPrint (CMmsgUsrError,"Invalid planet!"); return (CMfailed); } planet = 0; } DBMathSetGlobeRadius (radius [planet]); if ((argNum = CMargShiftLeft (argPos,argv,argc)) <= argPos) break; continue; } if (CMargTest (argv [argPos],"-h","--help")) { CMmsgPrint (CMmsgInfo, "rgis [options]"); CMmsgPrint (CMmsgInfo, " -m, --metadb [meta database]"); CMmsgPrint (CMmsgInfo, " -p, --progress [yes|no]"); CMmsgPrint (CMmsgInfo, " -s, --spin [yes|no]"); CMmsgPrint (CMmsgInfo, " -P, --planet [Earth|Mars|Venus|radius]"); CMmsgPrint (CMmsgInfo, " -h, --help"); return (DBSuccess); } if ((argv [argPos][0] == '-') && (strlen (argv [argPos]) > 1)) { CMmsgPrint (CMmsgUsrError, "Unknown option: %s!",argv [argPos]); return (DBFault); } argPos++; } workspace = new RGISWorkspace; mainForm = UIInitialize ((char *) "GHAAS V2.2 - RiverGIS",(char *) "GHAASrgis",(char *) "RGISMain.html", RGISMainMenu,(void *) workspace,&argc,argv,720,500,(bool) spin,(bool) progress); UIDataset ((char *) "GHAASrgis",metaDB); XtVaSetValues (mainForm,XmNkeyboardFocusPolicy, XmPOINTER, NULL); workspace->Initialize (mainForm); if (argNum > 1) { DBDataset *dataset; DBObjData *data; DBObjectLIST<DBObjMetaEntry> *metaList; DBObjMetaEntry *metaEntry; dataset = UIDataset (); metaList = dataset->MetaList (); for (argPos = 1;argPos < argNum; ++argPos) { data = new DBObjData (); if (data->Read (argv [argPos]) == DBSuccess) { workspace->CurrentData (data); metaEntry = metaList->Item (data->Name ()); metaEntry->FileName (data->FileName ()); } else delete data; } } while (UILoop ()); delete UIDataset (); return (DBSuccess); }
int main (int argc,char *argv []) { int argPos, argNum = argc, numGrpNames = 0, i = 0; char **groupnames, *rename = (char *) NULL, *tableName = (char *) NULL; bool ascii = false; FieldOptions *head = (FieldOptions *) NULL, *p = (FieldOptions *) NULL, *temp = (FieldOptions *) NULL; Groups **groups = (Groups **) NULL; FILE *outFile = (FILE *) NULL; DBObjData *inData, *outData; DBObjTable *inTable, *outTable; DBObjTableField *field; DBObjRecord *inRecord, *outRecord; DBObjectLIST<DBObjTableField> *fields; if(argc <= 2) { doHelp(false,argv[0]); return(DBSuccess); } outData = new DBObjData("Untitled", DBTypeTable); outTable = outData->Table(DBrNItems); head = new FieldOptions(BAD,"","", (FieldOptions *) NULL); groupnames = (char **) malloc(sizeof(char *)); for (argPos = 1;argPos < argNum;) { if (CMargTest(argv[argPos],"-f","--field")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing operation and field after -f!"); return (CMfailed); } if(!strcmp(argv[argPos],"pct")) { if (argNum <= argPos + 2) { CMmsgPrint (CMmsgUsrError,"Missing field and/or percentage after -f pct!"); return (CMfailed); } p = FOHierarchy(argv[argPos],argv[argPos+1],rename,atoi(argv[argPos+2]),head); argNum = CMargShiftLeft(argPos,argv,argNum); argNum = CMargShiftLeft(argPos,argv,argNum); } else if(!strcmp(argv[argPos],"num")) { char *num = new char[4]; strcpy(num,"Num"); p = FOHierarchy(argv[argPos],num,rename,-1,head); } else { if (argNum < argPos + 1) { CMmsgPrint (CMmsgUsrError,"Missing operation or field after -f %s!",argv[argPos]); return (CMfailed); } p = FOHierarchy(argv[argPos],argv[argPos+1],rename,-1,head); argNum = CMargShiftLeft(argPos,argv,argNum); } p->setPrint(true); rename = (char *) NULL; if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-g","--group")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing groupname!"); return (CMfailed); } if((groupnames = (char **) realloc(groupnames,(numGrpNames + 1) * sizeof(char *))) == (char **) NULL) { CMmsgPrint (CMmsgSysError, "Memory allocation error in: %s %d",__FILE__,__LINE__); return(DBFault); } groupnames[numGrpNames] = argv[argPos]; numGrpNames++; if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-h","--help")) { argNum = CMargShiftLeft (argPos,argv,argNum); if(CMargTest(argv[argPos],"e","extend")) { doHelp(true,argv[0]); argNum = CMargShiftLeft (argPos,argv,argNum); } else doHelp(false,argv[0]); } if (CMargTest(argv[argPos],"-c","--ascii")) { ascii = true; if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-a","--table")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing table name!"); return (CMfailed); } tableName = argv[argPos]; if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-r","--rename")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing field after -r!"); return (CMfailed); } rename = argv[argPos]; if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-o","--output")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing output filename!"); return (CMfailed); } if((outFile = fopen(argv[argPos],"w")) == (FILE *) NULL) { CMmsgPrint (CMmsgUsrError,"Cannot open file %s",argv[argPos]); return (CMfailed); } if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-t","--title")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing title!"); return (CMfailed); } outData->Name(argv[argPos]); if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-s","--subject")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing subject!"); return (CMfailed); } outData->Document(DBDocSubject,argv[argPos]); if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-d","--domain")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing domain!"); return (CMfailed); } outData->Document(DBDocGeoDomain,argv[argPos]); if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if (CMargTest(argv[argPos],"-v","--version")) { if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) { CMmsgPrint (CMmsgUsrError,"Missing version!"); return (CMfailed); } outData->Document(DBDocVersion,argv[argPos]); if ((argNum = CMargShiftLeft(argPos,argv,argNum)) <= argPos) break; continue; } if ((argv[argPos][0] == '-') && (strlen (argv[argPos]) > 1)) { CMmsgPrint (CMmsgUsrError, "Unknown option: %s!",argv[argPos]); return (CMfailed); } argPos++; } if(outFile == (FILE *) NULL) outFile = stdout; if(head->next == (FieldOptions *) NULL) return(DBSuccess); inData = new DBObjData(); if ((argNum > 1) && (strcmp(argv[1],"-") != 0)) inData->Read(argv[1]); else inData->Read(stdin); if (outData->Name() == (char *) NULL) outData->Name("Untitled"); if (outData->Document(DBDocSubject) == (char *) NULL) outData->Document(DBDocSubject,inData->Document(DBDocSubject)); if (outData->Document(DBDocGeoDomain) == (char *) NULL) outData->Document(DBDocGeoDomain,inData->Document(DBDocGeoDomain)); if (outData->Document(DBDocVersion) == (char *) NULL) outData->Document(DBDocVersion,inData->Document(DBDocVersion)); if(tableName == (char *) NULL) tableName = DBrNItems; if((inTable = inData->Table(tableName)) == (DBObjTable *) NULL) { CMmsgPrint (CMmsgUsrError,"Invalid table!"); delete inData; return (CMfailed); } if((groups = (Groups **) malloc(numGrpNames * sizeof(Groups *))) == (Groups **) NULL) { CMmsgPrint (CMmsgSysError, "Memory allocation error in: %s %d",__FILE__,__LINE__); return(DBFault); } for(i = 0; i < numGrpNames; i++) { if((field = inTable->Field(groupnames[i])) == (DBObjTableField *) NULL) { CMmsgPrint (CMmsgUsrError, "Invalid group name: %s",groupnames[i]); return (CMfailed); } if(DBTableFieldIsCategory(field)) { groups[i] = new Groups(); groups[i]->srcFLD = field; groups[i]->dstFLD = new DBObjTableField(*field); outTable->AddField(groups[i]->dstFLD); // CMmsgPrint (CMmsgUsrError, "Added Group: %s",groups[i]->dstFLD->Name()); } else CMmsgPrint (CMmsgUsrError, "Group %s is not Category!",groupnames[i]); } delete groupnames; p = head->next; temp = head; while(p->next) { FieldOptions *duplicate = (FieldOptions *) NULL, *prev = p; if(!p->getPrint() && FLDExists(p,p->getOldName(),p->getFunc(),&duplicate)) { temp->next = p->next; delete p; p = temp->next; continue; } while(FLDExists(prev,prev->getOldName(),prev->getFunc(),&prev,&duplicate) && !duplicate->getPrint()) { prev->next = duplicate->next; delete duplicate; } temp = p; p = p->next; } // p = head->next; // while(p) { CMmsgPrint (CMmsgUsrError, "Added: o:%s n:%s p:",p->getOldName(),p->getNewName()); if(p->getPrint()) CMmsgPrint (CMmsgUsrError, "true"); else CMmsgPrint (CMmsgUsrError, "false"); p = p->next; } fields = inTable->Fields(); p = head->next; while(p) { field = fields->Item (p->getOldName()); if (p->getFunc() == MIN || p->getFunc() == MAX) p->field = new DBObjTableField(p->getNewName(),field->Type(),field->Format(),field->Length()); else if(p->getFunc() == NUM || p->getFunc() == NONNULL) p->field = new DBObjTableField(p->getNewName(), DBTableFieldInt, DBHiddenField, sizeof (DBInt)); else p->field = new DBObjTableField(p->getNewName(), DBTableFieldFloat, DBHiddenField, sizeof(DBFloat)); if(p->getFunc() != NUM && p->getFunc() != NONNULL) { // if ((field = inTable->Field(p->getOldName())) == (DBObjTableField *) NULL) if (field == (DBObjTableField *) NULL) { CMmsgPrint (CMmsgUsrError, "Invalid field name: %s",p->getOldName()); return(DBFault); } if (!DBTableFieldIsNumeric(field)) { CMmsgPrint (CMmsgUsrError, "Field is not Numeric: %s",p->getOldName()); return(DBFault); } } outTable->AddField(p->field); p = p->next; } // MAKE SURE TO TEST FOR SPEED BY DECLARING INTS OUTSIDE OF FOR LOOPS!!! for (int inRecID = 0;inRecID < inTable->ItemNum();++inRecID) { inRecord = inTable->Item(inRecID); if ((outRecord = FindMatch(inRecord, outTable,(const Groups**) groups, numGrpNames)) != (DBObjRecord *) NULL) { p = head->next; while(p) { field = fields->Item (p->getOldName()); switch(p->getFunc()) { default: break; case NUM: p->field->Int(outRecord,p->field->Int(outRecord) + 1); break; case NONNULL: if (p->isInt()) { if (field->Int(inRecord) != field->IntNoData()) p->field->Int(outRecord,p->field->Int(outRecord) + 1); } else { if (!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) p->field->Int(outRecord,p->field->Int(outRecord) + 1); } break; case MIN: if (p->isInt()) { if(field->Int(inRecord) != field->IntNoData()) { if (p->field->Int(outRecord) != p->field->IntNoData()) { if (field->Int(inRecord) < p->field->Int(outRecord)) p->field->Int(outRecord,field->Int(inRecord)); } else { p->field->Int(outRecord,field->Int(inRecord)); } } } else { if (!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) { if (!CMmathEqualValues(p->field->Float(inRecord),p->field->FloatNoData())) { if (field->Float(inRecord) < p->field->Float(outRecord)) p->field->Float(outRecord,field->Float(inRecord)); } else { p->field->Float(outRecord,field->Float(inRecord)); } } } break; case MAX: if (p->isInt()) { if(field->Int(inRecord) != field->IntNoData()) { if (p->field->Int(outRecord) != p->field->IntNoData()) { if (field->Int(inRecord) > p->field->Int(outRecord)) p->field->Int(outRecord,field->Int(inRecord)); } else { p->field->Int(outRecord,field->Int(inRecord)); } } } else { if (!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) { if (!CMmathEqualValues(p->field->Float(inRecord),p->field->FloatNoData())) { if (field->Float(inRecord) > p->field->Float(outRecord)) p->field->Float(outRecord,field->Float(inRecord)); } else { p->field->Float(outRecord,field->Float(inRecord)); } } } break; case SUM: if (p->isInt()) { if(field->Int(inRecord) != field->IntNoData()) p->field->Int(outRecord,p->field->Int(outRecord) + field->Int(inRecord)); } else { if (!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) p->field->Float(outRecord,p->field->Float(outRecord) + field->Float(inRecord)); } break; case DEV: case PCT: case MED: p->tailVal = p->tailVal->next = new Values(); p->tailVal->val = field->Float(inRecord); p->tailVal->next = 0; break; case MOD: Values *cur = p->getHead(); while(cur->next && !CMmathEqualValues(cur->val,field->Float(inRecord))) cur = cur->next; if(cur->next) cur->occur++; else { p->tailVal->val = field->Float(inRecord); p->tailVal->occur = 1; p->tailVal = p->tailVal->next = new Values(); } break; } p = p->next; } } else { outRecord = outTable->Add(); for(i = 0; i < numGrpNames; i++) { switch (groups[i]->srcFLD->Type()) { default: case DBTableFieldString: groups[i]->dstFLD->String(outRecord,groups[i]->srcFLD->String(inRecord)); break; case DBTableFieldInt: groups[i]->dstFLD->Int(outRecord,groups[i]->srcFLD->Int(inRecord)); break; } } p = head->next; while(p) { field = fields->Item (p->getOldName()); switch(p->getFunc()) { default: case BAD: break; case NUM: p->setInt(); p->field->Int(outRecord,1); break; case NONNULL: if (field->Type() == DBTableFieldInt) { p->setInt(); if (field->Int(inRecord) != field->IntNoData()) p->field->Int(outRecord,1); else p->field->Int(outRecord,0); } else { if (!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) p->field->Int(outRecord,1); else p->field->Int(outRecord,0); } break; case MIN: if (field->Type() == DBTableFieldInt) { p->setInt(); if (field->Int(inRecord) != field->IntNoData()) p->field->Int(outRecord,field->Int(inRecord)); } else { if(!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) p->field->Float(outRecord,field->Float(inRecord)); } break; case MAX: if (field->Type() == DBTableFieldInt) { p->setInt(); if (field->Int(inRecord) != field->IntNoData()) p->field->Int(outRecord,field->Int(inRecord)); } else { if(!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) p->field->Float(outRecord,field->Float(inRecord)); } break; case SUM: if (field->Type() == DBTableFieldInt) { p->setInt(); if (field->Int(inRecord) != field->IntNoData()) p->field->Int(outRecord,field->Int(inRecord)); else p->field->Int(outRecord,0); } else { if(!CMmathEqualValues(field->Float(inRecord),field->FloatNoData())) p->field->Float(outRecord,field->Float(inRecord)); else p->field->Float(outRecord,0.0); } break; case DEV: case PCT: case MED: p->tailVal = p->tailVal->next = new Values(); p->tailVal->val = field->Float(inRecord); p->tailVal->next = 0; break; case MOD: p->tailVal->val = field->Float(inRecord); p->tailVal->occur = 1; p->tailVal = p->tailVal->next = new Values(); break; } p = p->next; } } } for(int outRecID = 0; outRecID < outTable->ItemNum();++outRecID) { outRecord = outTable->Item(outRecID); p = head->next; FieldOptions *sum, *num; DBFloat mod; int occurrance; float i; bool mult; Values *cur; while(p) { field = fields->Item (p->getOldName()); switch(p->getFunc()) { case AVG: if((FLDExists(head,p->getOldName(),SUM,&sum)) && (FLDExists(head,p->getOldName(),NONNULL,&num))) p->field->Float(outRecord,sum->field->Float(outRecord) / (DBFloat) (num->field->Int(outRecord))); else CMmsgPrint (CMmsgUsrError, "Program Error! Could not find SUM or NONNULL in linked list! Please contact the GHAAS developers group!"); break; case NAVG: if((FLDExists(head,p->getOldName(),SUM,&sum)) && (FLDExists(head,"NUM",NUM,&num))) p->field->Float(outRecord,sum->field->Float(outRecord) / (DBFloat) (num->field->Int(outRecord))); else CMmsgPrint (CMmsgUsrError, "Program Error! Could not find SUM or NUM in linked list! Please contact the GHAAS developers group!"); break; case PCT: case MED: i = (float) (inTable->ItemNum() * p->getHead()->occur * 0.01) - 1; cur = p->getHead()->next; while(i > 0) { cur = cur->next; i--; } p->field->Float(outRecord,(cur->val + cur->next->val) / 2); break; case MOD: mod = 0.0; occurrance = 0; mult = false; cur = p->getHead(); while(cur) { if(cur->occur > occurrance) { mod = cur->val; occurrance = cur->occur; mult = false; } else if(cur->occur == occurrance) mult = true; cur = cur->next; } if(mult) CMmsgPrint (CMmsgUsrError, "** Warning, multiple answers for MOD, listing first found!"); p->field->Float(outRecord,mod); break; default: break; } p = p->next; } } p = head->next; while(p) { if(p->getFunc() == DEV) { FieldOptions *avg, *num; field = fields->Item (p->getOldName()); if((FLDExists(head,p->getOldName(),AVG,&avg)) && (FLDExists(head,"NUM",NUM,&num))) { for(int outRecID = 0; outRecID < outTable->ItemNum();++outRecID) { outRecord = outTable->Item(outRecID); DBFloat sum = 0.0; Values *cur = p->getHead()->next; while(cur) { // sum += (DBFloat) (pow((cur->val - avg->field->Float(outRecord)),2)); DBFloat add = (cur->val - avg->field->Float(outRecord)); sum += (DBFloat) (add * add); cur = cur->next; } sum = sqrt(sum /(DBFloat) num->field->Int(outRecord)); p->field->Float(outRecord,sum); } } else CMmsgPrint (CMmsgUsrError, "Program Error! Could not find AVG or NUM in linked list! Please contact the GHAAS developers group!"); } p = p->next; } // DELETE unnecessary fields which were for temp storage fields = outTable->Fields(); p = head->next; while(p) { if(!p->getPrint()) outTable->DeleteField(fields->Item(p->getNewName())); p = p->next; } p = head->next; while(p) { if ((strcmp(p->field->Format(),DBHiddenField) == 0) && p->getPrint()) { if(p->isInt()) { int maxval = 0; for(int outRecID = 0; outRecID < outTable->ItemNum();++outRecID) { int val = p->field->Int(outTable->Item(outRecID)); if (maxval < val) maxval = val; else if (maxval < -val) maxval = -val; } p->field->Format(DBMathIntAutoFormat(maxval)); } else { float maxval = 0.0; for(int outRecID = 0; outRecID < outTable->ItemNum();++outRecID) { float val = p->field->Float(outTable->Item(outRecID)); if (maxval < val) maxval = val; else if (maxval < -val) maxval = -val; } p->field->Format(DBMathFloatAutoFormat(maxval)); } } // CMmsgPrint (CMmsgUsrError, "Format(%s)%d,%d: '%s'",p->getFuncName(),p->isInt(),p->getPrint(),p->field->Format()); p = p->next; } DBObjectLIST<DBObjTableField> *list = new DBObjectLIST<DBObjTableField> ("Sorted Field List"); for(i = 0; i < numGrpNames; i++) list->Add(groups[i]->dstFLD); outTable->ListSort(list); if (ascii) DBExportASCIITable(outTable,outFile); else outData->Write(outFile); /* CLEANUP ************************************************/ if(outFile != stdout) fclose(outFile); for(i = 0; i < numGrpNames; i++) delete groups[i]->dstFLD; delete groups; p = head; while(p) { head = head->next; delete p; p = head; } return(DBSuccess); }