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