Re-organized sub-directory by category
[staging/basesystem.git] / service / other / rpc_library / tool / apidef.l
1 /**
2  * @file apidef.l
3  * @brief RPC tools--Defining lexical analysis rules for API definition files
4  *
5  */
6 /** @ingroup RPCtool
7  * Defining Lexical Analysis Rules for Use with RPC Tools (apidef)
8  */
9 %{
10 #include <string.h>
11 #include <stdlib.h>
12 #include "apidef.tab.h"
13 %}
14
15 ALPHA    [A-Za-z_]
16 ALPHANUM  [0-9\-A-Za-z_]
17 ALPHANUMDOT  [0-9.\-A-Za-z_/]
18
19 %x include
20 %s apidef
21 %x str_num
22
23 %%
24 INCLUDE      { BEGIN(include); return rpc_INCLUDE; }
25 <include>\<    { return '<'; }
26 <include>{ALPHANUMDOT}+  {
27       yylval.strval = malloc(strlen(yytext)+1);
28       strcpy(yylval.strval, yytext);
29       return rpc_NAME_DOT;
30       }
31 <include>\>    { BEGIN(INITIAL); return '>'; }
32 <include>.    /* ignore */
33
34 RPC_Result    { BEGIN(apidef); return RPC_RESULT; }
35
36 <apidef>STRING/[0-9]+    { BEGIN(str_num);
37       yylval.ival = rpc_STRING; return rpc_STRING; }
38 <str_num>[0-9]+    {
39       BEGIN(apidef);
40       sscanf(yytext, "%d", &yylval.ival);
41       return rpc_NUM;
42       }
43 <str_num>.    /* ignore */
44
45 <apidef>{
46 char  { yylval.ival = rpc_CHAR; return rpc_CHAR; }
47 int  { yylval.ival = rpc_INT; return rpc_INT; }
48 signed[ \t\n]+int  { yylval.ival = rpc_SINT; return rpc_SINT; }
49 unsigned[ \t\n]+int  { yylval.ival = rpc_UINT; return rpc_UINT; }
50 INT8  { yylval.ival = rpc_INT8; return rpc_INT8; }
51 INT16  { yylval.ival = rpc_INT16; return rpc_INT16; }
52 INT32  { yylval.ival = rpc_INT32; return rpc_INT32; }
53 INT64  { yylval.ival = rpc_INT64; return rpc_INT64; }
54 UINT8  { yylval.ival = rpc_UINT8; return rpc_UINT8; }
55 UINT16  { yylval.ival = rpc_UINT16; return rpc_UINT16; }
56 UINT32  { yylval.ival = rpc_UINT32; return rpc_UINT32; }
57 UINT64  { yylval.ival = rpc_UINT64; return rpc_UINT64; }
58 float  { yylval.ival = rpc_FLOAT; return rpc_FLOAT; }
59 double  { yylval.ival = rpc_DOUBLE; return rpc_DOUBLE; }
60 void  { yylval.ival = rpc_VOID; return rpc_VOID; }
61 IN  {
62   fprintf(stderr,
63   "Specification change: IN Pointer argument needs to be prefixed \"const\" instead of \"IN\".\n"
64   );
65   return rpc_UNKNOWN;
66   }
67 OUT  {
68   fprintf(stderr,
69   "Specification change: OUT argument no longer needs to be prefixed with \"OUT\".\n"
70   );
71   /* ignore */
72   }
73 INOUT  { yylval.ival = rpc_INOUT; return rpc_INOUT; }
74 const  { yylval.ival = rpc_CONST; return rpc_CONST; }
75 VARARRAY  { yylval.ival = rpc_VARARRAY; return rpc_VARARRAY; }
76 ARRAYSIZE  { yylval.ival = rpc_ARRAYSIZE; return rpc_ARRAYSIZE; }
77
78 {ALPHA}+{ALPHANUM}*  {
79       yylval.strval = malloc(strlen(yytext)+1);
80       strcpy(yylval.strval, yytext);
81       return rpc_NAME;
82       }
83
84 \(  { return '('; }
85 \)  { return ')'; }
86 \*  { return '*'; }
87 ,  { return ','; }
88 \;  { BEGIN(INITIAL); return ';'; }
89
90 } /* end of <apidef> */
91
92 #.*\n  /* ignore CPP directives */
93
94 {ALPHANUMDOT}+  {
95     fprintf(stderr, "Unknown keyword %s\n", yytext);
96     return rpc_UNKNOWN;
97     }
98
99 [ \t\n]+  /* eat up whitespace */
100
101 %%
102 #ifdef OLD_STUFFS
103 %x portdef
104 %x addr_num
105 PORT      { BEGIN(portdef); return DEFINE_PORT; }
106 <portdef>[0-9]+    {
107       BEGIN(INITIAL);
108       sscanf(yytext, "%d", &yylval.ival);
109       return NUM;
110       }
111
112 <apidef>ADDR/[0-9]+  { BEGIN(addr_num); yylval.ival = _ADDR; return _ADDR; }
113 <addr_num>[0-9]+  {
114       BEGIN(apidef);
115       sscanf(yytext, "%d", &yylval.ival);
116       return NUM;
117       }
118 #endif
119
120 /*
121  * function to free the buffer which flex allocates but not frees
122  */
123 void
124 free_flex_buffer(void)
125 {
126   yy_delete_buffer(YY_CURRENT_BUFFER);
127 }
128
129 /*
130  * dummy function to avoid a warning of not using 'yyunput'
131  */
132 void
133 dummy(void)
134 {
135   yyunput(0, 0);
136 }