Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
1496089bc8 | |||
a090cd4d8f | |||
211f689cdf | |||
793675bb12 |
@ -24,11 +24,11 @@ HEADERS += src/StreamFormat.h
|
||||
HEADERS += src/StreamFormatConverter.h
|
||||
HEADERS += src/StreamBuffer.h
|
||||
HEADERS += src/StreamError.h
|
||||
HEADERS += src/StreamVersion.h
|
||||
HEADERS += src/StreamProtocol.h
|
||||
HEADERS += src/StreamBusInterface.h
|
||||
HEADERS += src/StreamCore.h
|
||||
HEADERS += src/MacroMagic.h
|
||||
HEADERS += $(COMMON_DIR)/StreamVersion.h
|
||||
|
||||
CPPFLAGS += -DSTREAM_INTERNAL -I$(COMMON_DIR)
|
||||
|
||||
|
@ -594,6 +594,18 @@ In input, the next byte or bytes must match the checksum.
|
||||
href="https://en.wikipedia.org/wiki/Longitudinal_redundancy_check">Wikipedia</a>.</dd>
|
||||
<dt><code>%<hexlrc></code></dt>
|
||||
<dd>One byte. The LRC for the hex digits. (Other characters are ignored.)</dd>
|
||||
<dt><code>%<leybold></code></dt>
|
||||
<dd>One byte. Used by some Leybold products. 255-bytesum%255 (+32 if result would be <32)</dd>
|
||||
<dt><code>%<brksCryo></code></dt>
|
||||
<dd>One byte. Used by Brooks Cryopumps.</dd>
|
||||
<dt><code>%<CPI></code></dt>
|
||||
<dd>One byte. Used by TRIUMF CPI RF amplifier.</dd>
|
||||
<dt><code>%<bitsum></code> or <code>%<bitsum8></code></dt>
|
||||
<dd>One byte. Number of 1 bits in all characters.</dd>
|
||||
<dt><code>%<bitsum16></code></dt>
|
||||
<dd>Two bytes. Number of 1 bits in all characters.</dd>
|
||||
<dt><code>%<bitsum32></code></dt>
|
||||
<dd>Four bytes. Number of 1 bits in all characters.</dd>
|
||||
</dl>
|
||||
|
||||
<a name="regex"></a>
|
||||
|
@ -548,6 +548,7 @@ static uint32_t leybold(const uint8_t* data, size_t len, uint32_t sum)
|
||||
sum += *data++;
|
||||
}
|
||||
sum = ~sum;
|
||||
sum &= 0xff;
|
||||
if (sum < 32) sum+=32;
|
||||
return sum;
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ init(const void* s, ssize_t minsize)
|
||||
}
|
||||
|
||||
// How the buffer looks like:
|
||||
// |----free-----|####used####|--------00--------|
|
||||
// |----junk-----|####used####|--------00--------|
|
||||
///|<--- offs -->|<-- len --->|<- cap-offs-len ->|
|
||||
// 0 offs offs+len cap
|
||||
// |<-------------- minsize --------------->
|
||||
@ -254,39 +254,71 @@ replace(ssize_t remstart, ssize_t remlen, const void* ins, ssize_t inslen)
|
||||
if (inslen < 0) inslen = 0;
|
||||
size_t remend = remstart+remlen;
|
||||
size_t newlen = len+inslen-remlen;
|
||||
|
||||
// How the buffer looks like before and after:
|
||||
// |---junk---|##content_start##|/////////remove_this////////|##content_end##|0000|
|
||||
// |<- offs ->|<-- remstart --->|<--------- remlen --------->| | |
|
||||
// | |<--------------------- len ---------------------------------->| |
|
||||
// 0 offs offs+remstart offs+remend offs+len cap
|
||||
//
|
||||
// If content size stays the same, no need to move old content:
|
||||
// |---junk---|##content_start##|+++++++inserted_text++++++++|##content_end##|0000|
|
||||
// |<----- inslen==remlen ----->| newlen==len
|
||||
//
|
||||
// If content shrinks (need to clear end of buffer): |< clear this >|
|
||||
// |---junk---|##content_start##|inserted_text|##content_end##|00000000000000|0000|
|
||||
// 0 offs |<- inslen -->| |< len-newlen >|
|
||||
// offs+newlen offs+len
|
||||
//
|
||||
// If content grows but still fits (make sure to keep at least one 0 byte at end):
|
||||
// |---junk---|##content_start##|++++++++inserted_text++++++++++|##content_end##|0|
|
||||
// |<- offs ->|<--------------------- newlen ---------------------------------->| |
|
||||
// 0 offs offs+newlen<cap
|
||||
//
|
||||
// If content would overflow, moving to offs 0 may help:
|
||||
// May need to clear end if newlen < offs+len: |<clear>|
|
||||
// |##content_start##|++++++++inserted_text++++++++++|##content_end##|0000000|0000|
|
||||
// |<--------------------- newlen ---------------------------------->| |
|
||||
// newlen offs+len
|
||||
//
|
||||
// Otherwise we need to copy to a new buffer.
|
||||
|
||||
|
||||
if (cap <= newlen)
|
||||
{
|
||||
// buffer too short
|
||||
// buffer too short, copy to new buffer
|
||||
size_t newcap;
|
||||
for (newcap = sizeof(local)*2; newcap <= newlen; newcap *= 2);
|
||||
char* newbuffer = new char[newcap];
|
||||
memcpy(newbuffer, buffer+offs, remstart);
|
||||
memcpy(newbuffer+remstart, ins, inslen);
|
||||
memcpy(newbuffer+remstart+inslen, buffer+offs+remend, len-remend);
|
||||
memset(newbuffer+newlen, 0, newcap-newlen);
|
||||
memcpy(newbuffer, buffer+offs, remstart); // copy content start
|
||||
memcpy(newbuffer+remstart, ins, inslen); // insert
|
||||
memcpy(newbuffer+remstart+inslen, buffer+offs+remend, len-remend); // copy content end
|
||||
memset(newbuffer+newlen, 0, newcap-newlen); // clear buffer end
|
||||
if (buffer != local)
|
||||
{
|
||||
delete [] buffer;
|
||||
}
|
||||
delete[] buffer;
|
||||
buffer = newbuffer;
|
||||
cap = newcap;
|
||||
offs = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (newlen+offs<=cap)
|
||||
if (offs+newlen < cap)
|
||||
{
|
||||
// move to start of buffer
|
||||
memmove(buffer+offs+remstart+inslen, buffer+offs+remend, len-remend);
|
||||
memcpy(buffer+offs+remstart, ins, inslen);
|
||||
if (newlen<len) memset(buffer+offs+newlen, 0, len-newlen);
|
||||
// modified content still fits with current offs, just move content end
|
||||
if (newlen != len)
|
||||
memmove(buffer+offs+remstart+inslen, buffer+offs+remend, len-remend); // move old content end if necessary
|
||||
memcpy(buffer+offs+remstart, ins, inslen); // insert before
|
||||
if (newlen < len)
|
||||
memset(buffer+offs+newlen, 0, len-newlen); // clear buffer end if content shrunk
|
||||
}
|
||||
else
|
||||
{
|
||||
memmove(buffer,buffer+offs,remstart);
|
||||
memmove(buffer+remstart+inslen, buffer+offs+remend, len-remend);
|
||||
memcpy(buffer+remstart, ins, inslen);
|
||||
if (newlen<len) memset(buffer+newlen, 0, len-newlen);
|
||||
// move content to start of buffer
|
||||
memmove(buffer, buffer+offs, remstart); // move content start to 0 offs
|
||||
memmove(buffer+remstart+inslen, buffer+offs+remend, len-remend); // move content end
|
||||
memcpy(buffer+remstart, ins, inslen); // insert in between
|
||||
if (newlen < offs+len)
|
||||
memset(buffer+newlen, 0, offs+len-newlen); // clear buffer end if necessary
|
||||
offs = 0;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user