Sync froyo ril blob from hyc's codebase.
[xdandroid:rootfs.git] / gsm.h
1 #ifndef _android_gsm_h
2 #define _android_gsm_h
3
4 /** USEFUL TYPES
5  **/
6
7 typedef unsigned char  byte_t;
8 typedef byte_t*        bytes_t;
9 typedef const byte_t*  cbytes_t;
10
11 /** BCD
12  **/
13
14 /* convert a 8-bit value into the corresponding nibble-bcd byte */
15 extern byte_t   gsm_int_to_bcdi( int  value );
16
17 /* convert a nibble-bcd byte into an int, invalid nibbles are silently converted to 0 */
18 extern int      gsm_int_from_bcdi( byte_t  value );
19
20 /** HEX
21  **/
22
23 /* convert a hex string into a byte string, assumes 'dst' is properly sized, and hexlen is even */
24 extern void     gsm_hex_to_bytes  ( cbytes_t  hex, int  hexlen, bytes_t  dst );
25
26 /* convert a byte string into a hex string, assumes 'hex' is properly sized */
27 extern void     gsm_hex_from_bytes( char*  hex, cbytes_t  src, int  srclen );
28
29 /* convert a hexchar to an int, returns -1 on error */
30 extern int      gsm_hexchar_to_int( char  c );
31
32 /* convert a hexchar to an int, returns 0 on error */
33 extern int      gsm_hexchar_to_int0( char  c );
34
35 /* convert a 2-char hex value into an int, returns -1 on error */
36 extern int      gsm_hex2_to_byte( const char*  hex );
37
38 /* convert a 2-char hex value into an int, returns 0 on error */
39 extern int      gsm_hex2_to_byte0( const char*  hex );
40
41 /* convert a 4-char hex value into an int, returns -1 on error */
42 extern int      gsm_hex4_to_short( const char*  hex );
43
44 /* convert a 4-char hex value into an int, returns 0 on error */
45 extern int      gsm_hex4_to_short0( const char*  hex );
46
47 /* write a byte to a 2-byte hex string */
48 extern void     gsm_hex_from_byte( char*  hex, int  val );
49
50 extern void     gsm_hex_from_short( char*  hex, int  val );
51
52 /** UTF-8 and GSM Alphabet
53  **/
54
55 /* check that a given utf8 string is well-formed, returns 1 on success, 0 otherwise */
56 extern int      utf8_check( cbytes_t  utf8, int  utf8len );
57
58 /* check that all characters in a given utf8 string can be encoded into the GSM alphabet.
59    returns 1 if TRUE, 0 otherwise */
60 extern int      utf8_check_gsm7( cbytes_t  utf8, int  utf8len );
61
62 /* convert a utf-8 string into a GSM septet string, assumes 'dst' is NULL or is properly sized,
63    and that all characters are representable. 'offset' is the starting bit offset in 'dst'.
64    non-representable characters are replaced by spaces.
65    returns the number of septets, */
66 extern int      utf8_to_gsm7( cbytes_t  utf8, int  utf8len, bytes_t  dst, int  offset );
67
68 /* convert a utf8 string into an array of 8-bit unpacked GSM septets,
69  * assumes 'dst' is NULL or is properly sized, returns the number of GSM bytes */
70 extern int      utf8_to_gsm8( cbytes_t  utf8, int  utf8len, bytes_t  dst );
71
72 /* convert a GSM septets string into a utf-8 byte string. assumes that 'utf8' is NULL or properly
73    sized. 'offset' is the starting bit offset in 'src', 'count' is the number of input septets.
74    return the number of utf8 bytes. */
75 extern int      utf8_from_gsm7( cbytes_t  src, int  offset, int  count, bytes_t  utf8 );
76
77 /* convert an unpacked 8-bit GSM septets string into a utf-8 byte string. assumes that 'utf8'
78    is NULL or properly sized. 'count' is the number of input bytes.
79    returns the number of utf8 bytes */
80 extern int      utf8_from_gsm8( cbytes_t  src, int  count, bytes_t  utf8 );
81
82
83 /** UCS-2 and GSM Alphabet
84  **
85  ** Note that here, 'ucs2' really refers to non-aligned UCS2-BE, as used by the GSM standard
86  **/
87
88 /* check that all characters in a given ucs2 string can be encoded into the GSM alphabet.
89    returns 1 if TRUE, 0 otherwise */
90 extern int      ucs2_check_gsm7( cbytes_t  ucs2, int  ucs2len );
91
92 /* convert a ucs2 string into a GSM septet string, assumes 'dst' is NULL or properly sized,
93    'offset' is the starting bit offset in 'dst'. non-representable characters are replaced
94    by spaces. returns the number of septets */
95 extern int      ucs2_to_gsm7( cbytes_t  ucs2, int  ucs2len, bytes_t  dst, int  offset );
96
97 /* convert a ucs2 string into a GSM septet string, assumes 'dst' is NULL or properly sized,
98    non-representable characters are replaced by spaces. returns the number of bytes */
99 extern int      ucs2_to_gsm8( cbytes_t  ucs2, int  ucs2len, bytes_t  dst );
100
101 /* convert a GSM septets string into a ucs2 string. assumes that 'ucs2' is NULL or
102    properly sized. 'offset' is the starting bit offset in 'src', 'count' is the number
103    of input septets. return the number of ucs2 characters (not bytes) */
104 extern int      ucs2_from_gsm7( bytes_t   ucs2, cbytes_t  src, int  offset, int  count );
105
106 /* convert an 8-bit unpacked GSM septets string into a ucs2 string. assumes that 'ucs2'
107    is NULL or properly sized. 'count' is the number of input septets. return the number
108    of ucs2 characters (not bytes) */
109 extern int      ucs2_from_gsm8( bytes_t   ucs2, cbytes_t  src, int  count );
110
111
112 /** UCS2 to/from UTF8
113  **/
114
115 /* convert a ucs2 string into a utf8 byte string, assumes 'utf8' NULL or properly sized.
116    returns the number of utf8 bytes*/
117 extern int      ucs2_to_utf8( cbytes_t  ucs2, int  ucs2len, bytes_t  utf8 );
118
119 /* convert a utf8 byte string into a ucs2 string, assumes 'ucs2' NULL or properly sized.
120    returns the number of ucs2 chars */
121 extern int      utf8_to_ucs2( cbytes_t  utf8, int  utf8len, bytes_t  ucs2 );
122
123 /* try to skip a given number of characters in a utf-8 byte string, return new position */
124 extern cbytes_t  utf8_skip( cbytes_t   utf8, cbytes_t   utf8end, int  count);
125
126 /** Dial Numbers: TON byte + 'count' bcd numbers
127  **/
128
129 /* convert a bcd-coded GSM dial number into an ASCII string (not zero-terminated)
130    assumes 'dst' is NULL or properly sized, returns 0 in case of success, -1 in case of error.
131    'num_digits' is the number of digits, not input bytes. a trailing 0xf0 is ignored automatically
132    return the number of ASCII chars */
133 extern int  gsm_bcdnum_to_ascii  ( cbytes_t  bcd, int  num_digits, bytes_t  dst );
134
135 /* convert an ASCII dial-number into a bcd-coded string, returns the number of 4-bit nibbles written, */
136 extern int  gsm_bcdnum_from_ascii( cbytes_t  ascii, int  asciilen, bytes_t  dst );
137
138 /** ADN: Abbreviated Dialing Numbers
139  **/
140 #define  SIM_ADN_MAX_ALPHA        20  /* maximum number of characters in ADN alpha tag */
141 #define  SIM_ADN_MAX_NUMBER       20  /* maximum digits in ADN number */
142
143 typedef struct {
144     byte_t  alpha [ SIM_ADN_MAX_ALPHA*3+1 ];  /* alpha tag in zero-terminated utf-8      */
145     char    number[ SIM_ADN_MAX_NUMBER+1 ];   /* dialing number in zero-terminated ASCII */
146 }
147 SimAdnRec, *SimAdn;
148
149 typedef struct {
150     SimAdnRec       adn;
151     byte_t          ext_record;  /* 0 or 0xFF means no extension */
152 }
153 SimAdnRecordRec, *SimAdnRecord;
154
155 extern int  sim_adn_record_from_bytes( SimAdnRecord  rec, cbytes_t  data, int  datalen );
156 extern int  sim_adn_record_to_bytes  ( SimAdnRecord  rec, bytes_t   data, int  datalen );
157
158 /** ROPES
159  **/
160
161 typedef struct {
162     bytes_t         data;
163     int             max;
164     int             pos;
165     int             error;
166     unsigned char   data0[16];
167 } GsmRopeRec, *GsmRope;
168
169 extern void      gsm_rope_init( GsmRope  rope );
170 extern void      gsm_rope_init_alloc( GsmRope  rope, int  alloc );
171 extern int       gsm_rope_done( GsmRope  rope );
172 extern bytes_t   gsm_rope_done_acquire( GsmRope  rope, int  *psize );
173 extern void      gsm_rope_add_c( GsmRope  rope, char  c );
174 extern void      gsm_rope_add( GsmRope  rope, const void*  str, int  len );
175 extern void*     gsm_rope_reserve( GsmRope  rope, int  len );
176
177 #endif /* _android_gsm_h */