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/StreamFormatConverter.h
|
||||||
HEADERS += src/StreamBuffer.h
|
HEADERS += src/StreamBuffer.h
|
||||||
HEADERS += src/StreamError.h
|
HEADERS += src/StreamError.h
|
||||||
HEADERS += src/StreamVersion.h
|
|
||||||
HEADERS += src/StreamProtocol.h
|
HEADERS += src/StreamProtocol.h
|
||||||
HEADERS += src/StreamBusInterface.h
|
HEADERS += src/StreamBusInterface.h
|
||||||
HEADERS += src/StreamCore.h
|
HEADERS += src/StreamCore.h
|
||||||
HEADERS += src/MacroMagic.h
|
HEADERS += src/MacroMagic.h
|
||||||
|
HEADERS += $(COMMON_DIR)/StreamVersion.h
|
||||||
|
|
||||||
CPPFLAGS += -DSTREAM_INTERNAL -I$(COMMON_DIR)
|
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>
|
href="https://en.wikipedia.org/wiki/Longitudinal_redundancy_check">Wikipedia</a>.</dd>
|
||||||
<dt><code>%<hexlrc></code></dt>
|
<dt><code>%<hexlrc></code></dt>
|
||||||
<dd>One byte. The LRC for the hex digits. (Other characters are ignored.)</dd>
|
<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>
|
</dl>
|
||||||
|
|
||||||
<a name="regex"></a>
|
<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 += *data++;
|
||||||
}
|
}
|
||||||
sum = ~sum;
|
sum = ~sum;
|
||||||
|
sum &= 0xff;
|
||||||
if (sum < 32) sum+=32;
|
if (sum < 32) sum+=32;
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
@ -102,7 +102,7 @@ init(const void* s, ssize_t minsize)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// How the buffer looks like:
|
// How the buffer looks like:
|
||||||
// |----free-----|####used####|--------00--------|
|
// |----junk-----|####used####|--------00--------|
|
||||||
///|<--- offs -->|<-- len --->|<- cap-offs-len ->|
|
///|<--- offs -->|<-- len --->|<- cap-offs-len ->|
|
||||||
// 0 offs offs+len cap
|
// 0 offs offs+len cap
|
||||||
// |<-------------- minsize --------------->
|
// |<-------------- minsize --------------->
|
||||||
@ -254,39 +254,71 @@ replace(ssize_t remstart, ssize_t remlen, const void* ins, ssize_t inslen)
|
|||||||
if (inslen < 0) inslen = 0;
|
if (inslen < 0) inslen = 0;
|
||||||
size_t remend = remstart+remlen;
|
size_t remend = remstart+remlen;
|
||||||
size_t newlen = len+inslen-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)
|
if (cap <= newlen)
|
||||||
{
|
{
|
||||||
// buffer too short
|
// buffer too short, copy to new buffer
|
||||||
size_t 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); // copy content start
|
||||||
memcpy(newbuffer+remstart, ins, inslen);
|
memcpy(newbuffer+remstart, ins, inslen); // insert
|
||||||
memcpy(newbuffer+remstart+inslen, buffer+offs+remend, len-remend);
|
memcpy(newbuffer+remstart+inslen, buffer+offs+remend, len-remend); // copy content end
|
||||||
memset(newbuffer+newlen, 0, newcap-newlen);
|
memset(newbuffer+newlen, 0, newcap-newlen); // clear buffer end
|
||||||
if (buffer != local)
|
if (buffer != local)
|
||||||
{
|
delete[] buffer;
|
||||||
delete [] buffer;
|
|
||||||
}
|
|
||||||
buffer = newbuffer;
|
buffer = newbuffer;
|
||||||
cap = newcap;
|
cap = newcap;
|
||||||
offs = 0;
|
offs = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (newlen+offs<=cap)
|
if (offs+newlen < cap)
|
||||||
{
|
{
|
||||||
// move to start of buffer
|
// modified content still fits with current offs, just move content end
|
||||||
memmove(buffer+offs+remstart+inslen, buffer+offs+remend, len-remend);
|
if (newlen != len)
|
||||||
memcpy(buffer+offs+remstart, ins, inslen);
|
memmove(buffer+offs+remstart+inslen, buffer+offs+remend, len-remend); // move old content end if necessary
|
||||||
if (newlen<len) memset(buffer+offs+newlen, 0, len-newlen);
|
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
|
else
|
||||||
{
|
{
|
||||||
memmove(buffer,buffer+offs,remstart);
|
// move content to start of buffer
|
||||||
memmove(buffer+remstart+inslen, buffer+offs+remend, len-remend);
|
memmove(buffer, buffer+offs, remstart); // move content start to 0 offs
|
||||||
memcpy(buffer+remstart, ins, inslen);
|
memmove(buffer+remstart+inslen, buffer+offs+remend, len-remend); // move content end
|
||||||
if (newlen<len) memset(buffer+newlen, 0, len-newlen);
|
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;
|
offs = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user