Update of /cvsroot/nsclspectcl/SpecTcl/Filter In directory sc8-pr-cvs1:/tmp/cvs-serv27576 Modified Files: FilterEventProcessor.h FilterEventProcessor.cpp OutputEventStream.h OutputEventStream.cpp FilterBufferDecoder.h FilterBufferDecoder.cpp Log Message: Continuing modifications for event filtering. Index: FilterEventProcessor.h =================================================================== RCS file: /cvsroot/nsclspectcl/SpecTcl/Filter/FilterEventProcessor.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** FilterEventProcessor.h 4 Jul 2003 14:33:18 -0000 1.3 --- FilterEventProcessor.h 18 Jul 2003 15:08:16 -0000 1.4 *************** *** 54,62 **** UInt_t m_nOffset; string m_sTag; ! UInt_t m_nParameters; UInt_t** m_pValidParameterArray; vector<CParInfo*> m_vParInfo; ! vector<CEvent*> m_vBuffer; public: --- 54,62 ---- UInt_t m_nOffset; string m_sTag; ! UInt_t m_nValidParameters; UInt_t** m_pValidParameterArray; vector<CParInfo*> m_vParInfo; ! vector<CEvent*> m_vBuffer; // Still deciding whether to use this instead. **************************************** public: Index: FilterEventProcessor.cpp =================================================================== RCS file: /cvsroot/nsclspectcl/SpecTcl/Filter/FilterEventProcessor.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** FilterEventProcessor.cpp 4 Jul 2003 14:33:18 -0000 1.3 --- FilterEventProcessor.cpp 18 Jul 2003 15:08:16 -0000 1.4 *************** *** 23,29 **** m_nOffset(0), m_sTag(""), ! m_nParameters(0) { m_pBuffer = new char[m_nBUFFERSIZE]; if(m_pValidParameterArray) { --- 23,31 ---- m_nOffset(0), m_sTag(""), ! m_nValidParameters(0) { m_pBuffer = new char[m_nBUFFERSIZE]; + m_vParInfo.clear(); + m_vBuffer.clear(); if(m_pValidParameterArray) { *************** *** 34,37 **** --- 36,41 ---- CFilterEventProcessor::~CFilterEventProcessor() { + delete m_pBuffer; + if(m_pValidParameterArray) { delete m_pValidParameterArray; // Just in case. *************** *** 53,62 **** m_vParInfo.clear(); // Clear out old parameter data. // Start reading header data. ! read_uint(m_nParameters); string sParName = ""; UInt_t nParId = 0; CParInfo* pParInfo = (CParInfo*)kpNULL; CParameter* pParameter = (CParameter*)kpNULL; ! for(UInt_t i = 0; i < m_nParameters; i++) { read_string(sParName); read_uint(nParId); --- 57,66 ---- m_vParInfo.clear(); // Clear out old parameter data. // Start reading header data. ! read_uint(m_nValidParameters); string sParName = ""; UInt_t nParId = 0; CParInfo* pParInfo = (CParInfo*)kpNULL; CParameter* pParameter = (CParameter*)kpNULL; ! for(UInt_t i = 0; i < m_nValidParameters; i++) { read_string(sParName); read_uint(nParId); *************** *** 77,81 **** } else if(m_sTag == "event") { read_array(); ! for(UInt_t i = 0; i < m_nParameters; i++) { if((m_vParInfo[i])->isActive()) { if((*m_pValidParameterArray)[i] == True) { --- 81,85 ---- } else if(m_sTag == "event") { read_array(); ! for(UInt_t i = 0; i < m_nValidParameters; i++) { if((m_vParInfo[i])->isActive()) { if((*m_pValidParameterArray)[i] == True) { *************** *** 108,112 **** rString = string(pString); ! incr_offset(rString.length() + 1); // The 1 being for the \0 null terminator. } --- 112,117 ---- rString = string(pString); ! //incr_offset(rString.length() + 1); // The 1 being for the \0 null terminator. ! incr_offset(sizeof(pString)); // No need to add 1 for the null terminator. It is already counted by sizeof. } *************** *** 134,141 **** } //m_pValidParameterArray = ((Float_t[])*)kpNULL; ! UInt_t UIntArray[m_nParameters]; m_pValidParameterArray = (UInt_t**)(&UIntArray); UInt_t nUInt = 0; ! for(UInt_t i = 0; i < m_nParameters; i++) { read_uint(nUInt); ((UInt_t[])(*m_pValidParameterArray))[i] = nUInt; --- 139,146 ---- } //m_pValidParameterArray = ((Float_t[])*)kpNULL; ! UInt_t UIntArray[m_nValidParameters]; m_pValidParameterArray = (UInt_t**)(&UIntArray); UInt_t nUInt = 0; ! for(UInt_t i = 0; i < m_nValidParameters; i++) { read_uint(nUInt); ((UInt_t[])(*m_pValidParameterArray))[i] = nUInt; *************** *** 168,172 **** m_nOffset += nIncrement; if(m_nOffset >= m_nBUFFERSIZE) { ! cerr << "Error: Illegal offset value.\n"; m_nOffset = 0; } --- 173,177 ---- m_nOffset += nIncrement; if(m_nOffset >= m_nBUFFERSIZE) { ! cerr << "Error: CFilterEventProcessor::incr_offset given illegal offset value.\n"; m_nOffset = 0; } Index: OutputEventStream.h =================================================================== RCS file: /cvsroot/nsclspectcl/SpecTcl/Filter/OutputEventStream.h,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** OutputEventStream.h 20 Jun 2003 15:01:12 -0000 1.6 --- OutputEventStream.h 18 Jul 2003 15:08:16 -0000 1.7 *************** *** 46,50 **** string m_sFileName; vector<string> m_vParameterNames; ! UInt_t m_nValidParameters; UInt_t m_nEvents; FILE *m_pFile; --- 46,51 ---- string m_sFileName; vector<string> m_vParameterNames; ! UInt_t m_nValidParameters; // Number of parameters declared in the filter dictionary. (Does not necessarily coincide with the isValid check done later.) ! char *m_pBitMask; UInt_t m_nEvents; FILE *m_pFile; *************** *** 52,58 **** Bool_t m_fXDRError; UInt_t m_nOffset; // Number of bytes sent for this block/buffer. ! UInt_t m_nBLOCKSIZE; ! UInt_t m_nMAXBUFFERSIZE; ! vector<CEvent*> m_vBuffer; public: --- 53,59 ---- Bool_t m_fXDRError; UInt_t m_nOffset; // Number of bytes sent for this block/buffer. ! UInt_t m_nBUFFERSIZE; ! UInt_t m_nMAXEVENTBUFFERSIZE; ! vector<CEvent*> m_vEventBuffer; public: *************** *** 74,78 **** Bool_t Close(); Bool_t ReceiveEvent(CEvent&); ! Bool_t SendBuffer(); Bool_t XDRstring(string&); Bool_t XDRuint(UInt_t&); --- 75,79 ---- Bool_t Close(); Bool_t ReceiveEvent(CEvent&); ! Bool_t SendEventBuffer(); Bool_t XDRstring(string&); Bool_t XDRuint(UInt_t&); *************** *** 80,83 **** --- 81,85 ---- Bool_t XDRfloat(Float_t&); Bool_t XDRfill(UInt_t); + void incr_offset(UInt_t); }; // COutputEventStream. Index: OutputEventStream.cpp =================================================================== RCS file: /cvsroot/nsclspectcl/SpecTcl/Filter/OutputEventStream.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** OutputEventStream.cpp 3 Jul 2003 21:32:10 -0000 1.7 --- OutputEventStream.cpp 18 Jul 2003 15:08:16 -0000 1.8 *************** *** 27,33 **** //m_sFileName(ParseFileName(string(""))), // Use default file name. m_nValidParameters(0), ! m_pFile((FILE *)kpNULL), ! m_nBLOCKSIZE(8192), ! m_nMAXBUFFERSIZE(16) // Arbitrarily chosen. { string sEmpty = ""; --- 27,34 ---- //m_sFileName(ParseFileName(string(""))), // Use default file name. m_nValidParameters(0), ! m_pBitMask((char*)kpNULL), ! m_pFile((FILE*)kpNULL), ! m_nBUFFERSIZE(8192), ! m_nMAXEVENTBUFFERSIZE(16) // Arbitrarily chosen. { string sEmpty = ""; *************** *** 35,39 **** m_vParameterNames.clear(); // I just hope that this is not a necessary action in C++. ! m_vBuffer.clear(); // I just hope that this is not a necessary action in C++. Open(); // Calls Close() first. } --- 36,40 ---- m_vParameterNames.clear(); // I just hope that this is not a necessary action in C++. ! m_vEventBuffer.clear(); // I just hope that this is not a necessary action in C++. Open(); // Calls Close() first. } *************** *** 45,53 **** m_vParameterNames(rvParameterNames), m_nValidParameters(0), ! m_pFile((FILE *)kpNULL), ! m_nBLOCKSIZE(8192), ! m_nMAXBUFFERSIZE(16) // Arbitrarily chosen. { ! m_vBuffer.clear(); // I just hope that this is not a necessary action in C++. Open(); // Calls Close() first. } --- 46,55 ---- m_vParameterNames(rvParameterNames), m_nValidParameters(0), ! m_pBitMask((char*)kpNULL), ! m_pFile((FILE*)kpNULL), ! m_nBUFFERSIZE(8192), ! m_nMAXEVENTBUFFERSIZE(16) // Arbitrarily chosen. { ! m_vEventBuffer.clear(); // I just hope that this is not a necessary action in C++. Open(); // Calls Close() first. } *************** *** 115,131 **** pParameter = ((CHistogrammer*)gpEventSink)->FindParameter(*iParameterName); // Parameter should be valid, but ... if(pParameter == (CParameter*)kpNULL) { // If parameter is not present in dictionary. ! cerr << "Error: Invalid parameter (" + *iParameterName + ").\n"; m_vParameterNames.erase(iParameterName); // Remove the invalid parameter name. //**************************** Is iterator still valid??? } } m_nValidParameters = m_vParameterNames.size(); // Send header information. (Only valid parameters.) m_pFile = fopen(m_sFileName.c_str(), "w"); // Over-write any previously existing file. xdrstdio_create(&m_xdrs, m_pFile, XDR_ENCODE); // Create the XDR stream for encoding and WRITING TO the file stream. XDRuint(m_nValidParameters); // Send the number of valid parameters. (Should equal m_vParameterNames.size().) string sParameterName = ""; UInt_t nParameterId = 0; ! for(UInt_t i=0; i<m_vParameterNames.size(); i++) { XDRuint(i); // Send the parameter index. sParameterName = m_vParameterNames[i]; --- 117,141 ---- pParameter = ((CHistogrammer*)gpEventSink)->FindParameter(*iParameterName); // Parameter should be valid, but ... if(pParameter == (CParameter*)kpNULL) { // If parameter is not present in dictionary. ! cerr << "Error: Invalid parameter (" + *iParameterName + "). Erasing from parameter vector.\n"; m_vParameterNames.erase(iParameterName); // Remove the invalid parameter name. //**************************** Is iterator still valid??? } } m_nValidParameters = m_vParameterNames.size(); + //UInt_t *(ValidParameterArray[m_nValidParameters]); + if(m_pBitMask != (char*)kpNULL) { + delete[] m_pBitMask; // AVOID MEMORY LEAKS! Use delete[]. + } + m_pBitMask = (char*) new char[m_nValidParameters + 1]; // Add 1 for the null terminator. + m_pBitMask[m_nValidParameters] = '\n'; // Set null terminator right now. // Send header information. (Only valid parameters.) m_pFile = fopen(m_sFileName.c_str(), "w"); // Over-write any previously existing file. xdrstdio_create(&m_xdrs, m_pFile, XDR_ENCODE); // Create the XDR stream for encoding and WRITING TO the file stream. + string sTag = "header"; + XDRstring(sTag); // Send the tag. XDRuint(m_nValidParameters); // Send the number of valid parameters. (Should equal m_vParameterNames.size().) string sParameterName = ""; UInt_t nParameterId = 0; ! for(UInt_t i = 0; i < m_nValidParameters; i++) { XDRuint(i); // Send the parameter index. sParameterName = m_vParameterNames[i]; *************** *** 143,147 **** Bool_t COutputEventStream::Close() { // Must be consecutively callable. if(m_pFile != (FILE *)kpNULL) { ! SendBuffer(); fflush(m_pFile); xdr_destroy(&m_xdrs); --- 153,157 ---- Bool_t COutputEventStream::Close() { // Must be consecutively callable. if(m_pFile != (FILE *)kpNULL) { ! SendEventBuffer(); fflush(m_pFile); xdr_destroy(&m_xdrs); *************** *** 160,170 **** Bool_t COutputEventStream::ReceiveEvent(CEvent& rEvent) { if(m_fActive) { ! if(m_vBuffer.size() >= m_nMAXBUFFERSIZE) { ! if(!SendBuffer()) { // Send buffer. If code is an error, return false. ! cerr << "Error sending buffer.\n"; ! return kfFALSE; // Failure sending buffer. } } ! m_vBuffer.push_back(&rEvent); return kfTRUE; } else { --- 170,180 ---- Bool_t COutputEventStream::ReceiveEvent(CEvent& rEvent) { if(m_fActive) { ! if(m_vEventBuffer.size() >= m_nMAXEVENTBUFFERSIZE) { ! if(!SendEventBuffer()) { // Send event buffer. If code is an error, return false. ! cerr << "Error sending event buffer.\n"; ! return kfFALSE; // Failure sending event buffer. } } ! m_vEventBuffer.push_back(&rEvent); return kfTRUE; } else { *************** *** 175,192 **** } ! Bool_t COutputEventStream::SendBuffer() { /* ! if(m_ofs.is_open() && m_ofs.good() && m_vBuffer.size()>0) { // Send buffer. //for(int i=0; i<Buffer.size(); i++) { // For each and every CEvent in Buffer, for(vector<CEvent>::iterator i=m_vBuffer.begin(); i!=m_vBuffer.end(); i++) { // Just trying. ! //for(int j=0; j<((CEvent)Buffer[i]).size(); j++) { // For each and every Parameter in CEvent, ! for(CEventIterator j=i->begin(); j!=i->end(); j++) { // Just tryin' ! // Output the parameter in the event in the buffer. ! //m_ofs << ((CEvent)(Buffer[i]))[j] << " "; // Done with parameter. ! //m_ofs << (*j) << " "; // Done with parameter. ! } ! // Done with event. ! m_ofs << "EOE" << endl; } // Done with buffer. --- 185,202 ---- } ! Bool_t COutputEventStream::SendEventBuffer() { /* ! if(m_ofs.is_open() && m_ofs.good() && m_vBuffer.size()>0) { // Send buffer. //for(int i=0; i<Buffer.size(); i++) { // For each and every CEvent in Buffer, for(vector<CEvent>::iterator i=m_vBuffer.begin(); i!=m_vBuffer.end(); i++) { // Just trying. ! //for(int j=0; j<((CEvent)Buffer[i]).size(); j++) { // For each and every Parameter in CEvent, ! for(CEventIterator j=i->begin(); j!=i->end(); j++) { // Just tryin' ! // Output the parameter in the event in the buffer. ! //m_ofs << ((CEvent)(Buffer[i]))[j] << " "; // Done with parameter. ! //m_ofs << (*j) << " "; // Done with parameter. ! } ! // Done with event. ! m_ofs << "EOE" << endl; } // Done with buffer. *************** *** 196,213 **** m_vBuffer.clear(); return kfTRUE; ! } else { return kfFALSE; ! } */ UInt_t True(1), False(0); - string DOCUMENTATION = "DOC", EVENT = "EVT", ENDOFRECORD = "EOR"; // Tags. if(m_fActive) { ! // Send buffer. CParameter* pParameter = (CParameter*)kpNULL; ! UInt_t i = 0, nParameterId = 0; Float_t nParameterValue = 0; - UInt_t *(ValidParameterArray[m_nValidParameters]); // Create this just once, and repeatedly assign to it. ! for(vector<CEvent*>::iterator ipEvent = m_vBuffer.begin(); ipEvent != m_vBuffer.end(); ipEvent++) { // For each event in buffer, // Find out the TRULY valid (based on isValid()) parameters and send the corresponding "bit-mask" array. i = 0; --- 206,222 ---- m_vBuffer.clear(); return kfTRUE; ! } else { return kfFALSE; ! } */ UInt_t True(1), False(0); if(m_fActive) { ! // Send the event buffer. CParameter* pParameter = (CParameter*)kpNULL; ! string sTag = "", sBitMask = ""; ! UInt_t i = 0, nParameterId = 0, nEventSize = 0; Float_t nParameterValue = 0; ! for(vector<CEvent*>::iterator ipEvent = m_vEventBuffer.begin(); ipEvent != m_vEventBuffer.end(); ipEvent++) { // For each event in event buffer, // Find out the TRULY valid (based on isValid()) parameters and send the corresponding "bit-mask" array. i = 0; *************** *** 216,222 **** nParameterId = pParameter->getNumber(); // Obtain the parameter ID. if(((**ipEvent)[nParameterId]).isValid()) { ! ValidParameterArray[i] = &True; } else { ! ValidParameterArray[i] = &False; } i++; --- 225,233 ---- nParameterId = pParameter->getNumber(); // Obtain the parameter ID. if(((**ipEvent)[nParameterId]).isValid()) { ! //ValidParameterArray[i] = &True; ! m_pBitMask[i] = (char)'1'; } else { ! //ValidParameterArray[i] = &False; ! m_pBitMask[i] = (char)'0'; } i++; *************** *** 224,244 **** // Calculate event size. ! UInt_t nEventSize = 0; ! nEventSize = sizeof(ValidParameterArray) + (i * 4); // i is the number of parameters. Each parameter is a 32-bit (4-byte) float. ! if(m_nOffset >= m_nBLOCKSIZE) { ! m_nOffset %= m_nBLOCKSIZE; ! XDRfill(m_nBLOCKSIZE - m_nOffset); ! } else if((m_nOffset + nEventSize) > m_nBLOCKSIZE) { ! XDRfill(m_nBLOCKSIZE - m_nOffset); // Will exceed block size limits. Fill with null data instead and continue to next block. } else { ! if(!xdr_array(&m_xdrs, (char**)(&ValidParameterArray), &m_nValidParameters, 100, (UInt_t)sizeof(UInt_t), (xdrproc_t)xdr_u_int)) { // Send the bit-mask array. ! cerr << "Error: xdr_array unsuccessful.\n"; ! } // Send (only) the TRULY valid parameters. i = 0; for(vector<string>::iterator iParameterName = m_vParameterNames.begin(); iParameterName != m_vParameterNames.end(); iParameterName++) { // For each parameter, ! if(*(ValidParameterArray[i]) == True) { pParameter = ((CHistogrammer*)gpEventSink)->FindParameter(*iParameterName); // Find the parameter. nParameterId = pParameter->getNumber(); // Obtain the parameter ID. --- 235,256 ---- // Calculate event size. ! nEventSize = 0; ! nEventSize = (m_nValidParameters + 1) + (i * 4); // i is the number of parameters. Each parameter is a 32-bit (4-byte) float. ! if(m_nOffset >= m_nBUFFERSIZE) { ! m_nOffset %= m_nBUFFERSIZE; // Re-scale the offset. ! XDRfill(m_nBUFFERSIZE - m_nOffset); // Fill with null data. ! } else if((m_nOffset + nEventSize) > m_nBUFFERSIZE) { ! XDRfill(m_nBUFFERSIZE - m_nOffset); // Will exceed block size limits. Fill with null data instead and continue to next block. } else { ! sTag = "event"; ! XDRstring(sTag); ! sBitMask = string(m_pBitMask); ! XDRstring(sBitMask); // Send (only) the TRULY valid parameters. i = 0; for(vector<string>::iterator iParameterName = m_vParameterNames.begin(); iParameterName != m_vParameterNames.end(); iParameterName++) { // For each parameter, ! if(m_pBitMask[i] == '1') { pParameter = ((CHistogrammer*)gpEventSink)->FindParameter(*iParameterName); // Find the parameter. nParameterId = pParameter->getNumber(); // Obtain the parameter ID. *************** *** 250,256 **** m_nOffset += nEventSize; // Increment the offset by the event size. } ! } // Done with buffer. ! m_vBuffer.clear(); } --- 262,268 ---- m_nOffset += nEventSize; // Increment the offset by the event size. } ! } // Done with event buffer. ! m_vEventBuffer.clear(); } *************** *** 262,271 **** Bool_t COutputEventStream::XDRstring(string& rString) { char* pString = (char*)(rString.c_str()); ! if(xdr_string(&m_xdrs, &pString, (sizeof(pString)))) { ! m_nOffset += sizeof(rString); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_string unsuccessful.\n"; return kfFALSE; } --- 274,283 ---- Bool_t COutputEventStream::XDRstring(string& rString) { char* pString = (char*)(rString.c_str()); ! if(xdr_string(&m_xdrs, &pString, (strlen(pString) + 1))) { // Add 1 to include the null terminator. ! incr_offset(strlen(pString) + 1); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: COutputEventStream::XDRstring unsuccessful.\n"; return kfFALSE; } *************** *** 274,282 **** Bool_t COutputEventStream::XDRuint(UInt_t& rUInt) { if(xdr_u_int(&m_xdrs, &rUInt)) { ! m_nOffset += sizeof(rUInt); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_u_int unsuccessfull.\n"; return kfFALSE; } --- 286,294 ---- Bool_t COutputEventStream::XDRuint(UInt_t& rUInt) { if(xdr_u_int(&m_xdrs, &rUInt)) { ! incr_offset(sizeof(rUInt)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: COutputEventStream::XDRuint unsuccessfull.\n"; return kfFALSE; } *************** *** 286,294 **** if(xdr_array(&m_xdrs, pValidParameterArray, &m_nValidParameters, 100, (UInt_t)sizeof(UInt_t), (xdrproc_t)xdr_u_int)) { m_nEvents++; ! m_nOffset += sizeof(*pValidParameterArray); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_array unsuccessful.\n"; return kfFALSE; } --- 298,306 ---- if(xdr_array(&m_xdrs, pValidParameterArray, &m_nValidParameters, 100, (UInt_t)sizeof(UInt_t), (xdrproc_t)xdr_u_int)) { m_nEvents++; ! incr_offset(sizeof(*pValidParameterArray)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: COutputEventStream::XDRarray unsuccessful.\n"; return kfFALSE; } *************** *** 297,311 **** Bool_t COutputEventStream::XDRfloat(Float_t& rFloat) { if(xdr_float(&m_xdrs, &rFloat)) { ! m_nOffset += sizeof(rFloat); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_float unsuccessful.\n"; return kfFALSE; } } ! Bool_t COutputEventStream::XDRfill(UInt_t nBytes) { // Pad with nBytes zeroes. // This function should only be used for WRITING out enough characters to pad the buffer. string String = ""; for(UInt_t i = 0; i < nBytes; i++) { --- 309,330 ---- Bool_t COutputEventStream::XDRfloat(Float_t& rFloat) { if(xdr_float(&m_xdrs, &rFloat)) { ! incr_offset(sizeof(rFloat)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: COutputEventStream::XDRfloat unsuccessful.\n"; return kfFALSE; } } ! Bool_t COutputEventStream::XDRfill(UInt_t nBytes) { // Pad the rest of the buffer with nBytes zeroes. ! // First send an end-of-record tag. ! string sTag = "endofrecord"; ! XDRstring(sTag); ! char* pTag = (char*)(sTag.c_str()); ! nBytes -= (strlen(pTag) + 1); // Add 1 to include null terminator, and decrement nBytes by that whole thing. ! // This function should only be used for WRITING out enough characters to pad the buffer. + nBytes--; // nBytes-1 in order to reserve space for the final null terminator. string String = ""; for(UInt_t i = 0; i < nBytes; i++) { *************** *** 315,326 **** pString = (char*)(String.c_str()); ! if(xdr_string(&m_xdrs, &pString, (sizeof(pString)))) { m_nOffset = 0; return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_string unsuccessful.\n"; return kfFALSE; } } --- 334,354 ---- pString = (char*)(String.c_str()); ! if(xdr_string(&m_xdrs, &pString, (strlen(pString) + 1))) { m_nOffset = 0; return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: COutputEventStream::XDRfill unsuccessful.\n"; return kfFALSE; } + } + + void COutputEventStream::incr_offset(UInt_t nIncrement) { + // Increment the offset, checking that it is within bounds. + m_nOffset += nIncrement; + if(m_nOffset >= m_nBUFFERSIZE) { + cerr << "Error: COutputEventStream::incr_offset given illegal offset value.\n"; + m_nOffset = 0; + } } Index: FilterBufferDecoder.h =================================================================== RCS file: /cvsroot/nsclspectcl/SpecTcl/Filter/FilterBufferDecoder.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** FilterBufferDecoder.h 3 Jul 2003 21:32:10 -0000 1.2 --- FilterBufferDecoder.h 18 Jul 2003 15:08:16 -0000 1.3 *************** *** 7,10 **** --- 7,15 ---- #endif + #ifndef __BUFFERDECODER_H + #include "BufferDecoder.h" + #define __BUFFERDECODER_H + #endif + // Forward class declarations: class CBufferDecoder; *************** *** 15,33 **** Bool_t m_fActive; XDR m_xdrs; ! UInt_t m_nSize; string m_sTag; // Documentation buffer, event data, or end-of-record. Bool_t m_fXDRError; - UInt_t m_nParameters; - Bool_t m_fEventData; UInt_t m_nValidParameters; //UInt_t *(ValidParameterArray[m_nValidParameters]); //UInt_t *m_pValidParameterArray; ! UInt_t*** m_pValidParameterArray; UInt_t m_nEvents; // EntityCount. UInt_t m_nOffset; // Offset of XDR-formatted buffer. UInt_t m_nOutputBufferOffset; // Offset of the output char[] buffer. UInt_t m_nBUFFERSIZE; // Initialize to 8K. ! char** m_pOutputBuffer; public: --- 20,37 ---- Bool_t m_fActive; XDR m_xdrs; ! //UInt_t m_nSize; string m_sTag; // Documentation buffer, event data, or end-of-record. Bool_t m_fXDRError; UInt_t m_nValidParameters; //UInt_t *(ValidParameterArray[m_nValidParameters]); //UInt_t *m_pValidParameterArray; ! //UInt_t*** m_pValidParameterArray; ! char *m_pBitMask; UInt_t m_nEvents; // EntityCount. UInt_t m_nOffset; // Offset of XDR-formatted buffer. UInt_t m_nOutputBufferOffset; // Offset of the output char[] buffer. UInt_t m_nBUFFERSIZE; // Initialize to 8K. ! char *m_pOutputBuffer; public: *************** *** 48,54 **** Bool_t XDRstring(string&); Bool_t XDRuint(UInt_t&); ! Bool_t XDRarray(); Bool_t XDRfloat(Float_t&); ! Bool_t XDRfill(UInt_t); // Fills up the rest of the buffer. void incr_offset(UInt_t); --- 52,58 ---- Bool_t XDRstring(string&); Bool_t XDRuint(UInt_t&); ! //Bool_t XDRarray(); Bool_t XDRfloat(Float_t&); ! //Bool_t XDRfill(UInt_t); // Fills up the rest of the buffer. void incr_offset(UInt_t); Index: FilterBufferDecoder.cpp =================================================================== RCS file: /cvsroot/nsclspectcl/SpecTcl/Filter/FilterBufferDecoder.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** FilterBufferDecoder.cpp 4 Jul 2003 14:33:18 -0000 1.3 --- FilterBufferDecoder.cpp 18 Jul 2003 15:08:16 -0000 1.4 *************** *** 35,57 **** m_fActive(kfFALSE), m_fXDRError(kfFALSE), - m_sTag(""), ! m_nParameters(0), ! m_fEventData(kfFALSE), m_nEvents(0), m_nOffset(0), m_nOutputBufferOffset(0), ! m_nBUFFERSIZE(8192) // 8KB. Default. { ! if(m_pOutputBuffer) { ! delete m_pOutputBuffer; ! } ! char CharArray[m_nBUFFERSIZE]; ! m_pOutputBuffer = (char**)(&CharArray); }; CFilterBufferDecoder::~CFilterBufferDecoder() { ! if(m_pOutputBuffer) { ! delete m_pOutputBuffer; } }; --- 35,59 ---- m_fActive(kfFALSE), m_fXDRError(kfFALSE), m_sTag(""), ! m_nValidParameters(0), ! m_pBitMask((char*)kpNULL), m_nEvents(0), m_nOffset(0), m_nOutputBufferOffset(0), ! m_nBUFFERSIZE(8192), // 8KB. Default. ! m_pOutputBuffer((char*)kpNULL) { ! m_pOutputBuffer = (char*) new char[m_nBUFFERSIZE]; }; CFilterBufferDecoder::~CFilterBufferDecoder() { ! if(m_pBitMask != (char*)kpNULL) { ! delete[] m_pBitMask; ! m_pBitMask = (char*)kpNULL; ! } ! ! if(m_pOutputBuffer != (char*)kpNULL) { ! delete[] m_pOutputBuffer; ! m_pOutputBuffer = (char*)kpNULL; } }; *************** *** 62,90 **** CAnalyzer& rAnalyzer) { ! m_sTag = ""; m_fXDRError = kfFALSE; ! m_nParameters = 0; m_nEvents = 0; m_nOffset = 0; m_nOutputBufferOffset = 0; ! xdrmem_create(&m_xdrs, (char*)pBuffer, m_nSize, XDR_DECODE); // Read from memory buffer. // Neither headers nor events should span buffer boundaries, so the very first thing we read should be a string specifying the format of data immediately following. while(!m_fXDRError) { if(XDRstring(m_sTag)) { // Read the tag. if(m_sTag == "header") { // Start processing header data. // NOTE: Block size MUST be sufficiently large to read entire header on first pass. // Also, arrays sizes will always be equal to the number of parameters defined in the header/documentation buffer. ! XDRuint(m_nParameters); ! UInt_t *(ValidParameterArray[m_nParameters]); // Expensive in a loop. Rewrite. (On second thought, header occurrence is very infrequent.) ! m_pValidParameterArray = (UInt_t***)(&ValidParameterArray); ! UInt_t nParIndex = 0; ! string sParName = ""; ! UInt_t nParId = 0; ! for(UInt_t i = 0; i < m_nParameters; i++) { XDRuint(nParIndex); // Simply an index (starting from 0) for the parameter. ! // Error checking: if(i != nParIndex) { m_fXDRError = kfTRUE; --- 64,113 ---- CAnalyzer& rAnalyzer) { ! cerr << endl; // REMOVE.************************************** m_fXDRError = kfFALSE; ! m_sTag = ""; ! m_nValidParameters = 0; m_nEvents = 0; m_nOffset = 0; m_nOutputBufferOffset = 0; ! if(m_pBitMask != (char*)kpNULL) { ! delete[] m_pBitMask; ! m_pBitMask = (char*)kpNULL; ! } ! // We do not know the number of parameters, so we don't make the bit-mask array yet. ! ! if(m_pOutputBuffer != (char*)kpNULL) { ! delete[] m_pOutputBuffer; ! m_pOutputBuffer = (char*)kpNULL; ! } ! m_pOutputBuffer = (char*) new char[m_nBUFFERSIZE]; ! ! // Local variables: ! UInt_t nParIndex = 0; ! string sParName = ""; ! UInt_t nParId = 0; ! Float_t nFloat = 0; ! string sBitMask = ""; ! ! xdrmem_create(&m_xdrs, (char*)pBuffer, m_nBUFFERSIZE, XDR_DECODE); // READ from memory buffer. // Neither headers nor events should span buffer boundaries, so the very first thing we read should be a string specifying the format of data immediately following. while(!m_fXDRError) { if(XDRstring(m_sTag)) { // Read the tag. if(m_sTag == "header") { + cerr << "Header beginning..." << endl; // Start processing header data. // NOTE: Block size MUST be sufficiently large to read entire header on first pass. // Also, arrays sizes will always be equal to the number of parameters defined in the header/documentation buffer. ! XDRuint(m_nValidParameters); ! m_pBitMask = (char*) new char[m_nValidParameters + 1]; // Add 1 for the null terminator. ! m_pBitMask[m_nValidParameters] = '\n'; // Set null terminator right now. ! cerr << " Number of valid parameters: " << m_nValidParameters << endl; ! for(UInt_t i = 0; i < m_nValidParameters; i++) { ! cerr << " Parameter:" << endl; XDRuint(nParIndex); // Simply an index (starting from 0) for the parameter. ! cerr << " Index: " << nParIndex << endl; ! // Some simple error checking: if(i != nParIndex) { m_fXDRError = kfTRUE; *************** *** 92,104 **** } XDRstring(sParName); XDRuint(nParId); } } else if(m_sTag == "event") { // Start processing event data. ! if(XDRarray()) { ! Float_t nFloat = 0; ! for(UInt_t i = 0; i < m_nParameters; i++) { ! if((*m_pValidParameterArray)[i] != 0) { XDRfloat(nFloat); } } --- 115,145 ---- } XDRstring(sParName); + cerr << " Name: " << sParName << endl; XDRuint(nParId); + cerr << " Id: " << nParId << endl; } + cerr << "... End of header." << endl << endl; + continue; } else if(m_sTag == "event") { + cerr << "Event beginning..." << endl; // Start processing event data. ! if(XDRstring(sBitMask)) { ! cerr << " Bit Mask: "; ! for(UInt_t i = 0; i < m_nValidParameters; i++) { ! cerr << sBitMask[i] << ", "; ! } ! cerr << endl; ! ! for(UInt_t i = 0; i < m_nValidParameters; i++) { ! // Not really necessary, but... ! m_pBitMask[i] = sBitMask[i]; ! ! if(sBitMask[i] == '1') { XDRfloat(nFloat); + cerr << " ParData (" << i << "): " << nFloat << endl; + } else if(sBitMask[i] == '0') { + // Ignore. + } else { + cerr << "Error: Corrupt array element (" << sBitMask[i] << ")." << endl; } } *************** *** 106,110 **** --- 147,154 ---- break; } + cerr << "... End of event." << endl << endl; //************************** + continue; } else if(m_sTag == "endofrecord") { + cerr << "End of record received." << endl; m_fXDRError = kfFALSE; // Reset error flag, but still ... break; // break out of the loop. *************** *** 118,123 **** --- 162,169 ---- cerr << "Error: Invalid data format. Tag type must first be specified.\n"; } + cerr << "*** Done with while loop." << endl; //*************************** } + cerr << "*** Leaving CFilterBufferDecoder::operator()." << endl; // ******************************** return; // Exit. } *************** *** 176,187 **** // With slight modification, they can be used for either output (XDR_ENCODE) and input (XDR_DECODE) depending on the specified create operation. Bool_t CFilterBufferDecoder::XDRstring(string& rString) { ! char* pString = (char*)(rString.c_str()); ! if(xdr_string(&m_xdrs, &pString, (sizeof(pString)))) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &pString, sizeof(pString)); ! incr_offset(sizeof(rString)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_string unsuccessful.\n"; return kfFALSE; } --- 222,234 ---- // With slight modification, they can be used for either output (XDR_ENCODE) and input (XDR_DECODE) depending on the specified create operation. Bool_t CFilterBufferDecoder::XDRstring(string& rString) { ! char* pString = (char*)kpNULL; ! if(xdr_string(&m_xdrs, &pString, 100)) { ! rString = string(pString); ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &pString, strlen(pString)); ! incr_offset(strlen(pString)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: CFilterBufferDecoder::XDRstring unsuccessful.\n"; return kfFALSE; } *************** *** 190,205 **** Bool_t CFilterBufferDecoder::XDRuint(UInt_t& rUInt) { if(xdr_u_int(&m_xdrs, &rUInt)) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &rUInt, sizeof(rUInt)); incr_offset(sizeof(rUInt)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_u_int unsuccessfull.\n"; return kfFALSE; } } Bool_t CFilterBufferDecoder::XDRarray() { if(xdr_array(&m_xdrs, (char**)(*m_pValidParameterArray), &m_nValidParameters, 100, (UInt_t)sizeof(UInt_t), (xdrproc_t)xdr_u_int)) { m_nEvents++; //memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &ValidParameterArray, sizeof(ValidParameterArray)); --- 237,258 ---- Bool_t CFilterBufferDecoder::XDRuint(UInt_t& rUInt) { if(xdr_u_int(&m_xdrs, &rUInt)) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &rUInt, sizeof(rUInt)); // Size should be 4. incr_offset(sizeof(rUInt)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: CFilterBufferDecoder::XDRuint unsuccessfull.\n"; return kfFALSE; } } + #if 0 // Commented out. Bool_t CFilterBufferDecoder::XDRarray() { if(xdr_array(&m_xdrs, (char**)(*m_pValidParameterArray), &m_nValidParameters, 100, (UInt_t)sizeof(UInt_t), (xdrproc_t)xdr_u_int)) { + cerr << " Array received: "; + for(int i = 0; i < m_nValidParameters; i++) { + cerr << (UInt_t)((**m_pValidParameterArray)[i]) << ","; + } + cerr << " (Length = " << m_nValidParameters << ")." << endl; m_nEvents++; //memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &ValidParameterArray, sizeof(ValidParameterArray)); *************** *** 208,212 **** incr_offset(sizeof(m_nValidParameters)); UInt_t nElement = 0; ! for(UInt_t i = 0; i < m_nParameters; i++) { memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &nElement, sizeof(nElement)); incr_offset(sizeof(nElement)); --- 261,265 ---- incr_offset(sizeof(m_nValidParameters)); UInt_t nElement = 0; ! for(UInt_t i = 0; i < m_nValidParameters; i++) { memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &nElement, sizeof(nElement)); incr_offset(sizeof(nElement)); *************** *** 215,237 **** } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_array unsuccessful.\n"; return kfFALSE; } } Bool_t CFilterBufferDecoder::XDRfloat(Float_t& rFloat) { if(xdr_float(&m_xdrs, &rFloat)) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &rFloat, sizeof(rFloat)); incr_offset(sizeof(rFloat)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_float unsuccessful.\n"; return kfFALSE; } } ! Bool_t CFilterBufferDecoder::XDRfill(UInt_t nBytes) { // Pad with nBytes zeroes. // This function should only be used for WRITING out enough characters to pad the buffer. string String = ""; for(UInt_t i = 0; i < nBytes; i++) { --- 268,300 ---- } else { m_fXDRError = kfTRUE; ! cerr << "Error: CFilterBufferDecoder::XDRarray unsuccessful.\n"; return kfFALSE; } } + #endif Bool_t CFilterBufferDecoder::XDRfloat(Float_t& rFloat) { if(xdr_float(&m_xdrs, &rFloat)) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &rFloat, sizeof(rFloat)); // Size should be 4. incr_offset(sizeof(rFloat)); return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: CFilterBufferDecoder::XDRfloat unsuccessful.\n"; return kfFALSE; } } ! #if 0 // Commented out. ! Bool_t CFilterBufferDecoder::XDRfill(UInt_t nBytes) { // Pad the rest of the buffer with nBytes zeroes. // This function should only be used for WRITING out enough characters to pad the buffer. + + // First send an end-of-record tag. + m_sTag = "endofrecord"; + XDRstring(m_sTag); + char* pTag = m_sTag.c_str(); + nBytes -= (strlen(pTag) + 1); // Add 1 to include null terminator, and decrement nBytes by that whole thing. + + nBytes--; // nBytes-1 in order to reserve space for the final null terminator. string String = ""; for(UInt_t i = 0; i < nBytes; i++) { *************** *** 241,255 **** pString = (char*)(String.c_str()); ! if(xdr_string(&m_xdrs, &pString, (sizeof(pString)))) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &pString, sizeof(pString)); m_nOutputBufferOffset = 0; return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: xdr_string unsuccessful.\n"; return kfFALSE; } } void CFilterBufferDecoder::incr_offset(UInt_t nIncrement) { --- 304,319 ---- pString = (char*)(String.c_str()); ! if(xdr_string(&m_xdrs, &pString, (strlen(pString)))) { ! memcpy((m_pOutputBuffer + m_nOutputBufferOffset), &pString, strlen(pString)); // Size should be nBytes. Beware: sizeof(char*) = 4 ALWAYS. Use strlen. m_nOutputBufferOffset = 0; return kfTRUE; } else { m_fXDRError = kfTRUE; ! cerr << "Error: CFilterBufferDecoder::XDRfill XDRstring unsuccessful.\n"; return kfFALSE; } } + #endif void CFilterBufferDecoder::incr_offset(UInt_t nIncrement) { *************** *** 257,262 **** m_nOutputBufferOffset += nIncrement; if(m_nOutputBufferOffset >= m_nBUFFERSIZE) { ! cerr << "Error: Illegal offset value.\n"; ! m_nOffset = 0; } } --- 321,326 ---- m_nOutputBufferOffset += nIncrement; if(m_nOutputBufferOffset >= m_nBUFFERSIZE) { ! cerr << "Error: CFilterBufferDecoder::incr_offset given illegal offset value.\n"; ! m_nOutputBufferOffset = 0; } } |