diff options
-rw-r--r-- | fw/fe310/eos/cell.h | 9 | ||||
-rw-r--r-- | fw/fe310/eos/unicode.c | 24 | ||||
-rw-r--r-- | fw/fe310/eos/unicode.h | 2 |
3 files changed, 30 insertions, 5 deletions
diff --git a/fw/fe310/eos/cell.h b/fw/fe310/eos/cell.h index d8206f9..92c8c7c 100644 --- a/fw/fe310/eos/cell.h +++ b/fw/fe310/eos/cell.h @@ -27,6 +27,11 @@ #define EOS_CELL_MTYPE_VOICE_END 6 #define EOS_CELL_MTYPE_VOICE_MISSED 7 +#define EOS_CELL_MTYPE_SMS_LIST 1 +#define EOS_CELL_MTYPE_SMS_SEND 2 +#define EOS_CELL_MTYPE_SMS_MSG_NEW 3 +#define EOS_CELL_MTYPE_SMS_MSG_ITEM 4 + #define EOS_CELL_MTYPE_USSD_REQUEST 1 #define EOS_CELL_MTYPE_USSD_REPLY 2 @@ -34,5 +39,9 @@ #define EOS_CELL_MTYPE_DATA_CONNECT 2 #define EOS_CELL_MTYPE_DATA_DISCONNECT 3 +#define EOS_CELL_SMS_ADDRTYPE_INTL 1 +#define EOS_CELL_SMS_ADDRTYPE_ALPHA 2 +#define EOS_CELL_SMS_ADDRTYPE_OTHER 3 + void eos_cell_init(void); void eos_cell_set_handler(unsigned char mtype, eos_evt_handler_t handler);
\ No newline at end of file diff --git a/fw/fe310/eos/unicode.c b/fw/fe310/eos/unicode.c index 2915791..e2fb772 100644 --- a/fw/fe310/eos/unicode.c +++ b/fw/fe310/eos/unicode.c @@ -57,6 +57,15 @@ int utf8_dec(utf8_t *str, utf32_t *ch) { } } +int utf8_len(utf8_t *str) { + if ((*str & 0xf8) == 0xf0) return 4; + if ((*str & 0xf0) == 0xe0) return 3; + if ((*str & 0xe0) == 0xc0) return 2; + if ((*str & 0x80) == 0x00) return 1; + + return UTF_ERR; +} + int utf8_seek(utf8_t *str, int off, utf32_t *ch) { int i; int len = 0; @@ -91,11 +100,8 @@ int utf8_verify(utf8_t *str, int str_size, int *str_len) { while (len < str_size) { if (str_size - len < 4) { - if (((str[len] & 0xf8) == 0xf0) || - (((str[len] & 0xf0) == 0xe0) && (str_size - len < 3)) || - (((str[len] & 0xe0) == 0xc0) && (str_size - len < 2))) { - break; - } + int _len = utf8_len(str + len); + if ((_len == UTF_ERR) || ((str_size - len) < _len)) break; } ch_l = utf8_dec(str + len, &ch); if (ch_l > 0) { @@ -151,6 +157,14 @@ int utf16_dec(uint8_t *str, utf32_t *ch) { } } +int utf16_len(uint8_t *str) { + uint16_t ch = (str[0] << 8) | str[1]; + + if ((ch >= 0xdc00) && (ch <= 0xdfff)) return UTF_ERR; + if ((ch >= 0xd800) && (ch <= 0xdfff)) return 4; + return 2; +} + int utf16_seek(uint8_t *str, int off, utf32_t *ch) { int i; int len = 0; diff --git a/fw/fe310/eos/unicode.h b/fw/fe310/eos/unicode.h index a3b9696..12fa99c 100644 --- a/fw/fe310/eos/unicode.h +++ b/fw/fe310/eos/unicode.h @@ -9,9 +9,11 @@ typedef uint32_t utf32_t; int utf8_enc(utf32_t ch, utf8_t *str); int utf8_dec(utf8_t *str, utf32_t *ch); +int utf8_len(utf8_t *str); int utf8_seek(utf8_t *str, int off, utf32_t *ch); int utf8_verify(utf8_t *str, int str_size, int *str_len); int utf16_enc(utf32_t ch, uint8_t *str); int utf16_dec(uint8_t *str, utf32_t *ch); +int utf16_len(uint8_t *str); int utf16_seek(uint8_t *str, int off, utf32_t *ch); |