1 #include "SingleLineDelimTransferBuffer.h" 2 #include <cstring> 3 #include <iostream> 4 #include <cstdio> 5 #include <cstdlib> 6 7 using namespace std; 8 SingleLineDelimTransferBuffer(int numFields,char delimChar)9SingleLineDelimTransferBuffer::SingleLineDelimTransferBuffer(int numFields, char delimChar) 10 : _numFields(numFields), 11 _delimChar(delimChar) 12 { 13 _fields = new char *[_numFields]; 14 for (int i=0; i < numFields; i++) { 15 _fields[i] = new char[MAX_FIELD_SIZE]; 16 memset(_fields[i], 0, MAX_FIELD_SIZE); 17 } 18 } 19 ~SingleLineDelimTransferBuffer()20SingleLineDelimTransferBuffer::~SingleLineDelimTransferBuffer() 21 { 22 for (int i=0; i < _numFields; i++) { 23 delete [] _fields[i]; 24 _fields[i] = NULL; 25 } 26 delete [] _fields; 27 _fields = NULL; 28 } 29 initFromInput(const char * inBuffer)30bool SingleLineDelimTransferBuffer::initFromInput(const char *inBuffer) 31 { 32 clear(); 33 if (strlen(inBuffer) == 0) { 34 return false; 35 } 36 const char *oldCursor = (const char *)inBuffer; 37 const char *newCursor = (const char *)inBuffer; 38 int fieldNum = 0; 39 while (oldCursor[0] != '\0' && oldCursor[0] != '\n') { 40 while (newCursor[0] != _delimChar && newCursor[0] != '\0') { 41 newCursor++; 42 } 43 if (newCursor != oldCursor) { 44 memcpy(_fields[fieldNum], oldCursor, newCursor - oldCursor); 45 fieldNum++; 46 } 47 if (newCursor[0] != '\0') { 48 oldCursor = newCursor +1; 49 newCursor = oldCursor; 50 } else { 51 break; 52 } 53 } 54 if (fieldNum == _numFields) { 55 return true; 56 } 57 return false; 58 } 59 getField(int fieldNum) const60const char *SingleLineDelimTransferBuffer::getField(int fieldNum) const 61 { 62 if (fieldNum < _numFields) { 63 return _fields[fieldNum]; 64 } 65 cerr << "Error: Requested field " << fieldNum << "from TransferBuffer with only " << _numFields << " fields." <<endl; 66 exit(1); 67 } 68 clear(void)69void SingleLineDelimTransferBuffer::clear(void) 70 { 71 for (int i=0; i < _numFields; i++) { 72 memset(_fields[i], 0, MAX_FIELD_SIZE); 73 } 74 } 75