summaryrefslogtreecommitdiffstats
path: root/tksao
diff options
context:
space:
mode:
authorWilliam Joye <joye@bokhara.cfa.harvard.edu>2018-08-27 18:57:12 (GMT)
committerWilliam Joye <joye@bokhara.cfa.harvard.edu>2018-08-27 18:57:12 (GMT)
commit160e5a1a599f459d299ed20cda42c2323d1dea27 (patch)
tree8fb74954146e49180d1928df08a7d5bfd0ab9c29 /tksao
parent31a570efb6179e84e2f79cc0ed838865e15c31ec (diff)
downloadblt-160e5a1a599f459d299ed20cda42c2323d1dea27.zip
blt-160e5a1a599f459d299ed20cda42c2323d1dea27.tar.gz
blt-160e5a1a599f459d299ed20cda42c2323d1dea27.tar.bz2
plug memory leaks
Diffstat (limited to 'tksao')
-rw-r--r--tksao/frame/fitsimage.C16
-rw-r--r--tksao/frame/frmarkerxml.C261
-rw-r--r--tksao/frame/polygon.C3
3 files changed, 172 insertions, 108 deletions
diff --git a/tksao/frame/fitsimage.C b/tksao/frame/fitsimage.C
index 2d3aa5f..1ee2235 100644
--- a/tksao/frame/fitsimage.C
+++ b/tksao/frame/fitsimage.C
@@ -1136,8 +1136,10 @@ void FitsImage::initWCS(FitsHead* hd)
delete wcsState_;
wcsState_ = new WCSState();
+ astBegin;
wcsSystem(ast_,wcsState_->wcsSystem_);
wcsSkyFrame(ast_,wcsState_->wcsSkyFrame_);
+ astEnd;
// must wait until wcsState_ is realized
wcsSizeInit();
@@ -3116,9 +3118,11 @@ void FitsImage::wcsHPXInit()
char key[] = "CTYPE1 ";
if (image_) {
const char* str = image_->getKeyword(key);
- if (str)
+ if (str) {
if (!strncmp(str+5,"HPX",3))
wcsHPX_ =1;
+ delete [] str;
+ }
}
}
@@ -3356,7 +3360,7 @@ static void fits2TAB(AstFitsChan* chan, const char* extname,
int rowlen = hdu->width();
// create fitstable
- AstFitsChan* header = astFitsChan(NULL, NULL, "");
+ AstFitsChan* header = astFitsChan(NULL, NULL, " ");
char* cards = hd->cards();
int ncards = hd->ncard();
@@ -3367,7 +3371,7 @@ static void fits2TAB(AstFitsChan* chan, const char* extname,
astPutFits(header, buf, 0);
}
- AstFitsTable* table = (AstFitsTable*)astFitsTable(header,"");
+ AstFitsTable* table = (AstFitsTable*)astFitsTable(header," ");
for (int ii=0; ii<cols; ii++) {
FitsBinColumn* col = (FitsBinColumn*)hdu->find(ii);
@@ -3425,9 +3429,10 @@ AstFrameSet* FitsImage::fits2ast(FitsHead* hd)
{
// we may have an error, just reset
astClearStatus;
+ astBegin;
// new fitschan
- AstFitsChan* chan = astFitsChan(NULL, NULL, "");
+ AstFitsChan* chan = astFitsChan(NULL, NULL, " ");
if (!astOK || chan == AST__NULL)
return NULL;
@@ -3479,5 +3484,8 @@ AstFrameSet* FitsImage::fits2ast(FitsHead* hd)
if (!wcsInv_)
internalError("Warning: the WCS has no defined inverse. Some functionality may not be available.");
+ astExport(frameSet);
+ astEnd;
+
return frameSet;
}
diff --git a/tksao/frame/frmarkerxml.C b/tksao/frame/frmarkerxml.C
index e689b4e..c1074e3 100644
--- a/tksao/frame/frmarkerxml.C
+++ b/tksao/frame/frmarkerxml.C
@@ -26,97 +26,117 @@ void Base::xmlParse(istream& str)
{
xmlTextReaderPtr reader =
xmlReaderForIO(xmlRead, xmlClose, (void*)(&str), "", NULL, 0);
- if (reader) {
- char** cols=NULL;
- int colcnt=0;
-
- int id[128];
- char* unit[128];
- char* ref[128];
- char* axis[128];
- char* dir[128];
- for (int ii=0; ii<128; ii++) {
- id[ii]=0;
- unit[ii]=NULL;
- ref[ii]=NULL;
- dir[ii]=NULL;
- }
- int cnt=0;
- int state=0;
-
- int ret = xmlTextReaderRead(reader);
- while (ret == 1) {
- int nodeType = xmlTextReaderNodeType(reader);
- char* key = (char*)xmlTextReaderConstName(reader);
-
- if (!strncmp(key,"VOTABLE",7) && (nodeType==1)) {
- } else if (!strncmp(key,"VOTABLE",7) && (nodeType==15)) {
- } else if (!strncmp(key,"DEFINITIONS",11) && (nodeType==1)) {
- } else if (!strncmp(key,"DEFINITIONS",11) && (nodeType==15)) {
- } else if (!strncmp(key,"COOSYS",6) && (nodeType==1)) {
- } else if (!strncmp(key,"COOSYS",6) && (nodeType==15)) {
- } else if (!strncmp(key,"RESOURCE",8) && (nodeType==1)) {
- } else if (!strncmp(key,"RESOURCE",8) && (nodeType==15)) {
- } else if (!strncmp(key,"TABLE",5) && (nodeType==1)) {
- } else if (!strncmp(key,"TABLE",5) && (nodeType==15)) {
- } else if (!strncmp(key,"FIELD",5) && (nodeType==1)) {
- xmlParseFIELD(reader,id,unit,ref,axis,dir,colcnt);
- state = 2;
- colcnt++;
- } else if (!strncmp(key,"FIELD",5) && (nodeType==15)) {
- state = 0;
- } else if (!strncmp(key,"DATA",4) && (nodeType==1)) {
- state = 0;
- } else if (!strncmp(key,"DATA",4) && (nodeType==15)) {
- } else if (!strncmp(key,"TABLEDATA",9) && (nodeType==1)) {
- state = 0;
- } else if (!strncmp(key,"TABLEDATA",9) && (nodeType==15)) {
- } else if (!strncmp(key,"TR",2) && (nodeType==1)) {
- if (cols) {
- for (int ii=0; ii<colcnt; ii++)
- if (cols[ii])
- delete [] cols[ii];
- delete [] cols;
- }
-
- cols = new char*[colcnt];
+ if (!reader) {
+ cerr << "Unable to create xmlReader" << endl;
+ return;
+ }
+
+ char** cols=NULL;
+ int colcnt=0;
+
+ int id[128];
+ char* unit[128];
+ char* ref[128];
+ char* axis[128];
+ char* dir[128];
+ for (int ii=0; ii<128; ii++) {
+ id[ii]=0;
+ unit[ii]=NULL;
+ ref[ii]=NULL;
+ axis[ii] =NULL;
+ dir[ii]=NULL;
+ }
+
+ int cnt=0;
+ int state=0;
+
+ int ret = xmlTextReaderRead(reader);
+ while (ret == 1) {
+ int nodeType = xmlTextReaderNodeType(reader);
+ char* key = (char*)xmlTextReaderConstName(reader);
+
+ if (!strncmp(key,"VOTABLE",7) && (nodeType==1)) {
+ } else if (!strncmp(key,"VOTABLE",7) && (nodeType==15)) {
+ } else if (!strncmp(key,"DEFINITIONS",11) && (nodeType==1)) {
+ } else if (!strncmp(key,"DEFINITIONS",11) && (nodeType==15)) {
+ } else if (!strncmp(key,"COOSYS",6) && (nodeType==1)) {
+ } else if (!strncmp(key,"COOSYS",6) && (nodeType==15)) {
+ } else if (!strncmp(key,"RESOURCE",8) && (nodeType==1)) {
+ } else if (!strncmp(key,"RESOURCE",8) && (nodeType==15)) {
+ } else if (!strncmp(key,"TABLE",5) && (nodeType==1)) {
+ } else if (!strncmp(key,"TABLE",5) && (nodeType==15)) {
+ } else if (!strncmp(key,"FIELD",5) && (nodeType==1)) {
+ xmlParseFIELD(reader,id,unit,ref,axis,dir,colcnt);
+ state = 2;
+ colcnt++;
+ } else if (!strncmp(key,"FIELD",5) && (nodeType==15)) {
+ state = 0;
+ } else if (!strncmp(key,"DATA",4) && (nodeType==1)) {
+ state = 0;
+ } else if (!strncmp(key,"DATA",4) && (nodeType==15)) {
+ } else if (!strncmp(key,"TABLEDATA",9) && (nodeType==1)) {
+ state = 0;
+ } else if (!strncmp(key,"TABLEDATA",9) && (nodeType==15)) {
+ } else if (!strncmp(key,"TR",2) && (nodeType==1)) {
+ if (cols) {
for (int ii=0; ii<colcnt; ii++)
- cols[ii] = NULL;
-
- cnt=0;
- } else if(!strncmp(key,"TR",2) && (nodeType==15)) {
- xmlParseTR(cols,id,unit,ref,axis,dir,colcnt);
- } else if (!strncmp(key,"TD",2) && (nodeType==1)) {
- state=1;
- } else if (!strncmp(key,"TD",2) && (nodeType==15)) {
- state=0;
- cnt++;
- } else if (!strncmp(key,"#text",5) && (nodeType==3)) {
- switch (state) {
- case 0:
- break;
- case 1:
- // td
- cols[cnt] = dupstr((char*)xmlTextReaderConstValue(reader));
- break;
- case 2:
- // field
- break;
- }
+ if (cols[ii])
+ delete [] cols[ii];
+ delete [] cols;
+ }
+
+ cols = new char*[colcnt];
+ for (int ii=0; ii<colcnt; ii++)
+ cols[ii] = NULL;
+
+ cnt=0;
+ } else if(!strncmp(key,"TR",2) && (nodeType==15)) {
+ xmlParseTR(cols,id,unit,ref,axis,dir,colcnt);
+ } else if (!strncmp(key,"TD",2) && (nodeType==1)) {
+ state=1;
+ } else if (!strncmp(key,"TD",2) && (nodeType==15)) {
+ state=0;
+ cnt++;
+ } else if (!strncmp(key,"#text",5) && (nodeType==3)) {
+ switch (state) {
+ case 0:
+ break;
+ case 1:
+ // td
+ cols[cnt] = dupstr((char*)xmlTextReaderConstValue(reader));
+ break;
+ case 2:
+ // field
+ break;
}
-
- ret = xmlTextReaderRead(reader);
}
- xmlFreeTextReader(reader);
- if (ret != 0)
- cerr << "Failed to parse xml" << endl;
- xmlCleanupParser();
- xmlMemoryDump();
+ ret = xmlTextReaderRead(reader);
+ }
+ xmlFreeTextReader(reader);
+ if (ret != 0)
+ cerr << "Failed to parse xml" << endl;
+
+ xmlCleanupParser();
+ xmlMemoryDump();
+
+ if (cols) {
+ for (int ii=0; ii<colcnt; ii++)
+ if (cols[ii])
+ delete [] cols[ii];
+ delete [] cols;
+ }
+ for (int ii=0; ii<128; ii++) {
+ if (unit[ii])
+ delete unit[ii];
+ if (ref[ii])
+ delete ref[ii];
+ if (axis[ii])
+ delete axis[ii];
+ if (dir[ii])
+ delete dir[ii];
}
- else
- cerr << "Unable to create xmlReader" << endl;
}
void Base::xmlParseFIELD(void* rr, int* id, char** unit,
@@ -605,6 +625,8 @@ void Base::xmlParseTR(char** cols, int* id, char** unit, char** ref,
createPolygonCmd(*list, fill,
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (list)
+ delete list;
}
else if (STRCMP(shape, "line", 4)) {
int arrow1 =1;
@@ -643,6 +665,8 @@ void Base::xmlParseTR(char** cols, int* id, char** unit, char** ref,
createSegmentCmd(*list,
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (list)
+ delete list;
}
else if (STRCMP(shape, "text", 4)) {
int rotate = 1;
@@ -730,66 +754,85 @@ void Base::xmlParseTR(char** cols, int* id, char** unit, char** ref,
// Annulus Regions
else if (STRCMP(shape, "annulus", 7)) {
int num = xmlCount(rv);
+ double* rr = xmlDistance(ptr, rv, num, rvsys, rvdist);
createAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format),
- num, xmlDistance(ptr, rv, num, rvsys, rvdist),
+ num, rr,
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (rr)
+ delete [] rr;
}
else if (STRCMP(shape, "ellipseannulus", 14)) {
int num = xmlCount(rv);
- createEllipseAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format),
- num, xmlDistance(ptr, rv, rv2, num, rvsys, rvdist),
+ Vector* rr =xmlDistance(ptr, rv, rv2, num, rvsys, rvdist);
+ createEllipseAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format), num, rr,
xmlAngle(ang, angsign, angoffset,
angformat, sys, sky),
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (rr)
+ delete [] rr;
}
else if (STRCMP(shape, "boxannulus", 10)) {
int num = xmlCount(rv);
- createBoxAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format),
- num, xmlDistance(ptr, rv, rv2, num, rvsys, rvdist),
+ Vector* rr = xmlDistance(ptr, rv, rv2, num, rvsys, rvdist);
+ createBoxAnnulusCmd(xmlPoint(ptr, x, y, sys, sky, format), num, rr,
xmlAngle(ang, angsign, angoffset, angformat,
sys, sky),
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (rr)
+ delete [] rr;
}
// Panda Regions
else if (STRCMP(shape, "panda", 5) || STRCMP(shape, "pie", 3)) {
int anum = xmlCount(angv);
int rnum = xmlCount(rv);
+ double* rr = xmlDistance(ptr, rv, rnum, rvsys, rvdist);
+ double* aa = xmlAngles(angv, angvsign, angvoffset, anum, angvformat, sys, sky);
createCpandaCmd(xmlPoint(ptr, x, y, sys, sky, format),
- anum, xmlAngles(angv, angvsign, angvoffset,
- anum, angvformat, sys, sky),
- rnum, xmlDistance(ptr, rv, rnum, rvsys, rvdist),
+ anum, aa, rnum, rr,
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (rr)
+ delete [] rr;
+ if (aa)
+ delete [] aa;
}
else if (STRCMP(shape, "epanda", 6)) {
int anum = xmlCount(angv);
int rnum = xmlCount(rv);
+ Vector* rr = xmlDistance(ptr, rv, rv2, rnum, rvsys, rvdist);
+ double* aa = xmlAngles(angv, angvsign, angoffset, anum, angvformat, sys, sky);
createEpandaCmd(xmlPoint(ptr, x, y, sys, sky, format),
- anum, xmlAngles(angv, angvsign, angoffset,
- anum, angvformat, sys, sky),
- rnum, xmlDistance(ptr, rv, rv2, rnum, rvsys, rvdist),
+ anum, aa, rnum, rr,
xmlAngle(ang, angsign, angoffset, angformat,
sys, sky),
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (rr)
+ delete [] rr;
+ if (aa)
+ delete [] aa;
}
else if (STRCMP(shape, "bpanda", 6)) {
int anum = xmlCount(angv);
int rnum = xmlCount(rv);
+ Vector* rr = xmlDistance(ptr, rv, rv2, rnum, rvsys, rvdist);
+ double* aa = xmlAngles(angv, angvsign, angvoffset, anum, angvformat, sys, sky);
createBpandaCmd(xmlPoint(ptr, x, y, sys, sky, format),
- anum, xmlAngles(angv, angvsign, angvoffset,
- anum, angvformat, sys, sky),
- rnum, xmlDistance(ptr, rv, rv2, rnum, rvsys, rvdist),
+ anum, aa, rnum, rr,
xmlAngle(ang, angsign, angoffset, angformat,
sys, sky),
color, dash, width, font, text, props, comment,
taglist, cblist);
+ if (rr)
+ delete [] rr;
+ if (aa)
+ delete [] aa;
}
}
@@ -893,7 +936,8 @@ Vector Base::xmlPoint(FitsImage* ptr, const char* xstr, const char* ystr,
List<Vertex>* Base::xmlVertex(FitsImage* ptr,
const char* x, const char* y,
- Coord::CoordSystem sys, Coord::SkyFrame sky, Coord::SkyFormat format)
+ Coord::CoordSystem sys, Coord::SkyFrame sky,
+ Coord::SkyFormat format)
{
List<Vertex>* list = new List<Vertex>;
@@ -928,7 +972,8 @@ double* Base::xmlDistance(FitsImage* ptr, const char* r, int cnt,
}
Vector* Base::xmlDistance(FitsImage* ptr, const char* r, const char* r2,
- int cnt, Coord::CoordSystem sys, Coord::DistFormat dist)
+ int cnt, Coord::CoordSystem sys,
+ Coord::DistFormat dist)
{
Vector* vv = new Vector[cnt];
@@ -961,18 +1006,22 @@ Vector* Base::xmlDistance(FitsImage* ptr, const char* r, const char* r2,
}
double Base::xmlAngle(const char* angle, int sign, double offset,
- Coord::AngleFormat format, Coord::CoordSystem sys, Coord::SkyFrame sky)
+ Coord::AngleFormat format, Coord::CoordSystem sys,
+ Coord::SkyFrame sky)
{
switch (format) {
case Coord::DEG:
return mapAngleToRef(sign*zeroTWOPI(degToRad(atof(angle)))+offset,sys,sky);
case Coord::RAD:
return mapAngleToRef(sign*atof(angle)+offset, sys, sky);
+ default:
+ return 0;
}
}
double* Base::xmlAngles(const char* angle, int sign, double offset, int cnt,
- Coord::AngleFormat format, Coord::CoordSystem sys, Coord::SkyFrame sky)
+ Coord::AngleFormat format, Coord::CoordSystem sys,
+ Coord::SkyFrame sky)
{
double* ang = new double[cnt];
@@ -1072,6 +1121,11 @@ void Base::markerListXMLHeader(ostream& str, Coord::CoordSystem sys,
str << "<FIELD ID=\"rv2\" name=\"rv2\" datatype=\"float\" precision=\"8\" arraysize=\"*\" unit=\"arcsec\" ref=\"" << coord.skyFrameStr(sky) << "\"/>" << endl;
str << "<FIELD ID=\"ang\" name=\"ang\" datatype=\"float\" precision=\"8\" unit=\"deg\" ref=\"" << coord.skyFrameStr(sky) << "\" axis=\"-x\" dir=\"ccw\"/>" << endl;
str << "<FIELD ID=\"angv\" name=\"angv\" datatype=\"float\" precision=\"8\" arraysize=\"*\" unit=\"deg\" ref=\"" << coord.skyFrameStr(sky) << "\" axis=\"-x\" dir=\"ccw\"/>" << endl;
+
+ if (xucd)
+ delete [] xucd;
+ if (yucd)
+ delete [] yucd;
}
else {
str << "<FIELD ID=\"x\" name=\"x\" datatype=\"float\" precision=\"8\" unit=\"pix\" ref=\"" << coord.coordSystemStr(sys) << "\"/>" << endl;
@@ -1124,4 +1178,3 @@ void Base::markerListXMLFooter(ostream& str)
<< "</RESOURCE>" << endl
<< "</VOTABLE>" << endl;
}
-
diff --git a/tksao/frame/polygon.C b/tksao/frame/polygon.C
index c33455b..98d8583 100644
--- a/tksao/frame/polygon.C
+++ b/tksao/frame/polygon.C
@@ -69,6 +69,9 @@ void Polygon::renderX(Drawable drawable, Coord::InternalSystem sys,
XFillPolygon(display, drawable, lgc, pp, cnt, Complex, CoordModeOrigin);
else
XDrawLines(display, drawable, lgc, pp, cnt, CoordModeOrigin);
+
+ if (pp)
+ delete [] pp;
}
void Polygon::renderPS(int mode)