From 543249ab888a93d906bc126699eca3d2f6e7636b Mon Sep 17 00:00:00 2001 From: Christopher Stawarz Date: Wed, 15 Aug 2012 11:19:12 -0400 Subject: [PATCH] Scarab opaques with embedded NULs are now converted into MATLAB uint8 arrays. Fixed a memory leak when converting a codec event into a MATLAB struct. Ensure that MEX files are always linked against the latest libMWorksMATLABTools. --- tools/data/MATLABTools/MWorksMATLABTools.cpp | 64 ++++++++++++++------ tools/data/MATLABTools/MWorksMATLABTools.h | 1 + tools/data/MATLABTools/Makefile | 21 ++++--- 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/tools/data/MATLABTools/MWorksMATLABTools.cpp b/tools/data/MATLABTools/MWorksMATLABTools.cpp index beee9cb85..a0369f04a 100644 --- a/tools/data/MATLABTools/MWorksMATLABTools.cpp +++ b/tools/data/MATLABTools/MWorksMATLABTools.cpp @@ -44,12 +44,8 @@ mxArray *recursiveGetScarabList(ScarabDatum *datum){ mx_datum = mxCreateDoubleScalar(scarab_extract_float(values[i])); break; case SCARAB_OPAQUE: - { - char *buffer = scarab_extract_string(values[i]); - mx_datum = mxCreateString(buffer); - free(buffer); + mx_datum = getScarabOpaque(values[i]); break; - } case SCARAB_DICT: mx_datum = recursiveGetScarabDict(values[i]); break; @@ -196,12 +192,8 @@ mxArray *recursiveGetScarabDict(ScarabDatum *datum){ mx_datum = mxCreateDoubleScalar(scarab_extract_float(values[i])); break; case SCARAB_OPAQUE: - { - char *buffer = scarab_extract_string(values[i]); - mx_datum = mxCreateString(buffer); - free(buffer); + mx_datum = getScarabOpaque(values[i]); break; - } case SCARAB_DICT: mx_datum = recursiveGetScarabDict(values[i]); break; @@ -268,12 +260,8 @@ mxArray *getScarabEventData(ScarabDatum *datum){ retVal = mxCreateDoubleScalar(scarab_extract_float(payload)); // HACK break; case SCARAB_OPAQUE: - { - char *buffer = scarab_extract_string(payload); - retVal = mxCreateString(buffer); - free(buffer); + retVal = getScarabOpaque(payload); break; - } case SCARAB_DICT: retVal = recursiveGetScarabDict(payload); break; @@ -337,8 +325,8 @@ mxArray *getCodec(ScarabDatum *codec){ mxCreateDoubleScalar(varValue->data.integer)); } else if(varValue->type == SCARAB_OPAQUE){ char *val = scarab_extract_string(varValue); - mxSetField(codec_struct, c, buffer, - mxCreateString(val)); + mxSetField(codec_struct, c, buffer, mxCreateString(val)); + free(val); } free(buffer); @@ -444,4 +432,46 @@ std::string getString(const mxArray *string_array_ptr) { return new_string; } + +mxArray *getScarabOpaque(ScarabDatum *datum) { + unsigned char *data = datum->data.opaque.data; + mxArray *opaque; + + if (scarab_opaque_is_string(datum)) { + opaque = mxCreateString((char *)data); + } else { + int size = datum->data.opaque.size; + mwSize dims[] = { 1, size }; + opaque = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL); + if (opaque != NULL) { + memcpy(mxGetData(opaque), data, size); + } + } + + return opaque; +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/data/MATLABTools/MWorksMATLABTools.h b/tools/data/MATLABTools/MWorksMATLABTools.h index e44c00b35..95d080df9 100644 --- a/tools/data/MATLABTools/MWorksMATLABTools.h +++ b/tools/data/MATLABTools/MWorksMATLABTools.h @@ -21,6 +21,7 @@ using namespace DataFileUtilities; int insertDatumIntoCodecList(mxArray *codeclist, const int index, ScarabDatum *datum); MWTime getMWorksTime(const mxArray *time); std::string getString(const mxArray *string_array_ptr); +mxArray *getScarabOpaque(ScarabDatum *datum); mxArray *getScarabEventData(ScarabDatum *datum); mxArray *getCodec(ScarabDatum *system_payload); mxArray *recursiveGetScarabList(ScarabDatum *datum); diff --git a/tools/data/MATLABTools/Makefile b/tools/data/MATLABTools/Makefile index 559502286..9f68ec716 100644 --- a/tools/data/MATLABTools/Makefile +++ b/tools/data/MATLABTools/Makefile @@ -18,11 +18,7 @@ EXES_32 = $(OBJS:.o=.mexmaci) EXES_64 = $(OBJS:.o=.mexmaci64) EXES = $(EXES_32) $(EXES_64) -install: all - /bin/mkdir -p $(INSTALL_DIR) - /bin/cp $(EXES) $(INSTALL_DIR) - -all: $(EXES) +all: clean_exes install $(EXES_32): %.mexmaci: %.o MACI64=0 $(MEX) -maci $(MEXFLAGS) $(LIBS) -output $@ $< @@ -33,5 +29,16 @@ $(EXES_64): %.mexmaci64: %.o $(OBJS): %.o: %.cpp $(CXX) $(CFLAGS) $(INCLUDE) -c $< -clean: - /bin/rm -f $(EXES) $(OBJS) +build: $(EXES) + +install: build + /bin/mkdir -p $(INSTALL_DIR) + /bin/cp $(EXES) $(INSTALL_DIR) + +clean_objs: + /bin/rm -f $(OBJS) + +clean_exes: + /bin/rm -f $(EXES) + +clean: clean_objs clean_exes