123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- /* test program -> switch speed */
- /*
- *
- * Copyright (C) 2001-2003 FhG Fokus
- *
- * This file is part of Kamailio, a free SIP server.
- *
- * Kamailio 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
- *
- * Kamailio 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, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
- /* parsing: compact form:
- * Via: v:
- * From: f:
- * To: t:
- * Cseq: n/a
- * Call-ID: i:
- * Contact: m:
- * Max-Forwards: n/a
- * Route: n/a
- */
- enum { INITIAL=0,
- VIA1, VIA2,
- FROM1, FROM2, FROM3,
- TO1,
- C_START, CSEQ2, CSEQ3,
- CALLID2, CALLID3, CALLID4, CALLID5, CALLID6,
- CONTACT2, CONTACT3, CONTACT4, CONTACT5, CONTACT6,
- M_START, MAXFORWARDS2, MAXFORWARDS3, MAXFORWARDS4, MAXFORWARDS5,
- MAXFORWARDS6, MAXFORWARDS7, MAXFORWARDS8, MAXFORWARDS9, MAXFORWARDS10,
- MAXFORWARDS11,
- ROUTE1, ROUTE2, ROUTE3, ROUTE4,
- /* final states*/
- F_VIA=1000, F_FROM, F_TO, F_CSEQ, F_CALLID, F_CONTACT, F_MAXFORWARDS,
- F_ROUTE,
- I_START,
- UNKNOWN_HEADER=200,
- BODY=220,
- LF=25000,
- };
- #include <stdio.h>
- int main(int argc, char** argv)
- {
- char* t;
- register int state;
- int i;
- int err;
- err=0;
- state=INITIAL;
- printf(" %s (%d)\n", argv[0], argc);
- if (argc<2){
- fprintf(stderr, " no parameters\n");
- exit(-1);
- }
-
- for (i=0;i<10000000;i++){
-
- for(t=argv[1];*t;t++){
- switch(*t){
- case 'V':
- case 'v':
- switch(state){
- case INITIAL:
- state=VIA1;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'I':
- case 'i':
- switch(state){
- case VIA1:
- state=VIA2;
- break;
- case CALLID5:
- state=CALLID6;
- break;
- case INITIAL:
- state=I_START;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'A':
- case 'a':
- switch(state){
- case VIA2:
- state=F_VIA;
- break;
- case C_START: /*CALLID1*/
- state=CALLID2;
- break;
- case CONTACT4:
- state=CONTACT5;
- break;
- case M_START:
- state=MAXFORWARDS2;
- break;
- case MAXFORWARDS8:
- state=MAXFORWARDS9;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'F':
- case 'f':
- switch(state){
- case INITIAL:
- state=FROM1;
- break;
- case MAXFORWARDS4:
- state=MAXFORWARDS5;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'R':
- case 'r':
- switch(state){
- case INITIAL:
- state=ROUTE1;
- break;
- case FROM1:
- state=FROM2;
- break;
- case MAXFORWARDS6:
- state=MAXFORWARDS7;
- break;
- case MAXFORWARDS9:
- state=MAXFORWARDS10;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'O':
- case 'o':
- switch(state){
- case FROM2:
- state=FROM3;
- break;
- case TO1:
- state=F_TO;
- break;
- case C_START: /*CONTACT1 */
- state=CONTACT2;
- break;
- case ROUTE1:
- state=ROUTE2;
- break;
- case MAXFORWARDS5:
- state=MAXFORWARDS6;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'M':
- case 'm':
- switch(state){
- case INITIAL:
- state=M_START;
- break;
- case FROM3:
- state=F_FROM;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'T':
- case 't':
- switch(state){
- case INITIAL:
- state=TO1;
- break;
- case CONTACT3:
- state=CONTACT4;
- break;
- case CONTACT6:
- state=F_CONTACT;
- break;
- case ROUTE3:
- state=ROUTE4;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'C':
- case 'c':
- switch(state){
- case INITIAL:
- state=C_START;
- break;
- case CONTACT5:
- state=CONTACT6;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'S':
- case 's':
- switch(state){
- case C_START:
- state=CSEQ2;
- break;
- case MAXFORWARDS11:
- state=F_MAXFORWARDS;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'E':
- case 'e':
- switch(state){
- case CSEQ2:
- state=CSEQ3;
- break;
- case ROUTE4:
- state=F_ROUTE;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'Q':
- case 'q':
- switch(state){
- case CSEQ3:
- state=F_CSEQ;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'L':
- case 'l':
- switch(state){
- case CALLID2:
- state=CALLID3;
- break;
- case CALLID3:
- state=CALLID4;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'D':
- case 'd':
- switch(state){
- case CALLID6:
- state=F_CALLID;
- break;
- case MAXFORWARDS10:
- state=MAXFORWARDS11;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'N':
- case 'n':
- switch(state){
- case CONTACT2:
- state=CONTACT3;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'X':
- case 'x':
- switch(state){
- case MAXFORWARDS2:
- state=MAXFORWARDS3;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case '-':
- switch(state){
- case CALLID4:
- state=CALLID5;
- break;
- case MAXFORWARDS3:
- state=MAXFORWARDS4;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'W':
- case 'w':
- switch(state){
- case MAXFORWARDS7:
- state=MAXFORWARDS8;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case 'U':
- case 'u':
- switch(state){
- case ROUTE2:
- state=ROUTE3;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case ' ':
- switch(state){
- case INITIAL:
- break; /*eat space */
- case F_VIA:
- case F_FROM:
- case F_TO:
- case F_CSEQ:
- case F_CALLID:
- case F_CONTACT:
- case F_MAXFORWARDS:
- case F_ROUTE:
- break; /* eat trailing space*/
- case VIA1:
- /*compact form: v: */
- state=F_VIA;
- break;
- case FROM1:
- /*compact form f:*/
- state=F_FROM;
- break;
- case TO1:
- /*compact form t:*/
- state=F_TO;
- break;
- case I_START:
- /*compact form i: (Call-ID)*/
- state=F_CALLID;
- break;
- case M_START:
- /*compact form m: (Contact)*/
- state=F_CONTACT;
- break;
- case UNKNOWN_HEADER: break;
- default:
- state=UNKNOWN_HEADER;
- }
- break;
- case ':':
- switch(state){
- case F_VIA:
- case VIA1: /* compact form*/
- case F_FROM:
- case FROM1: /*compact form*/
- case F_TO:
- case TO1: /*compact form*/
- case F_CSEQ:
- case F_CALLID:
- case I_START: /*compact form*/
- case F_CONTACT:
- case M_START: /*compact form*/
- case F_MAXFORWARDS:
- case F_ROUTE:
- // printf("found header, state=%d\n", state);
- state=INITIAL; /* reset to test*/
- break;
- case UNKNOWN_HEADER:
- default:
- /*printf("found unknown header, state=%d\n",
- state);*/
- err=1;
- state=INITIAL;
- }
- break;
- default:
- /*fprintf(stderr, "Unexpected char <%c> encountered"
- " state=%d\n", *t, state);
- exit(-1);*/
- state=UNKNOWN_HEADER;
- }
- }
- } //for i
- if (err) printf("Error unknown header\n");
- printf("final state=%d\n", state);
- exit(0);
- }
|