feat(util): Add IBus get data function

Using the macro to get uint8_t/uint16_t type data from IBus is much faster.
This commit is contained in:
dongheng
2019-03-29 17:30:50 +08:00
parent b05cf79870
commit 2449523a8e
3 changed files with 109 additions and 31 deletions

View File

@ -14,6 +14,7 @@
#include "sdkconfig.h"
#include "esp_base64.h"
#include "ibus_data.h"
#include <assert.h>
#include <sys/errno.h>
@ -44,26 +45,6 @@ static const uint32_t s_base64_dec_lut[32] = {
0x2c2b2a29, 0x302f2e2d, 0x7f333231, 0x7f7f7f7f
};
static inline uint8_t __map_base64_enc_data(uint8_t index)
{
cache_t tmp;
uint8_t num = index / 4;
uint8_t off = index % 4;
tmp.u32d = s_base64_enc_lut[num];
return tmp.u8d[off];
}
static inline uint8_t __map_base64_dec_data(uint8_t index)
{
cache_t tmp;
uint8_t num = index / 4;
uint8_t off = index % 4;
tmp.u32d = s_base64_dec_lut[num];
return tmp.u8d[off];
}
/*
* Encode a buffer into base64 format
*/
@ -93,21 +74,21 @@ int esp_base64_encode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dl
C2 = *src++;
C3 = *src++;
*p++ = __map_base64_enc_data((C1 >> 2) & 0x3F);
*p++ = __map_base64_enc_data((((C1 & 3) << 4) + (C2 >> 4)) & 0x3F);
*p++ = __map_base64_enc_data((((C2 & 15) << 2) + (C3 >> 6)) & 0x3F);
*p++ = __map_base64_enc_data(C3 & 0x3F);
*p++ = ESP_IBUS_GET_U8_DATA((C1 >> 2) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA((((C1 & 3) << 4) + (C2 >> 4)) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA((((C2 & 15) << 2) + (C3 >> 6)) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA(C3 & 0x3F, s_base64_enc_lut);
}
if (i < slen) {
C1 = *src++;
C2 = ((i + 1) < slen) ? *src++ : 0;
*p++ = __map_base64_enc_data((C1 >> 2) & 0x3F);
*p++ = __map_base64_enc_data((((C1 & 3) << 4) + (C2 >> 4)) & 0x3F);
*p++ = ESP_IBUS_GET_U8_DATA((C1 >> 2) & 0x3F, s_base64_enc_lut);
*p++ = ESP_IBUS_GET_U8_DATA((((C1 & 3) << 4) + (C2 >> 4)) & 0x3F, s_base64_enc_lut);
if ((i + 1) < slen)
*p++ = __map_base64_enc_data(((C2 & 15) << 2) & 0x3F);
*p++ = ESP_IBUS_GET_U8_DATA(((C2 & 15) << 2) & 0x3F, s_base64_enc_lut);
else
*p++ = '=';
@ -161,10 +142,10 @@ int esp_base64_decode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dl
if (src[i] == '=' && ++j > 2)
return -EINVAL;
if (src[i] > 127 || __map_base64_dec_data(src[i]) == 127)
if (src[i] > 127 || ESP_IBUS_GET_U8_DATA(src[i], s_base64_dec_lut) == 127)
return -EINVAL;
if (__map_base64_dec_data(src[i]) < 64 && j != 0)
if (ESP_IBUS_GET_U8_DATA(src[i], s_base64_dec_lut) < 64 && j != 0)
return -EINVAL;
n++;
@ -183,8 +164,8 @@ int esp_base64_decode(const void *p_src, uint32_t slen, void *p_dst, uint32_t dl
if (*src == '\r' || *src == '\n' || *src == ' ')
continue;
j -= (__map_base64_dec_data(*src) == 64);
x = (x << 6) | (__map_base64_dec_data(*src) & 0x3F);
j -= (ESP_IBUS_GET_U8_DATA(*src, s_base64_dec_lut) == 64);
x = (x << 6) | (ESP_IBUS_GET_U8_DATA(*src, s_base64_dec_lut) & 0x3F);
if (++n == 4) {
n = 0;