X-Git-Url: https://git.stg.codes/stg.git/blobdiff_plain/8c6fa3fbaccc22127280bf77a48fab5a3ee0716e..46b0747592074017ff0ea4b33d4a7194235886e5:/libs/ibpp/_spb.cpp diff --git a/libs/ibpp/_spb.cpp b/libs/ibpp/_spb.cpp new file mode 100644 index 00000000..632a0209 --- /dev/null +++ b/libs/ibpp/_spb.cpp @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////////// +// +// File : $Id: _spb.cpp,v 1.2 2009/03/19 20:00:27 faust Exp $ +// Subject : IBPP, internal SPB class implementation +// +/////////////////////////////////////////////////////////////////////////////// +// +// (C) Copyright 2000-2006 T.I.P. Group S.A. and the IBPP Team (www.ibpp.org) +// +// The contents of this file are subject to the IBPP License (the "License"); +// you may not use this file except in compliance with the License. You may +// obtain a copy of the License at http://www.ibpp.org or in the 'license.txt' +// file which must have been distributed along with this file. +// +// This software, distributed under the License, is distributed on an "AS IS" +// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +// License for the specific language governing rights and limitations +// under the License. +// +/////////////////////////////////////////////////////////////////////////////// +// +// COMMENTS +// * SPB == Service Parameter Block/Buffer, see Interbase 6.0 C-API +// * Tabulations should be set every four characters when editing this file. +// +/////////////////////////////////////////////////////////////////////////////// + +#ifdef _MSC_VER +#pragma warning(disable: 4786 4996) +#ifndef _DEBUG +#pragma warning(disable: 4702) +#endif +#endif + +#include "_ibpp.h" + +#ifdef HAS_HDRSTOP +#pragma hdrstop +#endif + +#include + +using namespace ibpp_internals; + +const int SPB::BUFFERINCR = 128; + +void SPB::Grow(int needed) +{ + if ((mSize + needed) > mAlloc) + { + // We need to grow the buffer. We use increments of BUFFERINCR bytes. + needed = (needed / BUFFERINCR + 1) * BUFFERINCR; + char* newbuffer = new char[mAlloc + needed]; + if (mBuffer != 0) + { + // Move the old buffer content to the new one + memcpy(newbuffer, mBuffer, mSize); + delete [] mBuffer; + } + mBuffer = newbuffer; + mAlloc += needed; + } +} + +void SPB::Insert(char opcode) +{ + Grow(1); + mBuffer[mSize++] = opcode; +} + +void SPB::InsertString(char type, int lenwidth, const char* data) +{ + int16_t len = (int16_t)strlen(data); + + Grow(1 + lenwidth + len); + mBuffer[mSize++] = type; + switch (lenwidth) + { + case 1 : mBuffer[mSize] = char(len); mSize++; break; + case 2 : *(int16_t*)&mBuffer[mSize] = int16_t((*gds.Call()->m_vax_integer)((char*)&len, 2)); + mSize += 2; break; + default : throw LogicExceptionImpl("IISPB::IISPB", _("Invalid length parameter")); + } + strncpy(&mBuffer[mSize], data, len); + mSize += len; +} + +void SPB::InsertByte(char type, char data) +{ + Grow(1 + 1); + mBuffer[mSize++] = type; + mBuffer[mSize++] = data; +} + +void SPB::InsertQuad(char type, int32_t data) +{ + Grow(1 + 4); + mBuffer[mSize++] = type; + *(int32_t*)&mBuffer[mSize] = int32_t((*gds.Call()->m_vax_integer)((char*)&data, 4)); + mSize += 4; +} + +void SPB::Reset() +{ + if (mBuffer != 0) + { + delete [] mBuffer; + mBuffer = 0; + mSize = 0; + mAlloc = 0; + } +} + +/* +void SPB::Insert(char type, short data) +{ + Grow(1 + 3); + mBuffer[mSize++] = type; + mBuffer[mSize++] = char(2); + *(short*)&mBuffer[mSize] = data; + mSize += 2; +} + +void SPB::Insert(char type, bool data) +{ + Grow(1 + 2); + mBuffer[mSize++] = type; + mBuffer[mSize++] = char(1); + mBuffer[mSize++] = char(data ? 1 : 0); +} +*/ + +// +// EOF +//