unsigned g_PackInteger(void* dst, size_t dst_size, Uint8 number)
113if ((signed char) number >= 0 && (unsigned char) number == number) {
115*(unsigned char*) dst = (unsigned char) number;
119unsigned char buffer[sizeof(number)];
120unsigned char *ptr = buffer + sizeof(buffer) - 1;
122*ptr = (unsigned char) number;
128while ((number >>= 8) > (mask_shift = (mask >> 1))) {
129*--ptr = (unsigned char) number;
134if (dst_size > length) {
135*(unsigned char*) dst = (unsigned char) (~mask | number);
137memcpy(((unsigned char*) dst) + 1, ptr, length);
145REC(2, 0x00), REC(2, 0x01), REC(2, 0x02), REC(2, 0x03), REC(2, 0x04), \
146REC(2, 0x05), REC(2, 0x06), REC(2, 0x07), REC(2, 0x08), REC(2, 0x09), \
147REC(2, 0x0A), REC(2, 0x0B), REC(2, 0x0C), REC(2, 0x0D), REC(2, 0x0E), \
148REC(2, 0x0F), REC(2, 0x10), REC(2, 0x11), REC(2, 0x12), REC(2, 0x13), \
149REC(2, 0x14), REC(2, 0x15), REC(2, 0x16), REC(2, 0x17), REC(2, 0x18), \
150REC(2, 0x19), REC(2, 0x1A), REC(2, 0x1B), REC(2, 0x1C), REC(2, 0x1D), \
151REC(2, 0x1E), REC(2, 0x1F), REC(2, 0x20), REC(2, 0x21), REC(2, 0x22), \
152REC(2, 0x23), REC(2, 0x24), REC(2, 0x25), REC(2, 0x26), REC(2, 0x27), \
153REC(2, 0x28), REC(2, 0x29), REC(2, 0x2A), REC(2, 0x2B), REC(2, 0x2C), \
154REC(2, 0x2D), REC(2, 0x2E), REC(2, 0x2F), REC(2, 0x30), REC(2, 0x31), \
155REC(2, 0x32), REC(2, 0x33), REC(2, 0x34), REC(2, 0x35), REC(2, 0x36), \
156REC(2, 0x37), REC(2, 0x38), REC(2, 0x39), REC(2, 0x3A), REC(2, 0x3B), \
157REC(2, 0x3C), REC(2, 0x3D), REC(2, 0x3E), REC(2, 0x3F), REC(3, 0x00), \
158REC(3, 0x01), REC(3, 0x02), REC(3, 0x03), REC(3, 0x04), REC(3, 0x05), \
159REC(3, 0x06), REC(3, 0x07), REC(3, 0x08), REC(3, 0x09), REC(3, 0x0A), \
160REC(3, 0x0B), REC(3, 0x0C), REC(3, 0x0D), REC(3, 0x0E), REC(3, 0x0F), \
161REC(3, 0x10), REC(3, 0x11), REC(3, 0x12), REC(3, 0x13), REC(3, 0x14), \
162REC(3, 0x15), REC(3, 0x16), REC(3, 0x17), REC(3, 0x18), REC(3, 0x19), \
163REC(3, 0x1A), REC(3, 0x1B), REC(3, 0x1C), REC(3, 0x1D), REC(3, 0x1E), \
164REC(3, 0x1F), REC(4, 0x00), REC(4, 0x01), REC(4, 0x02), REC(4, 0x03), \
165REC(4, 0x04), REC(4, 0x05), REC(4, 0x06), REC(4, 0x07), REC(4, 0x08), \
166REC(4, 0x09), REC(4, 0x0A), REC(4, 0x0B), REC(4, 0x0C), REC(4, 0x0D), \
167REC(4, 0x0E), REC(4, 0x0F), REC(5, 0x00), REC(5, 0x01), REC(5, 0x02), \
168REC(5, 0x03), REC(5, 0x04), REC(5, 0x05), REC(5, 0x06), REC(5, 0x07), \
169REC(6, 0x00), REC(6, 0x01), REC(6, 0x02), REC(6, 0x03), REC(7, 0x00), \
170REC(7, 0x01), REC(8, 0x00), REC(9, 0x00) \
173#define REC(length, bits) {length, (bits << 8)}
179} static const s_CodeRec[128] = REC_DATA;
203unsigned g_UnpackInteger(const void* src, size_t src_size, Uint8* number)
205const unsigned char* ptr = (const unsigned char*) src;
212if ((signed char) *ptr >= 0) {
213*number = (Uint8) *ptr;
217SCodeRec acc = s_CodeRec[*ptr - 0x80];
219if (src_size >= acc.length) {
220unsigned count = acc.length - 1;
235struct SIDPackingBuffer
242void PackCode(char code);
243void PackTypePrefix(ECompoundIDFieldType field_type)
245PackCode(s_TypePrefix[field_type]);
247void PackNumber(Uint8 number);
248void PackUint4(Uint4 number);
249void PackPort(Uint2 port);
250void PackCompoundID(SCompoundIDImpl* cid_impl);
252SIDPackingBuffer() : m_Ptr(m_Buffer), m_FreeSpace(sizeof(m_Buffer)) {}
255void SIDPackingBuffer::Overflow()
257NCBI_THROW(CCompoundIDException, eIDTooLong,
258"Cannot create CompoundID: buffer overflow");
261void SIDPackingBuffer::PackCode(char code)
263if (m_FreeSpace == 0)
269void SIDPackingBuffer::PackNumber(Uint8 number)
271unsigned packed_size = g_PackInteger(m_Ptr, m_FreeSpace, number);
272if (packed_size > m_FreeSpace)
274m_Ptr += packed_size;
275m_FreeSpace -= packed_size;
278void SIDPackingBuffer::PackUint4(Uint4 number)
282memcpy(m_Ptr, &number, 4);
287void SIDPackingBuffer::PackPort(Uint2 port)
291port = CSocketAPI::HostToNetShort(port);
292memcpy(m_Ptr, &port, 2);
297void SIDPackingBuffer::PackCompoundID(SCompoundIDImpl* cid_impl)
299PackNumber(cid_impl->m_Class);
301SCompoundIDFieldImpl* field = cid_impl->m_FieldList.m_Head;
303while (field != NULL) {
304switch (field->m_Type) {
309PackTypePrefix(field->m_Type);
310PackNumber(field->m_Uint8Value);
313if (field->m_Int8Value >= 0) {
315PackNumber(field->m_Int8Value);
318PackNumber(-field->m_Int8Value);
321case eCIT_ServiceName:
322case eCIT_DatabaseName:
328PackTypePrefix(field->m_Type);
329PackNumber(field->m_StringValue.length());
330if (m_FreeSpace < field->m_StringValue.length())
332memcpy(m_Ptr, field->m_StringValue.data(),
333field->m_StringValue.length());
334m_Ptr += field->m_StringValue.length();
335m_FreeSpace -= field->m_StringValue.length();
338PackCode(CIT_TIMESTAMP_FIELD_CODE);
339PackNumber(field->m_Int8Value);
342PackCode(CIT_RANDOM_FIELD_CODE);
343PackUint4(CSocketAPI::HostToNetLong(field->m_Uint4Value));
345case eCIT_IPv4Address:
346PackCode(CIT_IPV4_ADDRESS_FIELD_CODE);
347PackUint4(field->m_IPv4SockAddr.m_IPv4Addr);
350PackCode(CIT_PORT_FIELD_CODE);
351PackPort(field->m_IPv4SockAddr.m_Port);
353case eCIT_IPv4SockAddr:
354PackCode(CIT_IPV4_SOCK_ADDR_FIELD_CODE);
355PackUint4(field->m_IPv4SockAddr.m_IPv4Addr);
356PackPort(field->m_IPv4SockAddr.m_Port);
359PackCode(field->m_BoolValue ? 'Y' : 'N');
363PackCompoundID(field->m_NestedCID);
367case eCIT_NumberOfTypes:
371field = cid_impl->m_FieldList.GetNext(field);
375string SCompoundIDImpl::PackV0()
378SIDPackingBuffer buffer;
380buffer.PackCompoundID(this);
382g_PackID(buffer.m_Buffer, buffer.m_Ptr - buffer.m_Buffer, m_PackedID);
392SIDUnpacking(const string& packed_id) : m_PackedID(packed_id)
394if (!g_UnpackID(packed_id, m_BinaryID)) {
395NCBI_THROW_FMT(CCompoundIDException, eInvalidFormat,
396"Invalid CompoundID format: " << packed_id);
398m_Ptr = m_BinaryID.data();
399m_RemainingBytes = m_BinaryID.length();
402Uint8 ExtractNumber();
404string ExtractString();
405Uint4 ExtractUint4();
407CCompoundID ExtractCID(SCompoundIDPoolImpl* pool_impl);
412size_t m_RemainingBytes;
415Uint8 SIDUnpacking::ExtractNumber()
419unsigned number_len = g_UnpackInteger(m_Ptr, m_RemainingBytes, &number);
421if (number_len > m_RemainingBytes) {
422NCBI_THROW_FMT(CCompoundIDException, eInvalidFormat,
423"Invalid CompoundID format: " << m_PackedID);
427m_RemainingBytes -= number_len;
432char SIDUnpacking::ExtractCode()
438string SIDUnpacking::ExtractString()
440Uint8 string_len = ExtractNumber();
442if (m_RemainingBytes < string_len) {
443NCBI_THROW_FMT(CCompoundIDException, eInvalidFormat,
444"Invalid CompoundID format: " << m_PackedID);
447string result(m_Ptr, (string::size_type) string_len);
450m_RemainingBytes -= (string::size_type) string_len;
455Uint4 SIDUnpacking::ExtractUint4()
457if (m_RemainingBytes < 4) {
458NCBI_THROW_FMT(CCompoundIDException, eInvalidFormat,
459"Invalid CompoundID format: " << m_PackedID);
464memcpy(&number, m_Ptr, 4);
467m_RemainingBytes -= 4;
472Uint2 SIDUnpacking::ExtractPort()
474if (m_RemainingBytes < 2) {
475NCBI_THROW_FMT(CCompoundIDException, eInvalidFormat,
476"Invalid CompoundID format: " << m_PackedID);
481memcpy(&port, m_Ptr, 2);
484m_RemainingBytes -= 2;
486return CSocketAPI::NetToHostShort(port);
489CCompoundID SIDUnpacking::ExtractCID(SCompoundIDPoolImpl* pool_impl)
491Uint8 id_class = ExtractNumber();
493if (id_class >= eCIC_NumberOfClasses) {
494NCBI_THROW_FMT(CCompoundIDException, eInvalidFormat,
495"Unknown CompoundID class: " << m_PackedID);
498CCompoundID new_cid(pool_impl->m_CompoundIDPool.Alloc());
499new_cid->Reset(pool_impl, (ECompoundIDClass) id_class);
501while (m_RemainingBytes > 0) {
502switch (ExtractCode()) {
503case CIT_ID_FIELD_CODE:
504new_cid.AppendID(ExtractNumber());
507new_cid.AppendInteger(ExtractNumber());
510new_cid.AppendInteger(-(Int8) ExtractNumber());
512case CIT_SERVICE_NAME_FIELD_CODE:
513new_cid.AppendServiceName(ExtractString());
515case CIT_DATABASE_NAME_FIELD_CODE:
516new_cid.AppendDatabaseName(ExtractString());
518case CIT_TIMESTAMP_FIELD_CODE:
519new_cid.AppendTimestamp(ExtractNumber());
521case CIT_RANDOM_FIELD_CODE:
522new_cid.AppendRandom(CSocketAPI::NetToHostLong(ExtractUint4()));
524case CIT_IPV4_ADDRESS_FIELD_CODE:
525new_cid.AppendIPv4Address(ExtractUint4());
527case CIT_HOST_FIELD_CODE:
528new_cid.AppendHost(ExtractString());
530case CIT_PORT_FIELD_CODE:
531new_cid.AppendPort(ExtractPort());
533case CIT_IPV4_SOCK_ADDR_FIELD_CODE:
535Uint4 host = ExtractUint4();
536Uint2 port = ExtractPort();
537new_cid.AppendIPv4SockAddr(host, port);
540case CIT_OBJECTREF_FIELD_CODE:
541new_cid.AppendObjectRef(ExtractString());
543case CIT_STRING_FIELD_CODE:
544new_cid.AppendString(ExtractString());
547new_cid.AppendBoolean(true);
550new_cid.AppendBoolean(false);
552case CIT_FLAGS_FIELD_CODE:
553new_cid.AppendFlags(ExtractNumber());
555case CIT_LABEL_FIELD_CODE:
556new_cid.AppendLabel(ExtractString());
558case CIT_CUE_FIELD_CODE:
559new_cid.AppendCue(ExtractNumber());
561case CIT_SEQ_ID_FIELD_CODE:
562new_cid.AppendSeqID(ExtractString());
564case CIT_TAX_ID_FIELD_CODE:
565new_cid.AppendTaxID(ExtractNumber());
568new_cid.AppendNestedCID(ExtractCID(pool_impl));
578CCompoundID SCompoundIDPoolImpl::UnpackV0(const string& packed_id)
580SIDUnpacking unpacking(packed_id);
582CCompoundID new_cid(unpacking.ExtractCID(this));
584new_cid->m_PackedID = packed_id;
585new_cid->m_Dirty = false;
Internal declarations of the CompoundID classes.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4