File: | libs/spandsp/src/../src/make_at_dictionary.c |
Location: | line 627, column 5 |
Description: | Potential leak of memory pointed to by 's' |
1 | /* | |||
2 | * SpanDSP - a series of DSP components for telephony | |||
3 | * | |||
4 | * make_at_dictionary.c - Generate a trie based dictionary for the AT | |||
5 | * commands supported by the AT interpreter. | |||
6 | * | |||
7 | * Written by Steve Underwood <steveu@coppice.org> | |||
8 | * | |||
9 | * Copyright (C) 2006 Steve Underwood | |||
10 | * | |||
11 | * All rights reserved. | |||
12 | * | |||
13 | * This program is free software; you can redistribute it and/or modify | |||
14 | * it under the terms of the GNU General Public License version 2, as | |||
15 | * published by the Free Software Foundation. | |||
16 | * | |||
17 | * This program is distributed in the hope that it will be useful, | |||
18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
20 | * GNU General Public License for more details. | |||
21 | * | |||
22 | * You should have received a copy of the GNU General Public License | |||
23 | * along with this program; if not, write to the Free Software | |||
24 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
25 | */ | |||
26 | ||||
27 | #include <inttypes.h> | |||
28 | #include <stdlib.h> | |||
29 | #include <stdio.h> | |||
30 | #include <fcntl.h> | |||
31 | #include <string.h> | |||
32 | #include <assert.h> | |||
33 | ||||
34 | const char *wordlist[] = | |||
35 | { | |||
36 | " ", /* Dummy to absorb spaces in commands */ | |||
37 | "&C", /* V.250 6.2.8 - Circuit 109 (received line signal detector), behaviour */ | |||
38 | "&D", /* V.250 6.2.9 - Circuit 108 (data terminal ready) behaviour */ | |||
39 | "&F", /* V.250 6.1.2 - Set to factory-defined configuration */ | |||
40 | "+A8A", /* V.251 6.3 - V.8 calling tone indication */ | |||
41 | "+A8C", /* V.251 6.2 - V.8 answer signal indication */ | |||
42 | "+A8E", /* V.251 5.1 - V.8 and V.8bis operation controls */ | |||
43 | "+A8I", /* V.251 6.1 - V.8 CI signal indication */ | |||
44 | "+A8J", /* V.251 6.4 - V.8 negotiation complete */ | |||
45 | "+A8M", /* V.251 5.2 - Send V.8 menu signals */ | |||
46 | "+A8R", /* V.251 6.6 - V.8bis signal and message reporting */ | |||
47 | "+A8T", /* V.251 5.3 - Send V.8bis signal and/or message(s) */ | |||
48 | "+ASTO", /* V.250 6.3.15 - Store telephone number */ | |||
49 | "+CAAP", /* 3GPP TS 27.007 7.25 - Automatic answer for eMLPP Service */ | |||
50 | "+CACM", /* 3GPP TS 27.007 8.25 - Accumulated call meter */ | |||
51 | "+CACSP", /* 3GPP TS 27.007 11.1.7 - Voice Group or Voice Broadcast Call State Attribute Presentation */ | |||
52 | "+CAD", /* IS-99 5.6.3 - Query analogue or digital service */ | |||
53 | "+CAEMLPP", /* 3GPP TS 27.007 7.22 - eMLPP Priority Registration and Interrogation */ | |||
54 | "+CAHLD", /* 3GPP TS 27.007 11.1.3 - Leave an ongoing Voice Group or Voice Broadcast Call */ | |||
55 | "+CAJOIN", /* 3GPP TS 27.007 11.1.1 - Accept an incoming Voice Group or Voice Broadcast Call */ | |||
56 | "+CALA", /* 3GPP TS 27.007 8.16 - Alarm */ | |||
57 | "+CALCC", /* 3GPP TS 27.007 11.1.6 - List current Voice Group and Voice Broadcast Calls */ | |||
58 | "+CALD", /* 3GPP TS 27.007 8.38 - Delete alar m */ | |||
59 | "+CALM", /* 3GPP TS 27.007 8.20 - Alert sound mode */ | |||
60 | "+CAMM", /* 3GPP TS 27.007 8.26 - Accumulated call meter maximum */ | |||
61 | "+CANCHEV", /* 3GPP TS 27.007 11.1.8 - NCH Support Indication */ | |||
62 | "+CAOC", /* 3GPP TS 27.007 7.16 - Advice of Charge */ | |||
63 | "+CAPD", /* 3GPP TS 27.007 8.39 - Postpone or dismiss an alarm */ | |||
64 | "+CAPTT", /* 3GPP TS 27.007 11.1.4 - Talker Access for Voice Group Call */ | |||
65 | "+CAREJ", /* 3GPP TS 27.007 11.1.2 - Reject an incoming Voice Group or Voice Broadcast Call */ | |||
66 | "+CAULEV", /* 3GPP TS 27.007 11.1.5 - Voice Group Call Uplink Status Presentation */ | |||
67 | "+CBC", /* 3GPP TS 27.007 8.4 - Battery charge */ | |||
68 | "+CBCS", /* 3GPP TS 27.007 11.3.2 - VBS subscriptions and GId status */ | |||
69 | "+CBIP", /* IS-99 5.6 - Base station IP address */ | |||
70 | "+CBST", /* 3GPP TS 27.007 6.7 - Select bearer service type */ | |||
71 | "+CCFC", /* 3GPP TS 27.007 7.11 - Call forwarding number and conditions */ | |||
72 | "+CCLK", /* 3GPP TS 27.007 8.15 - Clock */ | |||
73 | "+CCS", /* IS-135 4.1.22 - Compression status */ | |||
74 | "+CCUG", /* 3GPP TS 27.007 7.10 - Closed user group */ | |||
75 | "+CCWA", /* 3GPP TS 27.007 7.12 - Call waiting */ | |||
76 | "+CCWE", /* 3GPP TS 27.007 8.28 - Call Meter maximum event */ | |||
77 | "+CDIP", /* 3GPP TS 27.007 7.9 - Called line identification presentation */ | |||
78 | "+CDIS", /* 3GPP TS 27.007 8.8 - Display control */ | |||
79 | "+CDV", /* IS-99 5.6 - Dial command for voice call */ | |||
80 | "+CEER", /* 3GPP TS 27.007 6.10 - Extended error report */ | |||
81 | "+CESP", /* GSM07.05 3.2.4 - Enter SMS block mode protocol */ | |||
82 | "+CFCS", /* 3GPP TS 27.007 7.24 - Fast call setup conditions */ | |||
83 | "+CFG", /* IS-99 5.6 - Configuration string */ | |||
84 | "+CFUN", /* 3GPP TS 27.007 8.2 - Set phone functionality */ | |||
85 | "+CGACT", /* 3GPP TS 27.007 10.1.10 - PDP context activate or deactivate */ | |||
86 | "+CGANS", /* 3GPP TS 27.007 10.1.16 - Manual response to a network request for PDP context activation */ | |||
87 | "+CGATT", /* 3GPP TS 27.007 10.1.9 - PS attach or detach */ | |||
88 | "+CGAUTO", /* 3GPP TS 27.007 10.1.15 - Automatic response to a network request for PDP context activation */ | |||
89 | "+CGCAP", /* IS-99 5.6 - Request complete capabilities list */ | |||
90 | "+CGCLASS", /* 3GPP TS 27.007 10.1.17 - GPRS mobile station class (GPRS only) */ | |||
91 | "+CGCLOSP", /* 3GPP TS 27.007 10.1.13 - Configure local octet stream PAD parameters (Obsolete) */ | |||
92 | "+CGCLPAD", /* 3GPP TS 27.007 10.1.12 - Configure local triple-X PAD parameters (GPRS only) (Obsolete) */ | |||
93 | "+CGCMOD", /* 3GPP TS 27.007 10.1.11 - PDP Context Modify */ | |||
94 | "+CGCS", /* 3GPP TS 27.007 11.3.1 - VGCS subscriptions and GId status */ | |||
95 | "+CGDATA", /* 3GPP TS 27.007 10.1.12 - Enter data state */ | |||
96 | "+CGDCONT", /* 3GPP TS 27.007 10.1.1 - Define PDP Context */ | |||
97 | "+CGDSCONT",/* 3GPP TS 27.007 10.1.2 - Define Secondary PDP Context */ | |||
98 | "+CGEQMIN", /* 3GPP TS 27.007 10.1.7 - 3G Quality of Service Profile (Minimum acceptable) */ | |||
99 | "+CGEQNEG", /* 3GPP TS 27.007 10.1.8 - 3G Quality of Service Profile (Negotiated) */ | |||
100 | "+CGEQREQ", /* 3GPP TS 27.007 10.1.6 - 3G Quality of Service Profile (Requested) */ | |||
101 | "+CGEREP", /* 3GPP TS 27.007 10.1.18 - Packet Domain event reporting */ | |||
102 | "+CGMI", /* 3GPP TS 27.007 5.1 - Request manufacturer identification */ | |||
103 | "+CGMM", /* 3GPP TS 27.007 5.2 - Request model identification */ | |||
104 | "+CGMR", /* 3GPP TS 27.007 5.3 - Request revision identification */ | |||
105 | "+CGOI", /* IS-99 5.6 - Request global object identification */ | |||
106 | "+CGPADDR", /* 3GPP TS 27.007 10.1.14 - Show PDP address */ | |||
107 | "+CGQMIN", /* 3GPP TS 27.007 10.1.5 - Quality of Service Profile (Minimum acceptable) */ | |||
108 | "+CGQREQ", /* 3GPP TS 27.007 10.1.4 - Quality of Service Profile (Requested) */ | |||
109 | "+CGREG", /* 3GPP TS 27.007 10.1.19 - GPRS network registration status */ | |||
110 | "+CGSMS", /* 3GPP TS 27.007 10.1.20 - Select service for MO SMS messages */ | |||
111 | "+CGSN", /* 3GPP TS 27.007 5.4 - Request product serial number identification */ | |||
112 | "+CGTFT", /* 3GPP TS 27.007 10.1.3 - Traffic Flow Template */ | |||
113 | "+CHLD", /* 3GPP TS 27.007 7.13 - Call related supplementary services */ | |||
114 | "+CHSA", /* 3GPP TS 27.007 6.18 - HSCSD non-transparent asymmetry configuration */ | |||
115 | "+CHSC", /* 3GPP TS 27.007 6.15 - HSCSD current call parameters */ | |||
116 | "+CHSD", /* 3GPP TS 27.007 6.12 - HSCSD device parameters */ | |||
117 | "+CHSN", /* 3GPP TS 27.007 6.14 - HSCSD non-transparent call configuration */ | |||
118 | "+CHSR", /* 3GPP TS 27.007 6.16 - HSCSD parameters report */ | |||
119 | "+CHST", /* 3GPP TS 27.007 6.13 - HSCSD transparent call configuration */ | |||
120 | "+CHSU", /* 3GPP TS 27.007 6.17 - HSCSD automatic user initiated upgrading */ | |||
121 | "+CHUP", /* 3GPP TS 27.007 6.5 - Hangup call */ | |||
122 | "+CHV", /* IS-99 5.6 - Hang-up voice */ | |||
123 | "+CIMI", /* 3GPP TS 27.007 5.6 - Request international mobile subscriber identity */ | |||
124 | "+CIND", /* 3GPP TS 27.007 8.9 - Indicator control */ | |||
125 | "+CIT", /* IS-99 5.6 - Command state inactivity timer */ | |||
126 | "+CKPD", /* 3GPP TS 27.007 8.7 - Keypad control */ | |||
127 | "+CLAC", /* 3GPP TS 27.007 8.37 - List all available AT commands */ | |||
128 | "+CLAE", /* 3GPP TS 27.007 8.31 - Language Event */ | |||
129 | "+CLAN", /* 3GPP TS 27.007 8.30 - Set Language */ | |||
130 | "+CLCC", /* 3GPP TS 27.007 7.18 - List current calls */ | |||
131 | "+CLCK", /* 3GPP TS 27.007 7.4 - Facility lock */ | |||
132 | "+CLIP", /* 3GPP TS 27.007 7.6 - Calling line identification presentation */ | |||
133 | "+CLIR", /* 3GPP TS 27.007 7.7 - Calling line identification restriction */ | |||
134 | "+CLVL", /* 3GPP TS 27.007 8.23 - Loudspeaker volume level */ | |||
135 | "+CMAR", /* 3GPP TS 27.007 8.36 - Master reset */ | |||
136 | "+CMEC", /* 3GPP TS 27.007 8.6 - Mobile termination control mode */ | |||
137 | "+CMEE", /* GSM07.07 9.1 - Report mobile equipment error */ | |||
138 | "+CMER", /* 3GPP TS 27.007 8.10 - Mobile termination event reporting */ | |||
139 | "+CMGC", /* GSM07.05 3.5.5/4.5 - Send command */ | |||
140 | "+CMGD", /* GSM07.05 3.5.4 - Delete message */ | |||
141 | "+CMGF", /* GSM07.05 3.2.3 - Message Format */ | |||
142 | "+CMGL", /* GSM07.05 3.4.2/4.1 - List messages */ | |||
143 | "+CMGR", /* GSM07.05 3.4.3/4.2 - Read message */ | |||
144 | "+CMGS", /* GSM07.05 3.5.1/4.3 - Send message */ | |||
145 | "+CMGW", /* GSM07.05 3.5.3/4.4 - Write message to memory */ | |||
146 | "+CMIP", /* IS-99 5.6 - Mobile station IP address */ | |||
147 | "+CMM", /* IS-135 4.1.23 - Menu map */ | |||
148 | "+CMMS", /* GSM07.05 3.5.6 - More messages to send */ | |||
149 | "+CMOD", /* 3GPP TS 27.007 6.4 - Call mode */ | |||
150 | "+CMSS", /* GSM07.05 3.5.2/4.7 - Send message from storage */ | |||
151 | "+CMUT", /* 3GPP TS 27.007 8.24 - Mute control */ | |||
152 | "+CMUX", /* 3GPP TS 27.007 5.7 - Multiplexing mode */ | |||
153 | "+CNMA", /* GSM07.05 3.4.4/4.6 - New message acknowledgement to terminal adapter */ | |||
154 | "+CNMI", /* GSM07.05 3.4.1 - New message indications to terminal equipment */ | |||
155 | "+CNUM", /* 3GPP TS 27.007 7.1 - Subscriber number */ | |||
156 | "+COLP", /* 3GPP TS 27.007 7.8 - Connected line identification presentation */ | |||
157 | "+COPN", /* 3GPP TS 27.007 7.21 - Read operator names */ | |||
158 | "+COPS", /* 3GPP TS 27.007 7.3 - PLMN selection */ | |||
159 | "+COS", /* IS-135 4.1.24 - Originating service */ | |||
160 | "+COTDI", /* 3GPP TS 27.007 11.1.9 - Originator to Dispatcher Information */ | |||
161 | "+CPAS", /* 3GPP TS 27.007 8.1 - Phone activity status */ | |||
162 | "+CPBF", /* 3GPP TS 27.007 8.13 - Find phonebook entries */ | |||
163 | "+CPBR", /* 3GPP TS 27.007 8.12 - Read phonebook entries */ | |||
164 | "+CPBS", /* 3GPP TS 27.007 8.11 - Select phonebook memory storage */ | |||
165 | "+CPBW", /* 3GPP TS 27.007 8.14 - Write phonebook entry */ | |||
166 | "+CPIN", /* 3GPP TS 27.007 8.3 - Enter PIN */ | |||
167 | "+CPLS", /* 3GPP TS 27.007 7.20 - Selection of preferred PLMN list */ | |||
168 | "+CPMS", /* GSM07.05 3.2.2 - Preferred message storage */ | |||
169 | "+CPOL", /* 3GPP TS 27.007 7.19 - Preferred PLMN list */ | |||
170 | "+CPPS", /* 3GPP TS 27.007 7.23 - eMLPP subscriptions */ | |||
171 | "+CPROT", /* 3GPP TS 27.007 8.42 - Enter protocol mode */ | |||
172 | "+CPUC", /* 3GPP TS 27.007 8.27 - Price per unit and currency table */ | |||
173 | "+CPWC", /* 3GPP TS 27.007 8.29 - Power class */ | |||
174 | "+CPWD", /* 3GPP TS 27.007 7.5 - Change password */ | |||
175 | "+CQD", /* IS-135 4.1.25 - Query disconnect timer */ | |||
176 | "+CR", /* 3GPP TS 27.007 6.9 - Service reporting control */ | |||
177 | "+CRC", /* 3GPP TS 27.007 6.11 - Cellular result codes */ | |||
178 | "+CREG", /* 3GPP TS 27.007 7.2 - Network registration */ | |||
179 | "+CRES", /* GSM07.05 3.3.6 - Restore Settings */ | |||
180 | "+CRLP", /* 3GPP TS 27.007 6.8 - Radio link protocol */ | |||
181 | "+CRM", /* IS-99 5.6 - Set rm interface protocol */ | |||
182 | "+CRMC", /* 3GPP TS 27.007 8.34 - Ring Melody Control */ | |||
183 | "+CRMP", /* 3GPP TS 27.007 8.35 - Ring Melody Playback */ | |||
184 | "+CRSL", /* 3GPP TS 27.007 8.21 - Ringer sound level */ | |||
185 | "+CRSM", /* 3GPP TS 27.007 8.18 - Restricted SIM access */ | |||
186 | "+CSAS", /* GSM07.05 3.3.5 - Save settings */ | |||
187 | "+CSCA", /* GSM07.05 3.3.1 - Service centre address */ | |||
188 | "+CSCB", /* GSM07.05 3.3.4 - Select cell broadcast message types */ | |||
189 | "+CSCC", /* 3GPP TS 27.007 8.19 - Secure control command */ | |||
190 | "+CSCS", /* 3GPP TS 27.007 5.5 - Select TE character set */ | |||
191 | "+CSDF", /* 3GPP TS 27.007 6.22 - Settings date format */ | |||
192 | "+CSDH", /* GSM07.05 3.3.3 - Show text mode parameters */ | |||
193 | "+CSGT", /* 3GPP TS 27.007 8.32 - Set Greeting Text */ | |||
194 | "+CSIL", /* 3GPP TS 27.007 6.23 - Silence Command */ | |||
195 | "+CSIM", /* 3GPP TS 27.007 8.17 - Generic SIM access */ | |||
196 | "+CSMP", /* GSM07.05 3.3.2 - Set text mode parameters */ | |||
197 | "+CSMS", /* GSM07.05 3.2.1 - Select Message Service */ | |||
198 | "+CSNS", /* 3GPP TS 27.007 6.19 - Single numbering scheme */ | |||
199 | "+CSQ", /* 3GPP TS 27.007 8.5 - Signal quality */ | |||
200 | "+CSS", /* IS-135 4.1.28 - Serving system identification */ | |||
201 | "+CSSN", /* 3GPP TS 27.007 7.17 - Supplementary service notifications */ | |||
202 | "+CSTA", /* 3GPP TS 27.007 6.1 - Select type of address */ | |||
203 | "+CSTF", /* 3GPP TS 27.007 6.24 - Settings time format */ | |||
204 | "+CSVM", /* 3GPP TS 27.007 8.33 - Set Voice Mail Number */ | |||
205 | "+CTA", /* IS-135 4.1.29 - MT-Terminated async. Data calls */ | |||
206 | "+CTF", /* IS-135 4.1.30 - MT-Terminated FAX calls */ | |||
207 | "+CTFR", /* 3GPP TS 27.007 7.14 - Call deflection */ | |||
208 | "+CTZR", /* 3GPP TS 27.007 8.41 - Time Zone Reporting */ | |||
209 | "+CTZU", /* 3GPP TS 27.007 8.40 - Automatic Time Zone Update */ | |||
210 | "+CUSD", /* 3GPP TS 27.007 7.15 - Unstructured supplementary service data */ | |||
211 | "+CUUS1", /* 3GPP TS 27.007 7.26 - User to User Signalling Service 1 */ | |||
212 | "+CV120", /* 3GPP TS 27.007 6.21 - V.120 rate adaption protocol */ | |||
213 | "+CVHU", /* 3GPP TS 27.007 6.20 - Voice Hangup Control */ | |||
214 | "+CVIB", /* 3GPP TS 27.007 8.22 - Vibrator mode */ | |||
215 | "+CXT", /* IS-99 5.6 - Cellular extension */ | |||
216 | "+DR", /* V.250 6.6.2 - Data compression reporting */ | |||
217 | "+DS", /* V.250 6.6.1 - Data compression */ | |||
218 | "+DS44", /* V.250 6.6.2 - V.44 data compression */ | |||
219 | "+EB", /* V.250 6.5.2 - Break handling in error control operation */ | |||
220 | "+EFCS", /* V.250 6.5.4 - 32-bit frame check sequence */ | |||
221 | "+EFRAM", /* V.250 6.5.8 - Frame length */ | |||
222 | "+ER", /* V.250 6.5.5 - Error control reporting */ | |||
223 | "+ES", /* V.250 6.5.1 - Error control selection */ | |||
224 | "+ESA", /* V.80 8.2 - Synchronous access mode configuration */ | |||
225 | "+ESR", /* V.250 6.5.3 - Selective repeat */ | |||
226 | "+ETBM", /* V.250 6.5.6 - Call termination buffer management */ | |||
227 | "+EWIND", /* V.250 6.5.7 - Window size */ | |||
228 | "+F34", /* T.31 B.6.1 - Initial V.34 rate controls for FAX */ | |||
229 | "+FAA", /* T.32 8.5.2.5 - Adaptive Answer parameter */ | |||
230 | "+FAP", /* T.32 8.5.1.12 - Addressing and polling capabilities parameter */ | |||
231 | "+FAR", /* T.31 8.5.1 - Adaptive reception control */ | |||
232 | "+FBO", /* T.32 8.5.3.4 - Phase C data bit order */ | |||
233 | "+FBS", /* T.32 8.5.3.2 - Buffer Size, read only parameter */ | |||
234 | "+FBU", /* T.32 8.5.1.10 - HDLC Frame Reporting parameter */ | |||
235 | "+FCC", /* T.32 8.5.1.1 - DCE capabilities parameters */ | |||
236 | "+FCL", /* T.31 8.5.2 - Carrier loss timeout */ | |||
237 | "+FCLASS", /* T.31 8.2 - Capabilities identification and control */ | |||
238 | "+FCQ", /* T.32 8.5.2.3 - Copy quality checking parameter */ | |||
239 | "+FCR", /* T.32 8.5.1.9 - Capability to receive parameter */ | |||
240 | "+FCS", /* T.32 8.5.1.3 - Current Session Results parameters */ | |||
241 | "+FCT", /* T.32 8.5.2.6 - DTE phase C timeout parameter */ | |||
242 | "+FDD", /* T.31 8.5.3 - Double escape character replacement */ | |||
243 | "+FDR", /* T.32 8.3.4 - Data reception command */ | |||
244 | "+FDT", /* T.32 8.3.3 - Data transmission command */ | |||
245 | "+FEA", /* T.32 8.5.3.5 - Phase C received EOL alignment parameter */ | |||
246 | "+FFC", /* T.32 8.5.3.6 - Format conversion parameter */ | |||
247 | "+FFD", /* T.32 8.5.1.14 - File diagnostic message parameter */ | |||
248 | "+FHS", /* T.32 8.5.2.7 - Call termination status parameter */ | |||
249 | "+FIE", /* T.32 8.5.2.1 - Procedure interrupt enable parameter */ | |||
250 | "+FIP", /* T.32 8.3.6 - Initialize facsimile parameters */ | |||
251 | "+FIS", /* T.32 8.5.1.2 - Current session parameters */ | |||
252 | "+FIT", /* T.31 8.5.4 - DTE inactivity timeout */ | |||
253 | "+FKS", /* T.32 8.3.5 - Session termination command */ | |||
254 | "+FLI", /* T.32 8.5.1.5 - Local ID string parameter, TSI or CSI */ | |||
255 | "+FLO", /* T.31 says to implement something similar to +IFC */ | |||
256 | "+FLP", /* T.32 8.5.1.7 - Indicate document to poll parameter */ | |||
257 | "+FMI", /* T.31 says to duplicate +GMI */ | |||
258 | "+FMM", /* T.31 says to duplicate +GMM */ | |||
259 | "+FMR", /* T.31 says to duplicate +GMR */ | |||
260 | "+FMS", /* T.32 8.5.2.9 - Minimum phase C speed parameter */ | |||
261 | "+FND", /* T.32 8.5.2.10 - Non-Standard Message Data Indication parameter */ | |||
262 | "+FNR", /* T.32 8.5.1.11 - Negotiation message reporting control parameters */ | |||
263 | "+FNS", /* T.32 8.5.1.6 - Non-Standard Frame FIF parameter */ | |||
264 | "+FPA", /* T.32 8.5.1.13 - Selective polling address parameter */ | |||
265 | "+FPI", /* T.32 8.5.1.5 - Local Polling ID String parameter */ | |||
266 | "+FPP", /* T.32 8.5.3 - Facsimile packet protocol */ | |||
267 | "+FPR", /* T.31 says to implement something similar to +IPR */ | |||
268 | "+FPS", /* T.32 8.5.2.2 - Page Status parameter */ | |||
269 | "+FPW", /* T.32 8.5.1.13 - PassWord parameter (Sending or Polling) */ | |||
270 | "+FRH", /* T.31 8.3.6 - HDLC receive */ | |||
271 | "+FRM", /* T.31 8.3.4 - Facsimile receive */ | |||
272 | "+FRQ", /* T.32 8.5.2.4 - Receive Quality Thresholds parameters */ | |||
273 | "+FRS", /* T.31 8.3.2 - Receive silence */ | |||
274 | "+FRY", /* T.32 8.5.2.8 - ECM Retry Value parameter */ | |||
275 | "+FSA", /* T.32 8.5.1.13 - Subaddress parameter */ | |||
276 | "+FSP", /* T.32 8.5.1.8 - Request to poll parameter */ | |||
277 | "+FTH", /* T.31 8.3.5 - HDLC transmit */ | |||
278 | "+FTM", /* T.31 8.3.3 - Facsimile transmit */ | |||
279 | "+FTS", /* T.31 8.3.1 - Transmit silence */ | |||
280 | "+GCAP", /* V.250 6.1.9 - Request complete capabilities list */ | |||
281 | "+GCI", /* V.250 6.1.10 - Country of installation, */ | |||
282 | "+GMI", /* V.250 6.1.4 - Request manufacturer identification */ | |||
283 | "+GMM", /* V.250 6.1.5 - Request model identification */ | |||
284 | "+GMR", /* V.250 6.1.6 - Request revision identification */ | |||
285 | "+GOI", /* V.250 6.1.8 - Request global object identification */ | |||
286 | "+GSN", /* V.250 6.1.7 - Request product serial number identification */ | |||
287 | "+IBC", /* V.80 7.9 - Control of in-band control */ | |||
288 | "+IBM", /* V.80 7.10 - In-band MARK idle reporting control */ | |||
289 | "+ICF", /* V.250 6.2.11 - DTE-DCE character framing */ | |||
290 | "+ICLOK", /* V.250 6.2.14 - Select sync transmit clock source */ | |||
291 | "+IDSR", /* V.250 6.2.16 - Select data set ready option */ | |||
292 | "+IFC", /* V.250 6.2.12 - DTE-DCE local flow control */ | |||
293 | "+ILRR", /* V.250 6.2.13 - DTE-DCE local rate reporting */ | |||
294 | "+ILSD", /* V.250 6.2.15 - Select long space disconnect option */ | |||
295 | "+IPR", /* V.250 6.2.10 - Fixed DTE rate */ | |||
296 | "+IRTS", /* V.250 6.2.17 - Select synchronous mode RTS option */ | |||
297 | "+ITF", /* V.80 8.4 - Transmit flow control thresholds */ | |||
298 | "+MA", /* V.250 6.4.2 - Modulation automode control */ | |||
299 | "+MR", /* V.250 6.4.3 - Modulation reporting control */ | |||
300 | "+MS", /* V.250 6.4.1 - Modulation selection */ | |||
301 | "+MSC", /* V.250 6.4.8 - Seamless rate change enable */ | |||
302 | "+MV18AM", /* V.250 6.4.6 - V.18 answering message editing */ | |||
303 | "+MV18P", /* V.250 6.4.7 - Order of probes */ | |||
304 | "+MV18R", /* V.250 6.4.5 - V.18 reporting control */ | |||
305 | "+MV18S", /* V.250 6.4.4 - V.18 selection */ | |||
306 | "+PCW", /* V.250 6.8.1 - Call waiting enable (V.92 DCE) */ | |||
307 | "+PIG", /* V.250 6.8.5 - PCM upstream ignore */ | |||
308 | "+PMH", /* V.250 6.8.2 - Modem on hold enable */ | |||
309 | "+PMHF", /* V.250 6.8.6 - V.92 Modem on hold hook flash */ | |||
310 | "+PMHR", /* V.250 6.8.4 - Initiate modem on hold */ | |||
311 | "+PMHT", /* V.250 6.8.3 - Modem on hold timer */ | |||
312 | "+PQC", /* V.250 6.8.7 - V.92 Phase 1 and Phase 2 Control */ | |||
313 | "+PSS", /* V.250 6.8.8 - V.92 Use Short Sequence */ | |||
314 | "+SAC", /* V.252 3.4 - Audio transmit configuration */ | |||
315 | "+SAM", /* V.252 3.5 - Audio receive mode */ | |||
316 | "+SAR", /* V.252 5.3 - Audio receive channel indication */ | |||
317 | "+SARR", /* V.252 3.9 - Audio indication reporting */ | |||
318 | "+SAT", /* V.252 5.4 - Audio transmit channel indication */ | |||
319 | "+SCRR", /* V.252 3.11 - Capabilities indication reporting */ | |||
320 | "+SDC", /* V.252 3.3 - Data configuration */ | |||
321 | "+SDI", /* V.252 5.2 - Data channel identification */ | |||
322 | "+SDR", /* V.252 3.8 - Data indication reporting */ | |||
323 | "+SRSC", /* V.252 5.1.2 - Remote terminal simultaneous capability indication */ | |||
324 | "+STC", /* V.252 3.1 - Terminal configuration */ | |||
325 | "+STH", /* V.252 3.2 - Close logical channel */ | |||
326 | "+SVC", /* V.252 3.6 - Video transmit configuration */ | |||
327 | "+SVM", /* V.252 3.7 - Video receive mode */ | |||
328 | "+SVR", /* V.252 5.5 - Video receive channel indication */ | |||
329 | "+SVRR", /* V.252 3.10 - Video indication reporting */ | |||
330 | "+SVT", /* V.252 5.6 - Video transmit channel indication */ | |||
331 | "+TADR", /* V.250 6.7.2.9 - Local V.54 address */ | |||
332 | "+TAL", /* V.250 6.7.2.15 - Local analogue loop */ | |||
333 | "+TALS", /* V.250 6.7.2.6 - Analogue loop status */ | |||
334 | "+TDLS", /* V.250 6.7.2.7 - Local digital loop status */ | |||
335 | "+TE140", /* V.250 6.7.2.1 - Enable ckt 140 */ | |||
336 | "+TE141", /* V.250 6.7.2.2 - Enable ckt 141 */ | |||
337 | "+TEPAL", /* V.250 6.7.2.5 - Enable front panel analogue loop */ | |||
338 | "+TEPDL", /* V.250 6.7.2.4 - Enable front panel RDL */ | |||
339 | "+TERDL", /* V.250 6.7.2.3 - Enable RDL from remote */ | |||
340 | "+TLDL", /* V.250 6.7.2.13 - Local digital loop */ | |||
341 | "+TMO", /* V.250 6.9 - V.59 command */ | |||
342 | "+TMODE", /* V.250 6.7.2.10 - Set V.54 mode */ | |||
343 | "+TNUM", /* V.250 6.7.2.12 - Errored bit and block counts */ | |||
344 | "+TRDL", /* V.250 6.7.2.14 - Request remote digital loop */ | |||
345 | "+TRDLS", /* V.250 6.7.2.8 - Remote digital loop status */ | |||
346 | "+TRES", /* V.250 6.7.2.17 - Self test result */ | |||
347 | "+TSELF", /* V.250 6.7.2.16 - Self test */ | |||
348 | "+TTER", /* V.250 6.7.2.11 - Test error rate */ | |||
349 | "+VAC", /* V.252 4.1 - Set audio code */ | |||
350 | "+VACR", /* V.252 6.1 - Audio code report */ | |||
351 | "+VBT", /* 3GPP TS 27.007 C.2.2 - Buffer threshold setting */ | |||
352 | "+VCID", /* V.253 9.2.3 - Caller ID service */ | |||
353 | "+VCIDR", /* V.252 6.2 - Caller ID report */ | |||
354 | "+VDID", /* V.253 9.2.4 - DID service */ | |||
355 | "+VDIDR", /* V.252 6.2 - DID report */ | |||
356 | "+VDR", /* V.253 10.3.1 - Distinctive ring (ring cadence reporting) */ | |||
357 | "+VDT", /* V.253 10.3.2 - Control tone cadence reporting */ | |||
358 | "+VDX", /* V.253 10.5.6 - Speakerphone duplex mode */ | |||
359 | "+VEM", /* V.253 10.5.7 - Deliver event reports */ | |||
360 | "+VGM", /* V.253 10.5.2 - Microphone gain */ | |||
361 | "+VGR", /* V.253 10.2.1 - Receive gain selection */ | |||
362 | "+VGS", /* V.253 10.5.3 - Speaker gain */ | |||
363 | "+VGT", /* V.253 10.2.2 - Volume selection */ | |||
364 | "+VHC", /* V.252 4.12 - Telephony port hook control */ | |||
365 | "+VIP", /* V.253 10.1.1 - Initialize voice parameters */ | |||
366 | "+VIT", /* V.253 10.2.3 - DTE/DCE inactivity timer */ | |||
367 | "+VLS", /* V.253 10.2.4 - Analogue source/destination selection */ | |||
368 | "+VNH", /* V.253 9.2.5 - Automatic hangup control */ | |||
369 | "+VPH", /* V.252 4.11 - Phone hookswitch status */ | |||
370 | "+VPP", /* V.253 10.4.2 - Voice packet protocol */ | |||
371 | "+VPR", /* IS-101 10.4.3 - Select DTE/DCE interface rate */ | |||
372 | "+VRA", /* V.253 10.2.5 - Ringing tone goes away timer */ | |||
373 | "+VRID", /* Extension - Find the originating and destination numbers */ | |||
374 | "+VRL", /* V.253 10.1.2 - Ring local phone */ | |||
375 | "+VRN", /* V.253 10.2.6 - Ringing tone never appeared timer */ | |||
376 | "+VRX", /* V.253 10.1.3 - Voice receive state */ | |||
377 | "+VSD", /* V.253 10.2.7 - Silence detection (QUIET and SILENCE) */ | |||
378 | "+VSID", /* Extension - Set the originating number */ | |||
379 | "+VSM", /* V.253 10.2.8 - Compression method selection */ | |||
380 | "+VSP", /* V.253 10.5.1 - Voice speakerphone state */ | |||
381 | "+VTA", /* V.253 10.5.4 - Train acoustic echo-canceller */ | |||
382 | "+VTD", /* V.253 10.2.9 - Beep tone duration timer */ | |||
383 | "+VTER", /* V.252 6.4 - Simple telephony event report */ | |||
384 | "+VTH", /* V.253 10.5.5 - Train line echo-canceller */ | |||
385 | "+VTR", /* V.253 10.1.4 - Voice duplex state */ | |||
386 | "+VTS", /* V.253 10.1.5 - DTMF and tone generation in voice */ | |||
387 | "+VTX", /* V.253 10.1.6 - Transmit data state */ | |||
388 | "+VXT", /* IS-101 10.1.5 - Translate voice data */ | |||
389 | "+W", /* TIA-678 5.2.4.1 - Compliance indication */ | |||
390 | "+WBAG", /* TIA-678 C.5.6 Bias modem audio gain */ | |||
391 | "+WCDA", /* TIA-678 B.3.2.5 Display data link address */ | |||
392 | "+WCHG", /* TIA-678 B.3.2.4 Display battery charging status */ | |||
393 | "+WCID", /* TIA-678 B.3.2.1 Display system ID (operator) */ | |||
394 | "+WCLK", /* TIA-678 B.3.2.3 Lock/unlock DCE */ | |||
395 | "+WCPN", /* TIA-678 B.3.2.2 Set personal identification number */ | |||
396 | "+WCXF", /* TIA-678 B.3.2.6 Display supported annex B commands */ | |||
397 | "+WDAC", /* TIA-678 C.5.1 Data over analogue cellular command query */ | |||
398 | "+WDIR", /* TIA-678 C.5.8 Phone number directory selection */ | |||
399 | "+WECR", /* TIA-678 C.5.3 Enable cellular result codes */ | |||
400 | "+WFON", /* TIA-678 C.5.5 Phone specification */ | |||
401 | "+WKPD", /* TIA-678 C.5.7 Keypad emulation */ | |||
402 | "+WPBA", /* TIA-678 C.5.9 Phone battery query */ | |||
403 | "+WPTH", /* TIA-678 C.5.10 Call path */ | |||
404 | "+WRLK", /* TIA-678 C.5.4 Roam lockout */ | |||
405 | "+WS45", /* TIA-678 5.2.4.2 DTE-side stack selection */ | |||
406 | "+WS46", /* 3GPP TS 27.007 5.9 - PCCA STD-101 [17] select wireless network */ | |||
407 | "+WS50", /* TIA-678 B.3.1.1 Normalized signal strength */ | |||
408 | "+WS51", /* TIA-678 B.3.1.2 Carrier detect signal threshold */ | |||
409 | "+WS52", /* TIA-678 B.3.1.3 Normalized battery level */ | |||
410 | "+WS53", /* TIA-678 B.3.1.4 Normalized channel quality */ | |||
411 | "+WS54", /* TIA-678 B.3.1.5 Carrier detect channel quality threshold */ | |||
412 | "+WS57", /* TIA-678 B.3.1.7 Antenna preference */ | |||
413 | "+WS58", /* TIA-678 B.3.1.8 Idle time-out value */ | |||
414 | "+WSTL", /* TIA-678 C.5.2 Call session time limit */ | |||
415 | ";", /* Dummy to absorb semi-colon delimiters in commands */ | |||
416 | "A", /* V.250 6.3.5 - Answer */ | |||
417 | "D", /* V.250 6.3.1 - Dial */ | |||
418 | "E", /* V.250 6.2.4 - Command echo */ | |||
419 | "H", /* V.250 6.3.6 - Hook control */ | |||
420 | "I", /* V.250 6.1.3 - Request identification information */ | |||
421 | "L", /* V.250 6.3.13 - Monitor speaker loudness */ | |||
422 | "M", /* V.250 6.3.14 - Monitor speaker mode */ | |||
423 | "O", /* V.250 6.3.7 - Return to online data state */ | |||
424 | "P", /* V.250 6.3.3 - Select pulse dialling (command) */ | |||
425 | "Q", /* V.250 6.2.5 - Result code suppression */ | |||
426 | "S0", /* V.250 6.3.8 - Automatic answer */ | |||
427 | "S10", /* V.250 6.3.12 - Automatic disconnect delay */ | |||
428 | "S3", /* V.250 6.2.1 - Command line termination character */ | |||
429 | "S4", /* V.250 6.2.2 - Response formatting character */ | |||
430 | "S5", /* V.250 6.2.3 - Command line editing character */ | |||
431 | "S6", /* V.250 6.3.9 - Pause before blind dialling */ | |||
432 | "S7", /* V.250 6.3.10 - Connection completion timeout */ | |||
433 | "S8", /* V.250 6.3.11 - Comma dial modifier time */ | |||
434 | "T", /* V.250 6.3.2 - Select tone dialling (command) */ | |||
435 | "V", /* V.250 6.2.6 - DCE response format */ | |||
436 | "X", /* V.250 6.2.7 - Result code selection and call progress monitoring control */ | |||
437 | "Z", /* V.250 6.1.1 - Reset to default configuration */ | |||
438 | NULL((void*)0) | |||
439 | }; | |||
440 | ||||
441 | int packed_ptr = 0; | |||
442 | ||||
443 | short int packed_trie[30000]; | |||
444 | ||||
445 | #define ALPHABET_SIZE128 128 | |||
446 | ||||
447 | typedef struct trie_node_s | |||
448 | { | |||
449 | int first; | |||
450 | int last; | |||
451 | int node_no; | |||
452 | int entry; | |||
453 | /* Array of pointers to children */ | |||
454 | struct trie_node_s *child_list[ALPHABET_SIZE128]; | |||
455 | } trie_node_t; | |||
456 | ||||
457 | typedef struct | |||
458 | { | |||
459 | int entries; | |||
460 | /* The root of the trie */ | |||
461 | trie_node_t *root; | |||
462 | } trie_t; | |||
463 | ||||
464 | static trie_node_t *trie_node_create(void) | |||
465 | { | |||
466 | trie_node_t *s; | |||
467 | ||||
468 | if ((s = (trie_node_t *) malloc(sizeof(*s)))) | |||
469 | { | |||
470 | memset(s, 0, sizeof(*s)); | |||
471 | s->first = ALPHABET_SIZE128 - 1; | |||
472 | } | |||
473 | return s; | |||
474 | } | |||
475 | /*- End of function --------------------------------------------------------*/ | |||
476 | ||||
477 | static trie_t *trie_create(void) | |||
478 | { | |||
479 | trie_t *s; | |||
480 | ||||
481 | if ((s = (trie_t *) malloc(sizeof(*s)))) | |||
482 | { | |||
483 | memset(s, 0, sizeof(*s)); | |||
484 | s->root = trie_node_create(); | |||
485 | } | |||
486 | return s; | |||
487 | } | |||
488 | /*- End of function --------------------------------------------------------*/ | |||
489 | ||||
490 | static void trie_recursive_add_node_numbers(trie_node_t *t) | |||
491 | { | |||
492 | int index; | |||
493 | ||||
494 | if (t) | |||
495 | { | |||
496 | if (t->first <= t->last) | |||
497 | { | |||
498 | t->node_no = packed_ptr + 1; | |||
499 | packed_ptr += (t->last - t->first + 1 + 3); | |||
500 | for (index = 0; index < ALPHABET_SIZE128; index++) | |||
501 | trie_recursive_add_node_numbers(t->child_list[index]); | |||
502 | } | |||
503 | else | |||
504 | { | |||
505 | t->node_no = packed_ptr + 1; | |||
506 | packed_ptr += 3; | |||
507 | } | |||
508 | } | |||
509 | } | |||
510 | /*- End of function --------------------------------------------------------*/ | |||
511 | ||||
512 | static void trie_recursive_build_packed_trie(trie_node_t *t) | |||
513 | { | |||
514 | int i; | |||
515 | ||||
516 | if (t) | |||
517 | { | |||
518 | if (t->first <= t->last) | |||
519 | { | |||
520 | packed_trie[packed_ptr++] = t->first; | |||
521 | packed_trie[packed_ptr++] = t->last; | |||
522 | packed_trie[packed_ptr++] = t->entry; | |||
523 | for (i = t->first; i <= t->last; i++) | |||
524 | packed_trie[packed_ptr++] = (t->child_list[i]) ? t->child_list[i]->node_no : 0; | |||
525 | for (i = t->first; i <= t->last; i++) | |||
526 | trie_recursive_build_packed_trie(t->child_list[i]); | |||
527 | } | |||
528 | else | |||
529 | { | |||
530 | packed_trie[packed_ptr++] = 1; | |||
531 | packed_trie[packed_ptr++] = 0; | |||
532 | packed_trie[packed_ptr++] = t->entry; | |||
533 | } | |||
534 | } | |||
535 | } | |||
536 | /*- End of function --------------------------------------------------------*/ | |||
537 | ||||
538 | static void trie_add(trie_t *s, const char *u, size_t len) | |||
539 | { | |||
540 | size_t i; | |||
541 | int index; | |||
542 | trie_node_t *t; | |||
543 | ||||
544 | s->entries++; | |||
545 | /* Loop over the length of the string to add and traverse the trie... */ | |||
546 | for (t = s->root, i = 0; i < len; i++) | |||
547 | { | |||
548 | /* The character in u we are processing... */ | |||
549 | index = (unsigned char) u[i]; | |||
550 | ||||
551 | /* Is there a child node for this character? */ | |||
552 | if (t->child_list[index] == NULL((void*)0)) | |||
553 | { | |||
554 | if ((t->child_list[index] = trie_node_create()) == NULL((void*)0)) | |||
555 | exit(2); | |||
556 | if (index < t->first) | |||
557 | t->first = index; | |||
558 | if (index > t->last) | |||
559 | t->last = index; | |||
560 | } | |||
561 | ||||
562 | /* Move to the new node... and loop */ | |||
563 | t = t->child_list[index]; | |||
564 | } | |||
565 | t->entry = s->entries; | |||
566 | } | |||
567 | /*- End of function --------------------------------------------------------*/ | |||
568 | ||||
569 | static void dump_trie(void) | |||
570 | { | |||
571 | int i; | |||
572 | ||||
573 | printf("\nstatic const at_cmd_service_t at_commands[] =\n{\n"); | |||
574 | for (i = 0; wordlist[i]; i++) | |||
575 | { | |||
576 | switch (wordlist[i][0]) | |||
577 | { | |||
578 | case ' ': | |||
579 | case ';': | |||
580 | printf(" at_cmd_dummy,\n"); | |||
581 | break; | |||
582 | case '+': | |||
583 | printf(" at_cmd_plus_%s,\n", wordlist[i] + 1); | |||
584 | break; | |||
585 | case '&': | |||
586 | printf(" at_cmd_amp_%s,\n", wordlist[i] + 1); | |||
587 | break; | |||
588 | default: | |||
589 | printf(" at_cmd_%s,\n", wordlist[i]); | |||
590 | break; | |||
591 | } | |||
592 | } | |||
593 | printf("};\n"); | |||
594 | ||||
595 | printf("\nstatic const uint16_t command_trie[] =\n{"); | |||
596 | for (i = 0; i < packed_ptr; i++) | |||
597 | { | |||
598 | if ((i & 7) == 0) | |||
599 | printf("\n "); | |||
600 | printf("0x%04X, ", packed_trie[i]); | |||
601 | } | |||
602 | printf("\n};\n"); | |||
603 | printf("\n#define COMMAND_TRIE_LEN %d\n", packed_ptr); | |||
604 | ||||
605 | } | |||
606 | /*- End of function --------------------------------------------------------*/ | |||
607 | ||||
608 | int main(int argc, char *argv[]) | |||
609 | { | |||
610 | trie_t *s; | |||
611 | int i; | |||
612 | ||||
613 | if ((s = trie_create()) == NULL((void*)0)) | |||
| ||||
614 | exit(2); | |||
615 | ||||
616 | printf("/* THIS FILE WAS AUTOMATICALLY GENERATED - ANY MODIFICATIONS MADE TO THIS"); | |||
617 | printf(" FILE MAY BE OVERWRITTEN DURING FUTURE BUILDS OF THE SOFTWARE */\n"); | |||
618 | printf("\n"); | |||
619 | ||||
620 | for (i = 0; wordlist[i]; i++) | |||
621 | trie_add(s, wordlist[i], strlen(wordlist[i])); | |||
622 | printf("// The trie contains %d entries\n", i); | |||
623 | ||||
624 | packed_ptr = 0; | |||
625 | trie_recursive_add_node_numbers(s->root); | |||
626 | packed_ptr = 0; | |||
627 | trie_recursive_build_packed_trie(s->root); | |||
| ||||
628 | ||||
629 | dump_trie(); | |||
630 | ||||
631 | return 0; | |||
632 | } | |||
633 | /*- End of function --------------------------------------------------------*/ | |||
634 | /*- End of file ------------------------------------------------------------*/ |