diff options
| author | Nico Golde <nico@ngolde.de> | 2012-09-18 14:29:40 +0200 | 
|---|---|---|
| committer | Harald Welte <laforge@gnumonks.org> | 2012-09-20 09:58:39 +0200 | 
| commit | c56a56dc0a172803bfb0fd49d6401055c85133ba (patch) | |
| tree | 9c98257c5eb5f033f48ef856268ce45b3fc8fd33 /src | |
| parent | db75331e06935f6a8a5bf488a26b28b68e802836 (diff) | |
gsm_utils.c: cleanup + do not use dynamic memory when decoding 7bit messages
Diffstat (limited to 'src')
| -rw-r--r-- | src/gsm/gsm_utils.c | 27 | 
1 files changed, 13 insertions, 14 deletions
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 <daniel@totalueberwachung.de>   * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>   * (C) 2009-2010 by Harald Welte <laforge@gnumonks.org> - * (C) 2010 by Nico Golde <nico@ngolde.de> + * (C) 2010-2012 by Nico Golde <nico@ngolde.de>   *   * 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;  }  | 
