// // MSG_CompressMinilzo // bool MSG_CompressMinilzo (buf_t &buf, size_t start_offset, size_t write_gap) { if(buf.size() < MINILZO_COMPRESS_MINPACKETSIZE) return false; lzo_uint outlen = OUT_LEN(buf.maxsize() - start_offset - write_gap); size_t total_len = outlen + start_offset + write_gap; if(compressed.maxsize() < total_len) compressed.resize(total_len); int r = lzo1x_1_compress (buf.ptr() + start_offset, buf.size() - start_offset, compressed.ptr() + start_offset + write_gap, &outlen, wrkmem); // worth the effort? if(r != LZO_E_OK || outlen >= (buf.size() - start_offset - write_gap)) return false; memcpy(compressed.ptr(), buf.ptr(), start_offset); SZ_Clear(&buf); MSG_WriteChunk(&buf, compressed.ptr(), outlen + start_offset + write_gap); return true; }
// // MSG_WriteHexString // // Converts a hexidecimal string to its binary representation void MSG_WriteHexString(buf_t *b, const char *s) { byte output[255]; // Nothing to write? if (!(s && (*s))) { MSG_WriteByte(b, 0); return; } const size_t numdigits = strlen(s) / 2; if (numdigits > STACKARRAY_LENGTH(output)) { Printf (PRINT_HIGH, "MSG_WriteHexString: too many digits\n"); return; } for (size_t i = 0; i < numdigits; ++i) { output[i] = (char)(16 * toInt(s[2*i]) + toInt(s[2*i+1])); } MSG_WriteByte(b, (byte)numdigits); MSG_WriteChunk(b, output, numdigits); }
// // MSG_CompressAdaptive // bool MSG_CompressAdaptive (huffman &huff, buf_t &buf, size_t start_offset, size_t write_gap) { size_t outlen = OUT_LEN(buf.maxsize() - start_offset - write_gap); size_t total_len = outlen + start_offset + write_gap; if(compressed.maxsize() < total_len) compressed.resize(total_len); bool r = huff.compress (buf.ptr() + start_offset, buf.size() - start_offset, compressed.ptr() + start_offset + write_gap, outlen); // worth the effort? if(!r || outlen >= (buf.size() - start_offset - write_gap)) return false; memcpy(compressed.ptr(), buf.ptr(), start_offset); SZ_Clear(&buf); MSG_WriteChunk(&buf, compressed.ptr(), outlen + start_offset + write_gap); return true; }