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)9 SingleLineDelimTransferBuffer::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()20 SingleLineDelimTransferBuffer::~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)30 bool 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) const60 const 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)69 void SingleLineDelimTransferBuffer::clear(void)
70 {
71 	for (int i=0; i < _numFields; i++) {
72 		memset(_fields[i], 0, MAX_FIELD_SIZE);
73 	}
74 }
75