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