16 static void push (
const char* str) {
17 push(str, strlen(str));
23 static void push (
const void* ptr, uint8_t len) {
31 static void push (
long val) {
65 static void PushCount (uint32_t num) {
67 PushData(ultoa(num, buf, 10), strlen(buf));
70 static void PushEnd () {
74 static void PushData (
const void* ptr, uint8_t len) {
75 for (
const char* p = (
const char*) ptr; len-- > 0; ++p)
88 enum { T_STRING = 0, T_NUMBER = 251, T_DICT, T_LIST, T_POP, T_END };
94 : bufPtr (buf), bufLen (len) {
reset(); }
109 const char*
asString (uint8_t* plen =0);
115 void AddToBuf (
char ch);
118 uint8_t bufLen, count, next, last, state;
123 enum { PT_EXT, PT_POS, PT_NEG, PT_STR };
124 enum { PE_END, PE_LIST, PE_DICT };
126 EmBenPack (
char* ptr, uint8_t len) : buf (ptr), limit (len) {
130 uint8_t fill ()
const {
138 void push (
const char* str) {
139 push(str, strlen(str));
142 void push (
const void* ptr, uint8_t len) {
143 PushCount((len << 2) | PT_STR);
144 for (
const char* p = (
const char*) ptr; len-- > 0; ++p)
150 PushCount(val < 0 ? (~val << 2) | PT_NEG
151 : (val << 2) | PT_POS);
155 PushChar((PE_LIST << 2) | PT_EXT);
163 PushChar((PE_DICT << 2) | PT_EXT);
175 void PushCount (uint32_t num, uint8_t flag =0x80) {
177 PushCount(num >> 7, 0);
178 PushCount(flag | (num & 0x7F));
182 PushChar((PE_END << 2) | PT_EXT);
185 void PushChar (
char ch) {