xref: /OK3568_Linux_fs/external/xserver/hw/dmx/config/parser.y (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* $XFree86$ */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright 2002-2003 Red Hat Inc., Durham, North Carolina.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * All Rights Reserved.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining
8*4882a593Smuzhiyun  * a copy of this software and associated documentation files (the
9*4882a593Smuzhiyun  * "Software"), to deal in the Software without restriction, including
10*4882a593Smuzhiyun  * without limitation on the rights to use, copy, modify, merge,
11*4882a593Smuzhiyun  * publish, distribute, sublicense, and/or sell copies of the Software,
12*4882a593Smuzhiyun  * and to permit persons to whom the Software is furnished to do so,
13*4882a593Smuzhiyun  * subject to the following conditions:
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the
16*4882a593Smuzhiyun  * next paragraph) shall be included in all copies or substantial
17*4882a593Smuzhiyun  * portions of the Software.
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20*4882a593Smuzhiyun  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21*4882a593Smuzhiyun  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22*4882a593Smuzhiyun  * NON-INFRINGEMENT.  IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
23*4882a593Smuzhiyun  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
24*4882a593Smuzhiyun  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
25*4882a593Smuzhiyun  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26*4882a593Smuzhiyun  * SOFTWARE.
27*4882a593Smuzhiyun  */
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun /*
30*4882a593Smuzhiyun  * Authors:
31*4882a593Smuzhiyun  *   Rickard E. (Rik) Faith <faith@redhat.com>
32*4882a593Smuzhiyun  *
33*4882a593Smuzhiyun  */
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun %{
36*4882a593Smuzhiyun #ifdef HAVE_DMX_CONFIG_H
37*4882a593Smuzhiyun #include <dmx-config.h>
38*4882a593Smuzhiyun #endif
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #include "dmxparse.h"
41*4882a593Smuzhiyun #include <string.h>
42*4882a593Smuzhiyun #include <stdlib.h>
43*4882a593Smuzhiyun #define YYDEBUG 1
44*4882a593Smuzhiyun #define YYERROR_VERBOSE
45*4882a593Smuzhiyun #define YY_USE_PROTOS
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun extern int yylex(void);
48*4882a593Smuzhiyun DMXConfigEntryPtr dmxConfigEntry = NULL;
49*4882a593Smuzhiyun #define APPEND(type, h, t)                 \
50*4882a593Smuzhiyun {                                          \
51*4882a593Smuzhiyun     type pt;                               \
52*4882a593Smuzhiyun     for (pt = h; pt->next; pt = pt->next); \
53*4882a593Smuzhiyun     pt->next = t;                          \
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun %}
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun %union {
58*4882a593Smuzhiyun     DMXConfigTokenPtr      token;
59*4882a593Smuzhiyun     DMXConfigStringPtr     string;
60*4882a593Smuzhiyun     DMXConfigNumberPtr     number;
61*4882a593Smuzhiyun     DMXConfigPairPtr       pair;
62*4882a593Smuzhiyun     DMXConfigFullDimPtr    fdim;
63*4882a593Smuzhiyun     DMXConfigPartDimPtr    pdim;
64*4882a593Smuzhiyun     DMXConfigDisplayPtr    display;
65*4882a593Smuzhiyun     DMXConfigWallPtr       wall;
66*4882a593Smuzhiyun     DMXConfigOptionPtr     option;
67*4882a593Smuzhiyun     DMXConfigParamPtr      param;
68*4882a593Smuzhiyun     DMXConfigCommentPtr    comment;
69*4882a593Smuzhiyun     DMXConfigSubPtr        subentry;
70*4882a593Smuzhiyun     DMXConfigVirtualPtr    virtual;
71*4882a593Smuzhiyun     DMXConfigEntryPtr      entry;
72*4882a593Smuzhiyun }
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 				/* Terminals */
75*4882a593Smuzhiyun %token <token>   '{' '}' ';' '/' T_VIRTUAL T_DISPLAY T_WALL T_OPTION T_PARAM
76*4882a593Smuzhiyun %token <string>  T_STRING
77*4882a593Smuzhiyun %token <pair>    T_DIMENSION T_OFFSET T_ORIGIN
78*4882a593Smuzhiyun %token <comment> T_COMMENT T_LINE_COMMENT
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun                                 /* Non-termials */
81*4882a593Smuzhiyun %type  <token>    Display Wall Terminal Open Close
82*4882a593Smuzhiyun %type  <string>   NameList Name
83*4882a593Smuzhiyun %type  <pair>     Dimension Offset Origin
84*4882a593Smuzhiyun %type  <pdim>     PartialDim
85*4882a593Smuzhiyun %type  <fdim>     FullDim
86*4882a593Smuzhiyun %type  <display>  DisplayEntry
87*4882a593Smuzhiyun %type  <option>   OptionEntry
88*4882a593Smuzhiyun %type  <param>    ParamEntry ParamList Param
89*4882a593Smuzhiyun %type  <subentry> SubList Sub
90*4882a593Smuzhiyun %type  <wall>     WallEntry
91*4882a593Smuzhiyun %type  <virtual>  Virtual
92*4882a593Smuzhiyun %type  <entry>    Program EntryList Entry
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun %%
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun Program : EntryList { dmxConfigEntry = $1; }
97*4882a593Smuzhiyun         ;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun EntryList : Entry
100*4882a593Smuzhiyun           | EntryList Entry { APPEND(DMXConfigEntryPtr,$1,$2); $$ = $1; }
101*4882a593Smuzhiyun           ;
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun Entry : Virtual        { $$ = dmxConfigEntryVirtual($1); }
104*4882a593Smuzhiyun       | T_LINE_COMMENT { $$ = dmxConfigEntryComment($1); }
105*4882a593Smuzhiyun       ;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun Virtual : T_VIRTUAL Open SubList Close
108*4882a593Smuzhiyun           { $$ = dmxConfigCreateVirtual($1, NULL, NULL, $2, $3, $4); }
109*4882a593Smuzhiyun         | T_VIRTUAL Dimension Open SubList Close
110*4882a593Smuzhiyun           { $$ = dmxConfigCreateVirtual($1, NULL, $2, $3, $4, $5); }
111*4882a593Smuzhiyun         | T_VIRTUAL Name Open SubList Close
112*4882a593Smuzhiyun           { $$ = dmxConfigCreateVirtual($1, $2, NULL, $3, $4, $5); }
113*4882a593Smuzhiyun         | T_VIRTUAL Name Dimension Open SubList Close
114*4882a593Smuzhiyun           { $$ = dmxConfigCreateVirtual($1, $2, $3, $4, $5, $6 ); }
115*4882a593Smuzhiyun         ;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun SubList : Sub
118*4882a593Smuzhiyun         | SubList Sub { APPEND(DMXConfigSubPtr,$1,$2); $$ = $1; }
119*4882a593Smuzhiyun         ;
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun Sub : T_LINE_COMMENT { $$ = dmxConfigSubComment($1); }
122*4882a593Smuzhiyun     | DisplayEntry   { $$ = dmxConfigSubDisplay($1); }
123*4882a593Smuzhiyun     | WallEntry      { $$ = dmxConfigSubWall($1); }
124*4882a593Smuzhiyun     | OptionEntry    { $$ = dmxConfigSubOption($1); }
125*4882a593Smuzhiyun     | ParamEntry     { $$ = dmxConfigSubParam($1); }
126*4882a593Smuzhiyun     ;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun OptionEntry : T_OPTION NameList Terminal
129*4882a593Smuzhiyun               { $$ = dmxConfigCreateOption($1, $2, $3); }
130*4882a593Smuzhiyun             ;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun ParamEntry : T_PARAM NameList Terminal
133*4882a593Smuzhiyun              { $$ = dmxConfigCreateParam($1, NULL, $2, NULL, $3); }
134*4882a593Smuzhiyun            | T_PARAM Open ParamList Close
135*4882a593Smuzhiyun              { $$ = dmxConfigCreateParam($1, $2, NULL, $4, NULL);
136*4882a593Smuzhiyun                $$->next = $3;
137*4882a593Smuzhiyun              }
138*4882a593Smuzhiyun            ;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun ParamList : Param
141*4882a593Smuzhiyun           | ParamList Param { APPEND(DMXConfigParamPtr,$1,$2); $$ = $1; }
142*4882a593Smuzhiyun           ;
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun Param : NameList Terminal
145*4882a593Smuzhiyun         { $$ = dmxConfigCreateParam(NULL, NULL, $1, NULL, $2); }
146*4882a593Smuzhiyun       ;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun PartialDim : Dimension Offset
149*4882a593Smuzhiyun              { $$ = dmxConfigCreatePartDim($1, $2); }
150*4882a593Smuzhiyun            | Dimension
151*4882a593Smuzhiyun              { $$ = dmxConfigCreatePartDim($1, NULL); }
152*4882a593Smuzhiyun            | Offset
153*4882a593Smuzhiyun              { $$ = dmxConfigCreatePartDim(NULL, $1); }
154*4882a593Smuzhiyun            ;
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun FullDim : PartialDim '/' PartialDim
157*4882a593Smuzhiyun           { $$ = dmxConfigCreateFullDim($1, $3); }
158*4882a593Smuzhiyun         | '/' PartialDim
159*4882a593Smuzhiyun           { $$ = dmxConfigCreateFullDim(NULL, $2); }
160*4882a593Smuzhiyun         | PartialDim
161*4882a593Smuzhiyun           { $$ = dmxConfigCreateFullDim($1, NULL); }
162*4882a593Smuzhiyun         ;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun DisplayEntry : Display Name FullDim Origin Terminal
165*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, $2, $3, $4, $5); }
166*4882a593Smuzhiyun              | Display FullDim Origin Terminal
167*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, NULL, $2, $3, $4); }
168*4882a593Smuzhiyun              | Display Name Origin Terminal
169*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, $2, NULL, $3, $4); }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun              | Display Name FullDim Terminal
172*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, $2, $3, NULL, $4); }
173*4882a593Smuzhiyun              | Display FullDim Terminal
174*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, NULL, $2, NULL, $3); }
175*4882a593Smuzhiyun              | Display Name Terminal
176*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, $2, NULL, NULL, $3); }
177*4882a593Smuzhiyun              | Display Terminal
178*4882a593Smuzhiyun                { $$ = dmxConfigCreateDisplay($1, NULL, NULL, NULL, $2); }
179*4882a593Smuzhiyun              ;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun WallEntry : Wall Dimension Dimension NameList Terminal
182*4882a593Smuzhiyun             { $$ = dmxConfigCreateWall($1, $2, $3, $4, $5); }
183*4882a593Smuzhiyun           | Wall Dimension NameList Terminal
184*4882a593Smuzhiyun             { $$ = dmxConfigCreateWall($1, $2, NULL, $3, $4); }
185*4882a593Smuzhiyun           | Wall NameList Terminal
186*4882a593Smuzhiyun             { $$ = dmxConfigCreateWall($1, NULL, NULL, $2, $3); }
187*4882a593Smuzhiyun           ;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun Display : T_DISPLAY
190*4882a593Smuzhiyun         | T_DISPLAY T_COMMENT { $$ = $1; $$->comment = $2->comment; }
191*4882a593Smuzhiyun         ;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun Name : T_STRING
194*4882a593Smuzhiyun      | T_STRING T_COMMENT { $$ = $1; $$->comment = $2->comment; }
195*4882a593Smuzhiyun      ;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun Dimension : T_DIMENSION
198*4882a593Smuzhiyun           | T_DIMENSION T_COMMENT { $$ = $1; $$->comment = $2->comment; }
199*4882a593Smuzhiyun           ;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun Offset : T_OFFSET
202*4882a593Smuzhiyun        | T_OFFSET T_COMMENT { $$ = $1; $$->comment = $2->comment; }
203*4882a593Smuzhiyun        ;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun Origin : T_ORIGIN
206*4882a593Smuzhiyun        | T_ORIGIN T_COMMENT { $$ = $1; $$->comment = $2->comment; }
207*4882a593Smuzhiyun        ;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun Terminal : ';'
210*4882a593Smuzhiyun          | ';' T_COMMENT { $$ = $1; $$->comment = $2->comment; }
211*4882a593Smuzhiyun          ;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun Open : '{'
214*4882a593Smuzhiyun      | '{' T_COMMENT { $$ = $1; $$->comment = $2->comment; }
215*4882a593Smuzhiyun      ;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun Close : '}'
218*4882a593Smuzhiyun       | '}' T_COMMENT { $$ = $1; $$->comment = $2->comment; }
219*4882a593Smuzhiyun       ;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun Wall : T_WALL
222*4882a593Smuzhiyun      | T_WALL T_COMMENT { $$ = $1; $$->comment = $2->comment; }
223*4882a593Smuzhiyun      ;
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun NameList : Name
226*4882a593Smuzhiyun          | NameList Name { APPEND(DMXConfigStringPtr, $1, $2); $$ = $1; }
227*4882a593Smuzhiyun          ;
228