Version 6.3
Copyright © 2005 - 2012 Lowell D. Thomas
APG
  … ABNF Parser Generator
All Data Structures Files Functions Variables Typedefs Macros Pages
main.c
Go to the documentation of this file.
1 /*******************************************************************************
2  APG Version 6.3
3  Copyright (C) 2005 - 2012 Lowell D. Thomas, all rights reserved
4 
5  author: Lowell D. Thomas
6  email: lowell@coasttocoastresearch.com
7  website: http://www.coasttocoastresearch.com
8 
9  This program is free software: you can redistribute it and/or modify
10  it under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 2 of the License, or
12  (at your option) any later version.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program. If not, see
21  <http://www.gnu.org/licenses/old-licenses/gpl-2.0.html>
22  or write to the Free Software Foundation, Inc.,
23  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 *******************************************************************************/
25 
26 #include "main.h"
72 static apg_uint uiGetMsgs(INPUT* spInput);
73 static apg_uint uiGetStats(INPUT* spInput, OUTPUT* spOuput, apg_uint uiLevel);
74 static apg_uint uiGetTimes(INPUT* spInput, OUTPUT* spOutput, apg_uint uiParserLevel);
75 static void* vpGetParser(void* vpMemCtx, apg_uint uiLevel);
76 static void vDisplayResults(apg_uint uiParserCount, OUTPUT* spOutput);
77 
78 int main() {
79  char* cpMgsText = "TortureTests.txt";
80  FILE* spOut = stdout;
81  INPUT sInput;
82  OUTPUT sOutput;
83  apg_uint i, uiTest;
84  apg_uint uiParserCount = 6;
85  void* vpaParserCtx[uiParserCount];
86  TIME_INFO saTimeInfo[uiParserCount];
87  STATS_INFO saStatsInfo[uiParserCount];
88 
89  fprintf(spOut, "*** main: SIP testing: begin\n");
90 
91  // input set up
92  sInput.vpMemCtx = vpMemCtor();
93  MASSERT(sInput.vpMemCtx);
94  sInput.vpVecMsgChars = vpVecCtor(sInput.vpMemCtx, sizeof(apg_achar), 1000);
95  MASSERT(sInput.vpVecMsgChars);
96  sInput.vpVecMsgs = vpVecCtor(sInput.vpMemCtx, sizeof(MSG), 100);
97  MASSERT(sInput.vpVecMsgs);
98  sInput.vpTimer = vpTimerCtor(sInput.vpMemCtx);
99  MASSERT(sInput.vpTimer);
100  sInput.uiParserCount = uiParserCount;
101  sInput.uiTimeRepetitions = 1000;
102  sInput.vppParsers = &vpaParserCtx[0];
103  sInput.cpMsgsTextFile = cpMgsText;
104 
105  // output setup
106  sOutput.spStatsResults = &saStatsInfo[0];
107  sOutput.spTimeResults = &saTimeInfo[0];
108 
109  // get the torture test messages
110  uiTest = uiGetMsgs(&sInput);
111  MASSERT(uiTest);
112 
113  // get the parsers
114  for(i = 0; i < sInput.uiParserCount; i++){
115  sInput.vppParsers[i] = vpGetParser(sInput.vpMemCtx, i);
116  MASSERT(sInput.vppParsers[i]);
117  }
118 
119  uiTest = uiParserStatsEnable(sInput.vppParsers[0], APG_FALSE);
120  if(uiTest){
121  // get the statistics for each parser
122  for(i = 0; i < sInput.uiParserCount; i++){
123  uiTest = uiGetStats(&sInput, &sOutput, i);
124  MASSERT(uiTest);
125 
126  }
127  }else{
128  sOutput.spStatsResults = NULL;
129  }
130 
131  // get the times for each parser
132  fprintf(spOut, "\n*** Time tests running - this may take a few moments ...\n");
133  for(i = 0; i < sInput.uiParserCount; i++){
134  uiTest = uiGetTimes(&sInput, &sOutput, i);
135  MASSERT(uiTest);
136  }
137 
138  // display comparison results
139  vDisplayResults(uiParserCount, &sOutput);
140 
141  vMemDtor(sInput.vpMemCtx);
142  fprintf(spOut, "\n");
143  fprintf(spOut, "*** main: SIP testing: end: EXIT_SUCCESS\n");
144  return EXIT_SUCCESS;
145 }
146 
147 static apg_uint uiGetStats(INPUT* spInput, OUTPUT* spOutput, apg_uint uiParserLevel){
148  apg_uint uiRet = 0;
149  apg_uint i, uiTest;
150  FILE* spOut = stdout;
151  void* vpParser = spInput->vppParsers[uiParserLevel];
152  apg_uint uiStatsBufferSize = 100000;
153  char caStatsBuffer[uiStatsBufferSize];
154  APG_PARSER_STATS* spStats = (APG_PARSER_STATS*)&caStatsBuffer[0];
155  STATS_INFO* spStatsInfo = &spOutput->spStatsResults[uiParserLevel];
156 
157  uiTest = uiParserStatsEnable(vpParser, APG_TRUE);
158  if(!uiTest){
159  fprintf(spOut, "*** PARSER STATISTICS: statistics not available\n");
160  return APG_TRUE;
161  }
162 
163  // parse the messages
164  fprintf(spOut, "\n");
165  fprintf(spOut, "*** PARSER STATISTICS: parser level: %u\n", (apg_uint)uiParserLevel);
166  for(i = 0; i < spInput->uiMsgCount; i++){
167  uiTest = uiParserSyntaxAnalysis(vpParser, 0,
168  spInput->spMsgs[i].acpMsg, spInput->spMsgs[i].uiLength, NULL);
169  if(!uiTest){fprintf(spOut, "\n - SIP MESSAGE = %u: PARSER FAILED: parser level: %u\n",
170  (apg_uint)i, (apg_uint)uiParserLevel);}
171  else{uiRet++;}
172  }
173 
174  // look at the parsing statistics
175  fprintf(spOut, "*** PARSER STATISTICS: message count: %u\n", (apg_uint)spInput->uiMsgCount);
176  uiParserStatsGet(vpParser, NULL, &uiTest);
177  fprintf(spOut, "*** PARSER STATISTICS: buffer size: needed: %u: have: %u\n",
178  (apg_uint)uiTest, (apg_uint)uiStatsBufferSize);
179  if(uiTest <= uiStatsBufferSize){
180  uiParserStatsGet(vpParser, spStats, &uiTest);
181  fprintf(spOut, "*** PARSER STATISTICS:\n");
182  vDisplayOperatorStats(spOut, spStats);
183  vDisplayRuleStats(spOut, spStats, "count");
184  spStatsInfo->uiaNodeStats[0] = spStats->sRnm.uiTotal;
185  spStatsInfo->uiaNodeStats[1] = spStats->sUdt.uiTotal;
186  spStatsInfo->uiaNodeStats[2] = spStats->sRep.uiTotal;
187  spStatsInfo->uiaNodeStats[3] = spStats->sAlt.uiTotal;
188  spStatsInfo->uiaNodeStats[4] = spStats->sCat.uiTotal;
189  spStatsInfo->uiaNodeStats[5] = spStats->sAnd.uiTotal;
190  spStatsInfo->uiaNodeStats[6] = spStats->sNot.uiTotal;
191  spStatsInfo->uiaNodeStats[7] = spStats->sTrg.uiTotal;
192  spStatsInfo->uiaNodeStats[8] = spStats->sTbs.uiTotal;
193  spStatsInfo->uiaNodeStats[9] = spStats->sTls.uiTotal;
194  spStatsInfo->uiaNodeStats[10] = spStats->sTotal.uiTotal;
195  } else{
196  fprintf(spOut, "*** PARSER STATISTICS: insufficient buffer size: needed: %u: have: %u\n",
197  (apg_uint)uiTest, (apg_uint)uiStatsBufferSize);
198  spStatsInfo->uiaNodeStats[0] = APG_UNDEFINED;
199  spStatsInfo->uiaNodeStats[1] = APG_UNDEFINED;
200  spStatsInfo->uiaNodeStats[2] = APG_UNDEFINED;
201  spStatsInfo->uiaNodeStats[3] = APG_UNDEFINED;
202  spStatsInfo->uiaNodeStats[4] = APG_UNDEFINED;
203  spStatsInfo->uiaNodeStats[5] = APG_UNDEFINED;
204  spStatsInfo->uiaNodeStats[6] = APG_UNDEFINED;
205  spStatsInfo->uiaNodeStats[7] = APG_UNDEFINED;
206  spStatsInfo->uiaNodeStats[8] = APG_UNDEFINED;
207  spStatsInfo->uiaNodeStats[9] = APG_UNDEFINED;
208  spStatsInfo->uiaNodeStats[10] = APG_UNDEFINED;
209  }
210 
211  return uiRet;
212 }
213 static apg_uint uiGetTimes(INPUT* spInput, OUTPUT* spOutput, apg_uint uiParserLevel){
214  apg_uint uiRepsMax = 1000;
215  apg_uint uiReps = 0;
216  apg_uint uiMsgs;
217  apg_uint uiMsgChars;
218  apg_uint i, j, uiTest;
219  double dDuration = 0.0;
220  FILE* spOut = stdout;
221 
222  // parse the messages
223  if(spInput->uiTimeRepetitions > uiRepsMax){
224  fprintf(spOut, "*** uiGetTimes: uiReps = %u: reduced to uiRepsMax = %u\n",
225  (apg_uint)spInput->uiTimeRepetitions, (apg_uint)uiRepsMax);
226  spInput->uiTimeRepetitions = uiRepsMax;
227  }
228  uiReps = 0;
229  uiMsgs = 0;
230  uiMsgChars = 0;
231  uiTimerStart(spInput->vpTimer);
232  for(j = 0; j < spInput->uiTimeRepetitions; j++){
233  for(i = 0; i < spInput->uiMsgCount; i++){
234  uiTest = uiParserSyntaxAnalysis(spInput->vppParsers[uiParserLevel],
235  RULE_SIPGRAMMAR_SIP_MESSAGE, spInput->spMsgs[i].acpMsg, spInput->spMsgs[i].uiLength, NULL);
236  if(!uiTest){
237  fprintf(spOut, "\n - SIP MESSAGE = %u: PARSER FAILED\n", (apg_uint)i);
238  }
239  else{
240  uiMsgs++;
241  uiMsgChars += spInput->spMsgs[i].uiLength;
242  }
243  }
244  }
245  uiTimerStop(spInput->vpTimer);
246 
247  // look at the parsing statistics
248  dDuration = dTimerDuration(spInput->vpTimer, APG_TIMER_MILLISEC);
249  spOutput->spTimeResults[uiParserLevel].dTime = dDuration;
250  spOutput->spTimeResults[uiParserLevel].uiMsgs = uiMsgs;
251  spOutput->spTimeResults[uiParserLevel].uiMsgChars = uiMsgChars;
252  fprintf(spOut, "\n");
253  fprintf(spOut, "*** uiGetTimes: time(msec): %1.4G\n", dDuration);
254  fprintf(spOut, " uiGetTimes: messages: %u:\n", (apg_uint)uiMsgs);
255  fprintf(spOut, " uiGetTimes: message characters: %u:\n", (apg_uint)uiMsgChars);
256  fprintf(spOut, " uiGetTimes: time(msec)/msg: %1.4G\n", dDuration/(double)uiMsgs);
257  fprintf(spOut, " uiGetTimes: time(msec)/char: %1.4G\n", dDuration/(double)uiMsgChars);
258 
259  return uiMsgs;
260 }
261 static void* vpGetParser(void* vpMemCtx, apg_uint uiLevel){
262  void* vpRet = NULL;
263  void* vpParser = NULL;
264  APG_CALLBACK saGrammar1UdtLib[UDT_COUNT_GRAMMAR1];
265  APG_CALLBACK saGrammar2UdtLib[UDT_COUNT_GRAMMAR2];
266  APG_CALLBACK saGrammar3UdtLib[UDT_COUNT_GRAMMAR3];
267  APG_CALLBACK saGrammar4UdtLib[UDT_COUNT_GRAMMAR4];
268  APG_CALLBACK saGrammar5UdtLib[UDT_COUNT_GRAMMAR5];
269  memset((void*)saGrammar1UdtLib, 0, sizeof(APG_CALLBACK) * UDT_COUNT_GRAMMAR1);
270  memset((void*)saGrammar2UdtLib, 0, sizeof(APG_CALLBACK) * UDT_COUNT_GRAMMAR2);
271  memset((void*)saGrammar3UdtLib, 0, sizeof(APG_CALLBACK) * UDT_COUNT_GRAMMAR3);
272  memset((void*)saGrammar4UdtLib, 0, sizeof(APG_CALLBACK) * UDT_COUNT_GRAMMAR4);
273  memset((void*)saGrammar5UdtLib, 0, sizeof(APG_CALLBACK) * UDT_COUNT_GRAMMAR5);
274 
275  switch(uiLevel){
276  case 0:
277  vpParser = vpParserCtor(vpParserInit_SIPGrammar, vTerminalAlert);
278  if(vpParser){vpRet = vpParser;}
279  break;
280  case 1:
281  vpParser = vpParserCtor(vpParserInit_Grammar1, vTerminalAlert);
282  if(vpParser){vpRet = vpParser;}
283  saGrammar1UdtLib[UDT_GRAMMAR1_U_TOKEN] = (APG_CALLBACK)uiSIP_u_token;
284  saGrammar1UdtLib[UDT_GRAMMAR1_U_UNRESERVED] = (APG_CALLBACK)uiSIP_u_unreserved;
285  saGrammar1UdtLib[UDT_GRAMMAR1_E_DOMAINLABEL] = (APG_CALLBACK)uiSIP_e_domainlabel;
286  saGrammar1UdtLib[UDT_GRAMMAR1_U_TOPLABEL] = (APG_CALLBACK)uiSIP_u_toplabel;
287  saGrammar1UdtLib[UDT_GRAMMAR1_U_SCHEME] = (APG_CALLBACK)uiSIP_u_scheme;
288  saGrammar1UdtLib[UDT_GRAMMAR1_U_CALLID] = (APG_CALLBACK)uiSIP_u_callid;
289  saGrammar1UdtLib[UDT_GRAMMAR1_U_RFC1035DOMAIN] = (APG_CALLBACK)uiSIP_u_rfc1035domain;
290  uiParserSyntaxInitCallbacks(vpParser, NULL, &saGrammar1UdtLib[0]);
291  break;
292  case 2:
293  vpParser = vpParserCtor(vpParserInit_Grammar2, vTerminalAlert);
294  if(vpParser){vpRet = vpParser;}
295  // Grammar1
296  saGrammar2UdtLib[UDT_GRAMMAR2_U_TOKEN] = (APG_CALLBACK)uiSIP_u_token;
297  saGrammar2UdtLib[UDT_GRAMMAR2_U_UNRESERVED] = (APG_CALLBACK)uiSIP_u_unreserved;
298  saGrammar2UdtLib[UDT_GRAMMAR2_U_ONE_OR_MORE_UNRESERVED] = (APG_CALLBACK)uiSIP_u_one_or_more_unreserved;
299  saGrammar2UdtLib[UDT_GRAMMAR2_E_DOMAINLABEL] = (APG_CALLBACK)uiSIP_e_domainlabel;
300  saGrammar2UdtLib[UDT_GRAMMAR2_U_TOPLABEL] = (APG_CALLBACK)uiSIP_u_toplabel;
301  saGrammar2UdtLib[UDT_GRAMMAR2_U_SCHEME] = (APG_CALLBACK)uiSIP_u_scheme;
302  saGrammar2UdtLib[UDT_GRAMMAR2_U_CALLID] = (APG_CALLBACK)uiSIP_u_callid;
303  saGrammar2UdtLib[UDT_GRAMMAR2_U_RFC1035DOMAIN] = (APG_CALLBACK)uiSIP_u_rfc1035domain;
304  // Grammar2
305  saGrammar2UdtLib[UDT_GRAMMAR2_U_HCOLON] = (APG_CALLBACK)uiSIP_u_HColon;
306  saGrammar2UdtLib[UDT_GRAMMAR2_U_COMMA] = (APG_CALLBACK)uiSIP_u_Comma;
307  saGrammar2UdtLib[UDT_GRAMMAR2_U_SEMI] = (APG_CALLBACK)uiSIP_u_Semi;
308  saGrammar2UdtLib[UDT_GRAMMAR2_U_SLASH] = (APG_CALLBACK)uiSIP_u_Slash;
309  saGrammar2UdtLib[UDT_GRAMMAR2_U_EQUAL] = (APG_CALLBACK)uiSIP_u_Equal;
310  saGrammar2UdtLib[UDT_GRAMMAR2_U_LAQUOT] = (APG_CALLBACK)uiSIP_u_LAQuot;
311  saGrammar2UdtLib[UDT_GRAMMAR2_U_RAQUOT] = (APG_CALLBACK)uiSIP_u_RAQuot;
312  saGrammar2UdtLib[UDT_GRAMMAR2_U_LDQUOT] = (APG_CALLBACK)uiSIP_u_LDQuot;
313  saGrammar2UdtLib[UDT_GRAMMAR2_U_RDQUOT] = (APG_CALLBACK)uiSIP_u_RDQuot;
314  saGrammar2UdtLib[UDT_GRAMMAR2_U_LHEX] = (APG_CALLBACK)uiSIP_u_LHEX;
315  saGrammar2UdtLib[UDT_GRAMMAR2_U_STAR] = (APG_CALLBACK)uiSIP_u_Star;
316  saGrammar2UdtLib[UDT_GRAMMAR2_U_COLON] = (APG_CALLBACK)uiSIP_u_Colon;
317  saGrammar2UdtLib[UDT_GRAMMAR2_U_LPAREN] = (APG_CALLBACK)uiSIP_u_LParen;
318  saGrammar2UdtLib[UDT_GRAMMAR2_U_RPAREN] = (APG_CALLBACK)uiSIP_u_RParen;
319  saGrammar2UdtLib[UDT_GRAMMAR2_E_SWS] = (APG_CALLBACK)uiSIP_e_SWS;
320  saGrammar2UdtLib[UDT_GRAMMAR2_U_LWS] = (APG_CALLBACK)uiSIP_u_LWS;
321  saGrammar2UdtLib[UDT_GRAMMAR2_U_NC_VALUE] = (APG_CALLBACK)uiSIP_u_nc_value;
322  saGrammar2UdtLib[UDT_GRAMMAR2_U_REQUEST_DIGEST] = (APG_CALLBACK)uiSIP_u_request_digest;
323  uiParserSyntaxInitCallbacks(vpParser, NULL, &saGrammar2UdtLib[0]);
324  break;
325  case 3:
326  vpParser = vpParserCtor(vpParserInit_Grammar3, vTerminalAlert);
327  if(vpParser){vpRet = vpParser;}
328  // Grammar1
329  saGrammar3UdtLib[UDT_GRAMMAR3_U_TOKEN] = (APG_CALLBACK)uiSIP_u_token;
330  saGrammar3UdtLib[UDT_GRAMMAR3_U_UNRESERVED] = (APG_CALLBACK)uiSIP_u_unreserved;
331  saGrammar3UdtLib[UDT_GRAMMAR3_U_ONE_OR_MORE_UNRESERVED] = (APG_CALLBACK)uiSIP_u_one_or_more_unreserved;
332  saGrammar3UdtLib[UDT_GRAMMAR3_E_DOMAINLABEL] = (APG_CALLBACK)uiSIP_e_domainlabel;
333  saGrammar3UdtLib[UDT_GRAMMAR3_U_TOPLABEL] = (APG_CALLBACK)uiSIP_u_toplabel;
334  saGrammar3UdtLib[UDT_GRAMMAR3_U_SCHEME] = (APG_CALLBACK)uiSIP_u_scheme;
335  saGrammar3UdtLib[UDT_GRAMMAR3_U_CALLID] = (APG_CALLBACK)uiSIP_u_callid;
336  saGrammar3UdtLib[UDT_GRAMMAR3_U_RFC1035DOMAIN] = (APG_CALLBACK)uiSIP_u_rfc1035domain;
337  // Grammar2
338  saGrammar3UdtLib[UDT_GRAMMAR3_U_HCOLON] = (APG_CALLBACK)uiSIP_u_HColon;
339  saGrammar3UdtLib[UDT_GRAMMAR3_U_COMMA] = (APG_CALLBACK)uiSIP_u_Comma;
340  saGrammar3UdtLib[UDT_GRAMMAR3_U_SEMI] = (APG_CALLBACK)uiSIP_u_Semi;
341  saGrammar3UdtLib[UDT_GRAMMAR3_U_SLASH] = (APG_CALLBACK)uiSIP_u_Slash;
342  saGrammar3UdtLib[UDT_GRAMMAR3_U_EQUAL] = (APG_CALLBACK)uiSIP_u_Equal;
343  saGrammar3UdtLib[UDT_GRAMMAR3_U_LAQUOT] = (APG_CALLBACK)uiSIP_u_LAQuot;
344  saGrammar3UdtLib[UDT_GRAMMAR3_U_RAQUOT] = (APG_CALLBACK)uiSIP_u_RAQuot;
345  saGrammar3UdtLib[UDT_GRAMMAR3_U_LDQUOT] = (APG_CALLBACK)uiSIP_u_LDQuot;
346  saGrammar3UdtLib[UDT_GRAMMAR3_U_RDQUOT] = (APG_CALLBACK)uiSIP_u_RDQuot;
347  saGrammar3UdtLib[UDT_GRAMMAR3_U_LHEX] = (APG_CALLBACK)uiSIP_u_LHEX;
348  saGrammar3UdtLib[UDT_GRAMMAR3_U_STAR] = (APG_CALLBACK)uiSIP_u_Star;
349  saGrammar3UdtLib[UDT_GRAMMAR3_U_COLON] = (APG_CALLBACK)uiSIP_u_Colon;
350  saGrammar3UdtLib[UDT_GRAMMAR3_U_LPAREN] = (APG_CALLBACK)uiSIP_u_LParen;
351  saGrammar3UdtLib[UDT_GRAMMAR3_U_RPAREN] = (APG_CALLBACK)uiSIP_u_RParen;
352  saGrammar3UdtLib[UDT_GRAMMAR3_E_SWS] = (APG_CALLBACK)uiSIP_e_SWS;
353  saGrammar3UdtLib[UDT_GRAMMAR3_U_LWS] = (APG_CALLBACK)uiSIP_u_LWS;
354  saGrammar3UdtLib[UDT_GRAMMAR3_U_NC_VALUE] = (APG_CALLBACK)uiSIP_u_nc_value;
355  saGrammar3UdtLib[UDT_GRAMMAR3_U_REQUEST_DIGEST] = (APG_CALLBACK)uiSIP_u_request_digest;
356  // Grammar3
357  saGrammar3UdtLib[UDT_GRAMMAR3_E_MESSAGE_BODY] = (APG_CALLBACK)uiSIP_e_MessageBody;
358  saGrammar3UdtLib[UDT_GRAMMAR3_U_ESCAPED] = (APG_CALLBACK)uiSIP_u_escaped;
359  saGrammar3UdtLib[UDT_GRAMMAR3_U_PNANE] = (APG_CALLBACK)uiSIP_u_pname;
360  saGrammar3UdtLib[UDT_GRAMMAR3_U_PVALUE] = (APG_CALLBACK)uiSIP_u_pvalue;
361  saGrammar3UdtLib[UDT_GRAMMAR3_E_TEXT_UTF8_TRIM] = (APG_CALLBACK)uiSIP_e_text_utf8trim;
362  saGrammar3UdtLib[UDT_GRAMMAR3_U_EXTENSION_HEADER] = (APG_CALLBACK)uiSIP_u_extension_header;
363  saGrammar3UdtLib[UDT_GRAMMAR3_U_ONEORMOREDIGIT] = (APG_CALLBACK)uiSIP_u_OneOrMoreDigit;
364  saGrammar3UdtLib[UDT_GRAMMAR3_E_DIGIT] = (APG_CALLBACK)uiSIP_e_digit;
365  saGrammar3UdtLib[UDT_GRAMMAR3_U_CRLF] = (APG_CALLBACK)uiSIP_u_CRLF;
366  uiParserSyntaxInitCallbacks(vpParser, NULL, &saGrammar3UdtLib[0]);
367  break;
368  case 4:
369  vpParser = vpParserCtor(vpParserInit_Grammar4, vTerminalAlert);
370  if(vpParser){vpRet = vpParser;}
371  // Grammar1
372  saGrammar4UdtLib[UDT_GRAMMAR4_U_TOKEN] = (APG_CALLBACK)uiSIP_u_token;
373  saGrammar4UdtLib[UDT_GRAMMAR4_U_UNRESERVED] = (APG_CALLBACK)uiSIP_u_unreserved;
374  saGrammar4UdtLib[UDT_GRAMMAR4_U_ONE_OR_MORE_UNRESERVED] = (APG_CALLBACK)uiSIP_u_one_or_more_unreserved;
375  saGrammar4UdtLib[UDT_GRAMMAR4_E_DOMAINLABEL] = (APG_CALLBACK)uiSIP_e_domainlabel;
376  saGrammar4UdtLib[UDT_GRAMMAR4_U_TOPLABEL] = (APG_CALLBACK)uiSIP_u_toplabel;
377  saGrammar4UdtLib[UDT_GRAMMAR4_U_SCHEME] = (APG_CALLBACK)uiSIP_u_scheme;
378  saGrammar4UdtLib[UDT_GRAMMAR4_U_CALLID] = (APG_CALLBACK)uiSIP_u_callid;
379  saGrammar4UdtLib[UDT_GRAMMAR4_U_RFC1035DOMAIN] = (APG_CALLBACK)uiSIP_u_rfc1035domain;
380  // Grammar2
381  saGrammar4UdtLib[UDT_GRAMMAR4_U_HCOLON] = (APG_CALLBACK)uiSIP_u_HColon;
382  saGrammar4UdtLib[UDT_GRAMMAR4_U_COMMA] = (APG_CALLBACK)uiSIP_u_Comma;
383  saGrammar4UdtLib[UDT_GRAMMAR4_U_SEMI] = (APG_CALLBACK)uiSIP_u_Semi;
384  saGrammar4UdtLib[UDT_GRAMMAR4_U_SLASH] = (APG_CALLBACK)uiSIP_u_Slash;
385  saGrammar4UdtLib[UDT_GRAMMAR4_U_EQUAL] = (APG_CALLBACK)uiSIP_u_Equal;
386  saGrammar4UdtLib[UDT_GRAMMAR4_U_LAQUOT] = (APG_CALLBACK)uiSIP_u_LAQuot;
387  saGrammar4UdtLib[UDT_GRAMMAR4_U_RAQUOT] = (APG_CALLBACK)uiSIP_u_RAQuot;
388  saGrammar4UdtLib[UDT_GRAMMAR4_U_LDQUOT] = (APG_CALLBACK)uiSIP_u_LDQuot;
389  saGrammar4UdtLib[UDT_GRAMMAR4_U_RDQUOT] = (APG_CALLBACK)uiSIP_u_RDQuot;
390  saGrammar4UdtLib[UDT_GRAMMAR4_U_LHEX] = (APG_CALLBACK)uiSIP_u_LHEX;
391  saGrammar4UdtLib[UDT_GRAMMAR4_U_STAR] = (APG_CALLBACK)uiSIP_u_Star;
392  saGrammar4UdtLib[UDT_GRAMMAR4_U_COLON] = (APG_CALLBACK)uiSIP_u_Colon;
393  saGrammar4UdtLib[UDT_GRAMMAR4_U_LPAREN] = (APG_CALLBACK)uiSIP_u_LParen;
394  saGrammar4UdtLib[UDT_GRAMMAR4_U_RPAREN] = (APG_CALLBACK)uiSIP_u_RParen;
395 // saGrammar4UdtLib[UDT_GRAMMAR4_E_SWS] = (APG_CALLBACK)uiSIP_e_SWS;
396  saGrammar4UdtLib[UDT_GRAMMAR4_U_LWS] = (APG_CALLBACK)uiSIP_u_LWS;
397  saGrammar4UdtLib[UDT_GRAMMAR4_U_NC_VALUE] = (APG_CALLBACK)uiSIP_u_nc_value;
398  saGrammar4UdtLib[UDT_GRAMMAR4_U_REQUEST_DIGEST] = (APG_CALLBACK)uiSIP_u_request_digest;
399  // Grammar3
400  saGrammar4UdtLib[UDT_GRAMMAR4_E_MESSAGE_BODY] = (APG_CALLBACK)uiSIP_e_MessageBody;
401  saGrammar4UdtLib[UDT_GRAMMAR4_U_ESCAPED] = (APG_CALLBACK)uiSIP_u_escaped;
402  saGrammar4UdtLib[UDT_GRAMMAR4_U_PNANE] = (APG_CALLBACK)uiSIP_u_pname;
403  saGrammar4UdtLib[UDT_GRAMMAR4_U_PVALUE] = (APG_CALLBACK)uiSIP_u_pvalue;
404  saGrammar4UdtLib[UDT_GRAMMAR4_E_TEXT_UTF8_TRIM] = (APG_CALLBACK)uiSIP_e_text_utf8trim;
405  saGrammar4UdtLib[UDT_GRAMMAR4_U_EXTENSION_HEADER] = (APG_CALLBACK)uiSIP_u_extension_header;
406  saGrammar4UdtLib[UDT_GRAMMAR4_U_ONEORMOREDIGIT] = (APG_CALLBACK)uiSIP_u_OneOrMoreDigit;
407  saGrammar4UdtLib[UDT_GRAMMAR4_E_DIGIT] = (APG_CALLBACK)uiSIP_e_digit;
408  saGrammar4UdtLib[UDT_GRAMMAR4_U_CRLF] = (APG_CALLBACK)uiSIP_u_CRLF;
409  // Grammar4
410  saGrammar4UdtLib[UDT_GRAMMAR4_U_USER] = (APG_CALLBACK)uiSIP_u_user;
411  saGrammar4UdtLib[UDT_GRAMMAR4_U_IPV4ADDRESS] = (APG_CALLBACK)uiSIP_u_IPv4address;
412  saGrammar4UdtLib[UDT_GRAMMAR4_U_QUOTED_STRING] = (APG_CALLBACK)uiSIP_u_quoted_string;
413  uiParserSyntaxInitCallbacks(vpParser, NULL, &saGrammar4UdtLib[0]);
414  break;
415  case 5:
416  vpParser = vpParserCtor(vpParserInit_Grammar5, vTerminalAlert);
417  if(vpParser){vpRet = vpParser;}
418  // Grammar1
419  saGrammar5UdtLib[UDT_GRAMMAR5_U_TOKEN] = (APG_CALLBACK)uiSIP_u_token;
420  saGrammar5UdtLib[UDT_GRAMMAR5_U_UNRESERVED] = (APG_CALLBACK)uiSIP_u_unreserved;
421  saGrammar5UdtLib[UDT_GRAMMAR5_U_ONE_OR_MORE_UNRESERVED] = (APG_CALLBACK)uiSIP_u_one_or_more_unreserved;
422  saGrammar5UdtLib[UDT_GRAMMAR5_E_DOMAINLABEL] = (APG_CALLBACK)uiSIP_e_domainlabel;
423  saGrammar5UdtLib[UDT_GRAMMAR5_U_TOPLABEL] = (APG_CALLBACK)uiSIP_u_toplabel;
424  saGrammar5UdtLib[UDT_GRAMMAR5_U_SCHEME] = (APG_CALLBACK)uiSIP_u_scheme;
425  saGrammar5UdtLib[UDT_GRAMMAR5_U_CALLID] = (APG_CALLBACK)uiSIP_u_callid;
426  saGrammar5UdtLib[UDT_GRAMMAR5_U_RFC1035DOMAIN] = (APG_CALLBACK)uiSIP_u_rfc1035domain;
427  // Grammar2
428 // saGrammar5UdtLib[UDT_GRAMMAR5_U_HCOLON] = (APG_CALLBACK)uiSIP_u_HColon;
429  saGrammar5UdtLib[UDT_GRAMMAR5_U_COMMA] = (APG_CALLBACK)uiSIP_u_Comma;
430  saGrammar5UdtLib[UDT_GRAMMAR5_U_SEMI] = (APG_CALLBACK)uiSIP_u_Semi;
431  saGrammar5UdtLib[UDT_GRAMMAR5_U_SLASH] = (APG_CALLBACK)uiSIP_u_Slash;
432  saGrammar5UdtLib[UDT_GRAMMAR5_U_EQUAL] = (APG_CALLBACK)uiSIP_u_Equal;
433  saGrammar5UdtLib[UDT_GRAMMAR5_U_LAQUOT] = (APG_CALLBACK)uiSIP_u_LAQuot;
434  saGrammar5UdtLib[UDT_GRAMMAR5_U_RAQUOT] = (APG_CALLBACK)uiSIP_u_RAQuot;
435  saGrammar5UdtLib[UDT_GRAMMAR5_U_LDQUOT] = (APG_CALLBACK)uiSIP_u_LDQuot;
436  saGrammar5UdtLib[UDT_GRAMMAR5_U_RDQUOT] = (APG_CALLBACK)uiSIP_u_RDQuot;
437  saGrammar5UdtLib[UDT_GRAMMAR5_U_LHEX] = (APG_CALLBACK)uiSIP_u_LHEX;
438  saGrammar5UdtLib[UDT_GRAMMAR5_U_STAR] = (APG_CALLBACK)uiSIP_u_Star;
439  saGrammar5UdtLib[UDT_GRAMMAR5_U_COLON] = (APG_CALLBACK)uiSIP_u_Colon;
440  saGrammar5UdtLib[UDT_GRAMMAR5_U_LPAREN] = (APG_CALLBACK)uiSIP_u_LParen;
441  saGrammar5UdtLib[UDT_GRAMMAR5_U_RPAREN] = (APG_CALLBACK)uiSIP_u_RParen;
442 // saGrammar5UdtLib[UDT_GRAMMAR5_E_SWS] = (APG_CALLBACK)uiSIP_e_SWS;
443  saGrammar5UdtLib[UDT_GRAMMAR5_U_LWS] = (APG_CALLBACK)uiSIP_u_LWS;
444  saGrammar5UdtLib[UDT_GRAMMAR5_U_NC_VALUE] = (APG_CALLBACK)uiSIP_u_nc_value;
445  saGrammar5UdtLib[UDT_GRAMMAR5_U_REQUEST_DIGEST] = (APG_CALLBACK)uiSIP_u_request_digest;
446  // Grammar3
447  saGrammar5UdtLib[UDT_GRAMMAR5_E_MESSAGE_BODY] = (APG_CALLBACK)uiSIP_e_MessageBody;
448  saGrammar5UdtLib[UDT_GRAMMAR5_U_ESCAPED] = (APG_CALLBACK)uiSIP_u_escaped;
449  saGrammar5UdtLib[UDT_GRAMMAR5_U_PNANE] = (APG_CALLBACK)uiSIP_u_pname;
450  saGrammar5UdtLib[UDT_GRAMMAR5_U_PVALUE] = (APG_CALLBACK)uiSIP_u_pvalue;
451  saGrammar5UdtLib[UDT_GRAMMAR5_E_TEXT_UTF8_TRIM] = (APG_CALLBACK)uiSIP_e_text_utf8trim;
452  saGrammar5UdtLib[UDT_GRAMMAR5_U_EXTENSION_HEADER] = (APG_CALLBACK)uiSIP_u_extension_header;
453  saGrammar5UdtLib[UDT_GRAMMAR5_U_ONEORMOREDIGIT] = (APG_CALLBACK)uiSIP_u_OneOrMoreDigit;
454  saGrammar5UdtLib[UDT_GRAMMAR5_E_DIGIT] = (APG_CALLBACK)uiSIP_e_digit;
455  saGrammar5UdtLib[UDT_GRAMMAR5_U_CRLF] = (APG_CALLBACK)uiSIP_u_CRLF;
456  // Grammar4
457  saGrammar5UdtLib[UDT_GRAMMAR5_U_USER] = (APG_CALLBACK)uiSIP_u_user;
458  saGrammar5UdtLib[UDT_GRAMMAR5_U_IPV4ADDRESS] = (APG_CALLBACK)uiSIP_u_IPv4address;
459  saGrammar5UdtLib[UDT_GRAMMAR5_U_QUOTED_STRING] = (APG_CALLBACK)uiSIP_u_quoted_string;
460  // Grammar5
461  saGrammar5UdtLib[UDT_GRAMMAR5_E_MESSAGE_HEADER] = (APG_CALLBACK)uiSIP_e_message_header;
462  uiParserSyntaxInitCallbacks(vpParser, NULL, &saGrammar5UdtLib[0]);
463  break;
464  default:
465  break;
466  }
467 
468  return vpRet;
469 }
470 
471 // get the torture test messages
472 static apg_uint uiGetMsgs(INPUT* spInput){
473  apg_achar* acpMsgSrc;
474  apg_uint uiMsgLength;
475  apg_uint uiTest;
476 
477  // translate to binary messages
478  uiTest = uiTortureTestTranslator(spInput->vpMemCtx, spInput->cpMsgsTextFile, spInput->vpVecMsgChars);
479  MASSERT(uiTest);
480  acpMsgSrc = (apg_achar*)vpVecFront(spInput->vpVecMsgChars);
481  MASSERT(acpMsgSrc);
482  uiMsgLength = uiVecSize(spInput->vpVecMsgChars);
483  MASSERT(uiMsgLength);
484 
485  // separate the messages into BSTRs
486  spInput->uiMsgCount = uiMessages(acpMsgSrc, uiMsgLength, spInput->vpVecMsgs);
487  MASSERT(spInput->uiMsgCount);
488  spInput->spMsgs = (MSG*)vpVecFront(spInput->vpVecMsgs);
489  MASSERT(spInput->spMsgs);
490 
491  return APG_TRUE;
492 }
493 
494 static void vDisplayResults(apg_uint uiParserCount, OUTPUT* spOutput){
495  apg_uint i, uiNodeType, uiCount, uiBaseCount, uiPreviousCount;
496  double dTime, dBaseTime, dPreviousTime, dBaseFactor, dPreviousFactor;
497  char* cpNodeName;
498 
499  uiBaseCount = 0;
500  dBaseTime = 0.0;
501  if(spOutput->spStatsResults){
502  // node stats
503  printf("\n");
504  printf("*** NODE COUNT COMPARISONS:\n");
505  for(uiNodeType = 0; uiNodeType <= 10; uiNodeType++){
506  switch(uiNodeType){
507  case 0: cpNodeName = "RNM"; break;
508  case 1: cpNodeName = "UDT"; break;
509  case 2: cpNodeName = "REP"; break;
510  case 3: cpNodeName = "ALT"; break;
511  case 4: cpNodeName = "CAT"; break;
512  case 5: cpNodeName = "AND"; break;
513  case 6: cpNodeName = "NOT"; break;
514  case 7: cpNodeName = "TRG"; break;
515  case 8: cpNodeName = "TBS"; break;
516  case 9: cpNodeName = "TLS"; break;
517  case 10: cpNodeName = "TOTAL"; break;
518  }
519  printf("%10s %10s %10s %10s\n", cpNodeName, "total", "base", "previous");
520  printf("%10s %10s %10s %10s\n", "test#", "count", "factor", "factor");
521  uiPreviousCount = 0;
522  for(i = 0; i < uiParserCount; i++){
523  uiCount = spOutput->spStatsResults[i].uiaNodeStats[uiNodeType];
524  if(uiCount == 0){printf("%10u %10u %10s %10s\n", i, uiCount, "--", "--");continue;}
525  if(i == 0){
526  uiBaseCount = spOutput->spStatsResults[i].uiaNodeStats[uiNodeType];
527  printf("%10u %10u %10s %10s\n", i, uiCount, "--", "--");
528  }else{
529  dBaseFactor = (uiCount == 0) ? 0.0 : ((double)uiBaseCount/(double)uiCount);
530  dPreviousFactor = (uiCount == 0) ? 0.0 : ((double)uiPreviousCount/(double)uiCount);
531  printf("%10u %10u %1.4G %1.4G\n", i, uiCount, dBaseFactor, dPreviousFactor);
532  }
533  uiPreviousCount = uiCount;
534  }
535  printf("\n");
536  }
537  }
538 
539  // time stats
540  printf("\n");
541  printf("*** TIME COMPARISONS:\n");
542  printf("%10s %10s %10s %10s\n", "", "total", "base", "previous");
543  printf("%10s %10s %10s %10s\n", "test#", "time(msec)", "factor", "factor");
544  dPreviousTime = 0.0;
545  for(i = 0; i < uiParserCount; i++){
546  dTime = spOutput->spTimeResults[i].dTime;
547  if(i == 0){
548  dBaseTime = spOutput->spTimeResults[i].dTime;
549  printf("%10u %1.4G %10s %10s \n", i, dTime, "--", "--");
550  }else{
551  dBaseFactor = (dTime == 0) ? 0.0 : dBaseTime/dTime;
552  dPreviousFactor = (dTime == 0) ? 0.0 : dPreviousTime/dTime;
553  printf("%10u %1.4G %1.4G %1.4G \n", i, dTime, dBaseFactor, dPreviousFactor);
554  }
555  dPreviousTime = dTime;
556  }
557 }
dTimerDuration
double dTimerDuration(void *vpCtx, double dConversion)
Definition: timer.c:237
APG_PARSER_STATS::sAlt
APG_STAT sAlt
Definition: Apg.h:603
vpVecFront
void * vpVecFront(void *vpCtx)
Definition: Vector.c:396
uiTimerStop
apg_uint uiTimerStop(void *vpCtx)
Definition: timer.c:117
APG_PARSER_STATS
full set of statistics gathered during parsing, uiParserSyntaxAnalysis()
Definition: Apg.h:591
vMemDtor
void vMemDtor(void *vpCtx)
Definition: Memory.c:97
uiParserStatsEnable
apg_uint uiParserStatsEnable(void *vpCtx, apg_uint uiEnable)
Definition: Parser.c:403
uiVecSize
apg_uint uiVecSize(void *vpCtx)
Definition: Vector.c:167
vpVecCtor
void * vpVecCtor(void *vpMemCtx, apg_uint uiElementSize, apg_uint uiInitialAlloc)
Definition: Vector.c:81
apg_uint
unsigned int apg_uint
Definition: Apg.h:169
APG_CALLBACK
apg_uint(* APG_CALLBACK)(APG_CBDATA *spData)
Definition: Apg.h:515
APG_STAT::uiTotal
apg_uint uiTotal
Definition: Apg.h:573
uiTimerStart
apg_uint uiTimerStart(void *vpCtx)
Definition: timer.c:96
vpMemCtor
void * vpMemCtor()
Definition: Memory.c:77
APG_PARSER_STATS::sRep
APG_STAT sRep
Definition: Apg.h:602
APG_PARSER_STATS::sNot
APG_STAT sNot
Definition: Apg.h:606
uiParserSyntaxInitCallbacks
apg_uint uiParserSyntaxInitCallbacks(void *vpCtx, APG_CALLBACK *spRuleCallbacks, APG_CALLBACK *spUdtCallbacks)
Definition: Parser.c:187
vDisplayOperatorStats
void vDisplayOperatorStats(FILE *spOut, APG_PARSER_STATS *spStats)
Definition: Utilities.c:296
APG_PARSER_STATS::sUdt
APG_STAT sUdt
Definition: Apg.h:601
APG_TRUE
#define APG_TRUE
Definition: Apg.h:187
vDisplayRuleStats
void vDisplayRuleStats(FILE *spOut, APG_PARSER_STATS *spStats, const char *cpType)
Definition: Utilities.c:338
MASSERT
#define MASSERT(cond, msg)
Definition: main.cpp:33
vpTimerCtor
void * vpTimerCtor(void *vpMemCtx)
Definition: timer.c:51
APG_PARSER_STATS::sTbs
APG_STAT sTbs
Definition: Apg.h:608
apg_achar
unsigned char apg_achar
Definition: Apg.h:183
APG_PARSER_STATS::sTotal
APG_STAT sTotal
Definition: Apg.h:610
main
int main(int argc, char **argv)
Definition: main.c:115
uiTortureTestTranslator
apg_uint uiTortureTestTranslator(void *vpMemCtx, const char *cpInput, void *vpVecMsgsBinary)
Definition: TortureTestTranslator.c:90
vpParserCtor
void * vpParserCtor(void *vpParserInit, PFN_ALERT pfnAlertHandler)
Definition: Parser.c:58
APG_PARSER_STATS::sRnm
APG_STAT sRnm
Definition: Apg.h:600
APG_UNDEFINED
#define APG_UNDEFINED
Definition: Apg.h:194
APG_PARSER_STATS::sTls
APG_STAT sTls
Definition: Apg.h:609
APG_PARSER_STATS::sCat
APG_STAT sCat
Definition: Apg.h:604
APG_PARSER_STATS::sAnd
APG_STAT sAnd
Definition: Apg.h:605
APG_FALSE
#define APG_FALSE
Definition: Apg.h:190
APG_PARSER_STATS::sTrg
APG_STAT sTrg
Definition: Apg.h:607
vTerminalAlert
void vTerminalAlert(unsigned int uiLine, const char *cpFile)
Definition: Utilities.c:557
uiParserSyntaxAnalysis
apg_uint uiParserSyntaxAnalysis(void *vpCtx, apg_uint uiStartRule, const apg_achar *acpSrc, apg_uint uiSrcLen, void *vpData)
Definition: Parser.c:228
uiParserStatsGet
apg_uint uiParserStatsGet(void *vpCtx, APG_PARSER_STATS *spStats, apg_uint *uipBufferSize)
Definition: Parser.c:422
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/licenses.html or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.