use size_t and ssize_t in streamBuffer
This commit is contained in:
@ -30,8 +30,10 @@
|
||||
#define vsnprintf epicsVsnprintf
|
||||
#endif
|
||||
|
||||
#define S PRINTF_SIZE_T_PREFIX
|
||||
|
||||
void StreamBuffer::
|
||||
init(const void* s, long minsize)
|
||||
init(const void* s, size_t minsize)
|
||||
{
|
||||
len = 0;
|
||||
offs = 0;
|
||||
@ -62,11 +64,11 @@ init(const void* s, long minsize)
|
||||
|
||||
|
||||
void StreamBuffer::
|
||||
grow(long minsize)
|
||||
grow(size_t minsize)
|
||||
{
|
||||
// make space for minsize + 1 (for termination) bytes
|
||||
char* newbuffer;
|
||||
long newcap;
|
||||
size_t newcap;
|
||||
#ifdef EXPLODE
|
||||
if (minsize > 1000000)
|
||||
{
|
||||
@ -117,12 +119,12 @@ grow(long minsize)
|
||||
}
|
||||
|
||||
StreamBuffer& StreamBuffer::
|
||||
append(const void* s, long size)
|
||||
append(const void* s, ssize_t size)
|
||||
{
|
||||
if (size <= 0)
|
||||
{
|
||||
// append negative number of bytes? let's delete some
|
||||
if (size < -len) size = -len;
|
||||
if ((size_t)-size > len) size = -len;
|
||||
memset (buffer+offs+len+size, 0, -size);
|
||||
}
|
||||
else
|
||||
@ -135,7 +137,7 @@ append(const void* s, long size)
|
||||
}
|
||||
|
||||
long int StreamBuffer::
|
||||
find(const void* m, long size, long start) const
|
||||
find(const void* m, size_t size, ssize_t start) const
|
||||
{
|
||||
if (start < 0)
|
||||
{
|
||||
@ -147,7 +149,7 @@ find(const void* m, long size, long start) const
|
||||
const char* s = static_cast<const char*>(m);
|
||||
char* b = buffer+offs;
|
||||
char* p = b+start;
|
||||
long i;
|
||||
size_t i;
|
||||
while ((p = static_cast<char*>(memchr(p, s[0], b-p+len-size+1))))
|
||||
{
|
||||
for (i = 1; i < size; i++)
|
||||
@ -161,7 +163,7 @@ next: p++;
|
||||
}
|
||||
|
||||
StreamBuffer& StreamBuffer::
|
||||
replace(long remstart, long remlen, const void* ins, long inslen)
|
||||
replace(ssize_t remstart, ssize_t remlen, const void* ins, ssize_t inslen)
|
||||
{
|
||||
if (remstart < 0)
|
||||
{
|
||||
@ -187,12 +189,12 @@ replace(long remstart, long remlen, const void* ins, long inslen)
|
||||
remlen += remstart;
|
||||
remstart = 0;
|
||||
}
|
||||
if (remstart > len)
|
||||
if ((size_t)remstart > len)
|
||||
{
|
||||
// remove begins after bufferend
|
||||
remstart = len;
|
||||
}
|
||||
if (remlen >= len-remstart)
|
||||
if ((size_t)remlen >= len-remstart)
|
||||
{
|
||||
// truncate remove after bufferend
|
||||
remlen = len-remstart;
|
||||
@ -205,12 +207,12 @@ replace(long remstart, long remlen, const void* ins, long inslen)
|
||||
return *this;
|
||||
}
|
||||
if (inslen < 0) inslen = 0;
|
||||
long remend = remstart+remlen;
|
||||
long newlen = len+inslen-remlen;
|
||||
size_t remend = remstart+remlen;
|
||||
size_t newlen = len+inslen-remlen;
|
||||
if (cap <= newlen)
|
||||
{
|
||||
// buffer too short
|
||||
long newcap;
|
||||
size_t newcap;
|
||||
for (newcap = sizeof(local)*2; newcap <= newlen; newcap *= 2);
|
||||
char* newbuffer = new char[newcap];
|
||||
memcpy(newbuffer, buffer+offs, remstart);
|
||||
@ -251,13 +253,13 @@ StreamBuffer& StreamBuffer::
|
||||
print(const char* fmt, ...)
|
||||
{
|
||||
va_list va;
|
||||
int printed;
|
||||
ssize_t printed;
|
||||
while (1)
|
||||
{
|
||||
va_start(va, fmt);
|
||||
printed = vsnprintf(buffer+offs+len, cap-offs-len, fmt, va);
|
||||
va_end(va);
|
||||
if (printed > -1 && printed < (int)(cap-offs-len))
|
||||
if (printed > -1 && printed < (ssize_t)(cap-offs-len))
|
||||
{
|
||||
len += printed;
|
||||
return *this;
|
||||
@ -267,9 +269,9 @@ print(const char* fmt, ...)
|
||||
}
|
||||
}
|
||||
|
||||
StreamBuffer StreamBuffer::expand(long start, long length) const
|
||||
StreamBuffer StreamBuffer::expand(ssize_t start, ssize_t length) const
|
||||
{
|
||||
long end;
|
||||
size_t end;
|
||||
if (start < 0)
|
||||
{
|
||||
start += len;
|
||||
@ -289,7 +291,7 @@ StreamBuffer StreamBuffer::expand(long start, long length) const
|
||||
StreamBuffer result((end-start)*2);
|
||||
start += offs;
|
||||
end += offs;
|
||||
long i;
|
||||
size_t i;
|
||||
char c;
|
||||
for (i = start; i < end; i++)
|
||||
{
|
||||
@ -311,8 +313,8 @@ dump() const
|
||||
{
|
||||
StreamBuffer result(256+cap*5);
|
||||
result.append("\033[0m");
|
||||
long i;
|
||||
result.print("%ld,%ld,%ld:\033[37m", offs, len, cap);
|
||||
size_t i;
|
||||
result.print("%"S"d,%"S"d,%"S"d:\033[37m", offs, len, cap);
|
||||
for (i = 0; i < cap; i++)
|
||||
{
|
||||
if (i == offs) result.append("\033[34m[\033[0m");
|
||||
|
@ -21,6 +21,7 @@
|
||||
#define StreamBuffer_h
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef __GNUC__
|
||||
#define __attribute__(x)
|
||||
@ -29,17 +30,17 @@
|
||||
class StreamBuffer
|
||||
{
|
||||
char local[64];
|
||||
long len;
|
||||
long cap;
|
||||
long offs;
|
||||
size_t len;
|
||||
size_t cap;
|
||||
size_t offs;
|
||||
char* buffer;
|
||||
|
||||
void init(const void* s, long minsize);
|
||||
void init(const void* s, size_t minsize);
|
||||
|
||||
void check(long size)
|
||||
void check(size_t size)
|
||||
{if (len+offs+size >= cap) grow(len+size);}
|
||||
|
||||
void grow(long minsize);
|
||||
void grow(size_t minsize);
|
||||
|
||||
public:
|
||||
// Hints:
|
||||
@ -54,7 +55,7 @@ public:
|
||||
StreamBuffer()
|
||||
{init(NULL, 0);}
|
||||
|
||||
StreamBuffer(const void* s, long size)
|
||||
StreamBuffer(const void* s, size_t size)
|
||||
{init(s, size);}
|
||||
|
||||
StreamBuffer(const char* s)
|
||||
@ -63,24 +64,24 @@ public:
|
||||
StreamBuffer(const StreamBuffer& s)
|
||||
{init(s.buffer+s.offs, s.len);}
|
||||
|
||||
StreamBuffer(long size)
|
||||
StreamBuffer(size_t size)
|
||||
{init(NULL, size);}
|
||||
|
||||
~StreamBuffer()
|
||||
{if (buffer != local) delete buffer;}
|
||||
|
||||
// operator (): get char* pointing to index
|
||||
const char* operator()(long index=0) const
|
||||
const char* operator()(ssize_t index=0) const
|
||||
{return buffer+offs+(index<0?index+len:index);}
|
||||
|
||||
char* operator()(long index=0)
|
||||
char* operator()(ssize_t index=0)
|
||||
{return buffer+offs+(index<0?index+len:index);}
|
||||
|
||||
// operator []: get byte at index
|
||||
char operator[](long index) const
|
||||
char operator[](ssize_t index) const
|
||||
{return buffer[offs+(index<0?index+len:index)];}
|
||||
|
||||
char& operator[](long index)
|
||||
char& operator[](ssize_t index)
|
||||
{return buffer[offs+(index<0?index+len:index)];}
|
||||
|
||||
// cast to bool: not empty?
|
||||
@ -88,11 +89,11 @@ public:
|
||||
{return len>0;}
|
||||
|
||||
// length: get current data length
|
||||
long length() const
|
||||
ssize_t length() const
|
||||
{return len;}
|
||||
|
||||
// capacity: get current max data length (spare one byte for end)
|
||||
long capacity() const
|
||||
ssize_t capacity() const
|
||||
{return cap-1;}
|
||||
|
||||
// end: get pointer to byte after last data byte
|
||||
@ -105,19 +106,19 @@ public:
|
||||
|
||||
// reserve: reserve size bytes of memory and return
|
||||
// pointer to that memory (for copying something to it)
|
||||
char* reserve(long size)
|
||||
char* reserve(size_t size)
|
||||
{check(size); char* p=buffer+offs+len; len+=size; return p;}
|
||||
|
||||
// append: append data at the end of the buffer
|
||||
StreamBuffer& append(char c)
|
||||
{check(1); buffer[offs+len++]=c; return *this;}
|
||||
|
||||
StreamBuffer& append(char c, long count)
|
||||
StreamBuffer& append(char c, ssize_t count)
|
||||
{if (count < 0) truncate(count);
|
||||
else {check(count); memset(buffer+offs+len, c, count); len+=count;}
|
||||
return *this;}
|
||||
|
||||
StreamBuffer& append(const void* s, long size);
|
||||
StreamBuffer& append(const void* s, ssize_t size);
|
||||
|
||||
StreamBuffer& append(const char* s)
|
||||
{return append(s, s?strlen(s):0);}
|
||||
@ -136,7 +137,7 @@ public:
|
||||
{return append(s);}
|
||||
|
||||
// set: clear buffer and fill with new data
|
||||
StreamBuffer& set(const void* s, long size)
|
||||
StreamBuffer& set(const void* s, size_t size)
|
||||
{clear(); return append(s, size);}
|
||||
|
||||
StreamBuffer& set(const char* s)
|
||||
@ -154,61 +155,61 @@ public:
|
||||
|
||||
// replace: delete part of buffer (pos/length) and insert new data
|
||||
StreamBuffer& replace(
|
||||
long pos, long length, const void* s, long size);
|
||||
ssize_t pos, ssize_t length, const void* s, ssize_t size);
|
||||
|
||||
StreamBuffer& replace(long pos, long length, const char* s)
|
||||
StreamBuffer& replace(ssize_t pos, ssize_t length, const char* s)
|
||||
{return replace(pos, length, s, s?strlen(s):0);}
|
||||
|
||||
StreamBuffer& replace(long pos, long length, const StreamBuffer& s)
|
||||
StreamBuffer& replace(ssize_t pos, ssize_t length, const StreamBuffer& s)
|
||||
{return replace(pos, length, s.buffer+s.offs, s.len);}
|
||||
|
||||
// remove: delete from start/pos
|
||||
StreamBuffer& remove(long pos, long length)
|
||||
StreamBuffer& remove(ssize_t pos, ssize_t length)
|
||||
{return replace(pos, length, NULL, 0);}
|
||||
|
||||
// remove from start: no memset, no function call, fast!
|
||||
StreamBuffer& remove(long length)
|
||||
StreamBuffer& remove(size_t length)
|
||||
{if (length>len) length=len;
|
||||
offs+=length; len-=length; return *this;}
|
||||
|
||||
// truncate: delete end of buffer
|
||||
StreamBuffer& truncate(long pos)
|
||||
StreamBuffer& truncate(ssize_t pos)
|
||||
{return replace(pos, len, NULL, 0);}
|
||||
|
||||
// insert: insert new data into buffer
|
||||
StreamBuffer& insert(long pos, const void* s, long size)
|
||||
StreamBuffer& insert(ssize_t pos, const void* s, ssize_t size)
|
||||
{return replace(pos, 0, s, size);}
|
||||
|
||||
StreamBuffer& insert(long pos, const char* s)
|
||||
StreamBuffer& insert(ssize_t pos, const char* s)
|
||||
{return replace(pos, 0, s, s?strlen(s):0);}
|
||||
|
||||
StreamBuffer& insert(long pos, const StreamBuffer& s)
|
||||
StreamBuffer& insert(ssize_t pos, const StreamBuffer& s)
|
||||
{return replace(pos, 0, s.buffer+s.offs, s.len);}
|
||||
|
||||
StreamBuffer& insert(long pos, char c)
|
||||
StreamBuffer& insert(ssize_t pos, char c)
|
||||
{return replace(pos, 0, &c, 1);}
|
||||
|
||||
StreamBuffer& print(const char* fmt, ...)
|
||||
__attribute__ ((format(printf,2,3)));
|
||||
|
||||
// find: get index of data in buffer or -1
|
||||
long find(char c, long start=0) const
|
||||
long find(char c, ssize_t start=0) const
|
||||
{char* p;
|
||||
return (p = static_cast<char*>(
|
||||
memchr(buffer+offs+(start<0?start+len:start),
|
||||
c, start<0?-start:len-start)))?
|
||||
p-(buffer+offs) : -1;}
|
||||
|
||||
long find(const void* s, long size, long start=0) const;
|
||||
long find(const void* s, size_t size, ssize_t start=0) const;
|
||||
|
||||
long find(const char* s, long start=0) const
|
||||
long find(const char* s, ssize_t start=0) const
|
||||
{return find(s, s?strlen(s):0, start);}
|
||||
|
||||
long int find(const StreamBuffer& s, long start=0) const
|
||||
long int find(const StreamBuffer& s, ssize_t start=0) const
|
||||
{return find(s.buffer+s.offs, s.len, start);}
|
||||
|
||||
// startswith: returns true if first size bytes are equal
|
||||
bool startswith(const void* s, long size) const
|
||||
bool startswith(const void* s, size_t size) const
|
||||
{return len>=size ? memcmp(buffer+offs, s, size) == 0 : false;}
|
||||
|
||||
// startswith: returns true if first string is equal (empty string matches)
|
||||
@ -217,9 +218,9 @@ public:
|
||||
|
||||
// expand: create copy of StreamBuffer where all nonprintable characters
|
||||
// are replaced by <xx> with xx being the hex code of the characters
|
||||
StreamBuffer expand(long start, long length) const;
|
||||
StreamBuffer expand(ssize_t start, ssize_t length) const;
|
||||
|
||||
StreamBuffer expand(long start=0) const
|
||||
StreamBuffer expand(ssize_t start=0) const
|
||||
{return expand(start, len);}
|
||||
|
||||
// dump: debug function, like expand but also show the 'hidden' memory
|
||||
@ -227,4 +228,13 @@ public:
|
||||
StreamBuffer dump() const;
|
||||
};
|
||||
|
||||
// printf size prefix for size_t and ssize_t
|
||||
#if defined (__GNUC__) && __GNUC__ >= 3
|
||||
#define PRINTF_SIZE_T_PREFIX "z"
|
||||
#elif defined (_WIN32)
|
||||
#define PRINTF_SIZE_T_PREFIX "I"
|
||||
#else
|
||||
#define PRINTF_SIZE_T_PREFIX ""
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define S PRINTF_SIZE_T_PREFIX
|
||||
|
||||
enum Commands { end_cmd, in_cmd, out_cmd, wait_cmd, event_cmd, exec_cmd,
|
||||
connect_cmd, disconnect_cmd };
|
||||
const char* commandStr[] = { "end", "in", "out", "wait", "event", "exec",
|
||||
@ -983,7 +985,7 @@ readCallback(StreamIoStatus status,
|
||||
finishProtocol(ReplyTimeout);
|
||||
return 0;
|
||||
case StreamIoFault:
|
||||
error("%s: I/O error after reading %ld byte%s: \"%s%s\"\n",
|
||||
error("%s: I/O error after reading %"S"d byte%s: \"%s%s\"\n",
|
||||
name(),
|
||||
inputBuffer.length(), inputBuffer.length()==1 ? "" : "s",
|
||||
inputBuffer.length() > 20 ? "..." : "",
|
||||
@ -992,7 +994,7 @@ readCallback(StreamIoStatus status,
|
||||
return 0;
|
||||
}
|
||||
inputBuffer.append(input, size);
|
||||
debug("StreamCore::readCallback(%s) inputBuffer=\"%s\", size %ld\n",
|
||||
debug("StreamCore::readCallback(%s) inputBuffer=\"%s\", size %"S"d\n",
|
||||
name(), inputBuffer.expand()(), inputBuffer.length());
|
||||
if (*activeCommand != in_cmd)
|
||||
{
|
||||
|
Reference in New Issue
Block a user