From c56a56dc0a172803bfb0fd49d6401055c85133ba Mon Sep 17 00:00:00 2001 From: Nico Golde Date: Tue, 18 Sep 2012 14:29:40 +0200 Subject: gsm_utils.c: cleanup + do not use dynamic memory when decoding 7bit messages --- src/gsm/gsm_utils.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/gsm/gsm_utils.c b/src/gsm/gsm_utils.c index 3f3a73f6..f51cf1bc 100644 --- a/src/gsm/gsm_utils.c +++ b/src/gsm/gsm_utils.c @@ -2,7 +2,7 @@ * (C) 2008 by Daniel Willmann * (C) 2009 by Holger Hans Peter Freyther * (C) 2009-2010 by Harald Welte - * (C) 2010 by Nico Golde + * (C) 2010-2012 by Nico Golde * * All Rights Reserved * @@ -127,9 +127,8 @@ int gsm_7bit_decode_hdr(char *text, const uint8_t *user_data, uint8_t septet_l, { int i = 0; int shift = 0; - - uint8_t *rtext = calloc(septet_l, sizeof(uint8_t)); - uint8_t tmp; + uint8_t c; + uint8_t next_is_ext = 0; /* skip the user data header */ if (ud_hdr_ind) { @@ -141,29 +140,29 @@ int gsm_7bit_decode_hdr(char *text, const uint8_t *user_data, uint8_t septet_l, } for (i = 0; i < septet_l; i++) { - rtext[i] = + c = ((user_data[((i + shift) * 7 + 7) >> 3] << (7 - (((i + shift) * 7 + 7) & 7))) | (user_data[((i + shift) * 7) >> 3] >> (((i + shift) * 7) & 7))) & 0x7f; - } - for (i = 0; i < septet_l; i++) { - /* this is an extension character */ - if(rtext[i] == 0x1b && i + 1 < septet_l){ - tmp = rtext[i+1]; - *(text++) = gsm_7bit_alphabet[0x7f + tmp]; - i++; + if(c == 0x1b && i + 1 < septet_l){ + next_is_ext = 1; continue; } - *(text++) = gsm_septet_lookup(rtext[i]); + /* this is an extension character */ + if(next_is_ext){ + next_is_ext = 0; + *(text++) = gsm_7bit_alphabet[0x7f + c]; + } else { + *(text++) = gsm_septet_lookup(c); + } } if (ud_hdr_ind) i += shift; *text = '\0'; - free(rtext); return i; } -- cgit v1.2.3