diff --git a/src/StreamBuffer.cc b/src/StreamBuffer.cc index 1bbb525..b08e248 100644 --- a/src/StreamBuffer.cc +++ b/src/StreamBuffer.cc @@ -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(m); char* b = buffer+offs; char* p = b+start; - long i; + size_t i; while ((p = static_cast(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"); diff --git a/src/StreamBuffer.h b/src/StreamBuffer.h index a081b5b..2dd5d58 100644 --- a/src/StreamBuffer.h +++ b/src/StreamBuffer.h @@ -21,6 +21,7 @@ #define StreamBuffer_h #include +#include #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( 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 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 diff --git a/src/StreamCore.cc b/src/StreamCore.cc index ec821ce..df1524e 100644 --- a/src/StreamCore.cc +++ b/src/StreamCore.cc @@ -23,6 +23,8 @@ #include #include +#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) {