uss-rename-lex-to-lex-file-20030619
[openafs.git] / src / uss / lex.l
1 %{
2 /*
3  * Copyright 2000, International Business Machines Corporation and others.
4  * All Rights Reserved.
5  * 
6  * This software has been released under the terms of the IBM Public
7  * License.  For details, see the LICENSE file in the top-level source
8  * directory or online at http://www.openafs.org/dl/license10.html
9  */
10
11 #include <afsconfig.h>
12 #include <afs/param.h>
13
14 RCSID("$Header$");
15
16
17 #ifdef HAVE_STRING_H
18 #include <string.h>
19 #else
20 #ifdef HAVE_STRINGS_H
21 #include <strings.h>
22 #endif
23 #endif
24
25 #include "y.tab.h"
26 #include "uss_common.h"
27 int line=1;
28 #ifdef DEBUG
29 #define dprint(x)       {fprintf(stderr, x); fflush(stderr);}
30 #else
31 #define dprint(x)
32 #endif
33 %}
34
35 /* definitions */
36 C       #[^\n]*
37 W       [ \t]+
38 L       [A-Za-z]
39 S       [\.A-Z0-9a-z/$][^ \t\n#=\^\!\|\(\)\{\};]*
40 Q       \"[^\"\n]*[\"\n]
41 INVAL   [^ADEFLSVGX# ]
42 EOL     [\n]
43
44 %%
45 {C}             {dprint(("got a comment\n"));}
46 ^{EOL}          {dprint(("got an empty line\n")); line++;}
47 ^{INVAL}        {uss_procs_PrintErr(line," Invalid command \n");}
48 ^[D]{W}         {dprint(("got a Dir\n"));return(DIR_TKN);}
49 ^[F]{W}         {dprint(("got a File\n"));return(FILE_TKN);}
50 ^[L]{W}         {dprint(("got a Link\n"));return(LINK_TKN);}
51 ^[S]{W}         {dprint(("got a Symlink\n"));return(SYMLINK_TKN);}
52 ^[E]{W}         {dprint(("got an Echo\n"));return(ECHO_TKN);}
53 ^[X]{W}         {dprint(("got an Exec\n"));return(EXEC_TKN);}
54 ^[V]{W}         {dprint(("got a Vol\n"));return(VOL_TKN);}
55 ^[G]{W}         {dprint(("got a Group Declaration\n"));return(GROUP_TKN);}
56 ^[A]{W}         {dprint(("got an Auth\n"));return(AUTH_TKN);}
57 ^[Y]{W}         {dprint(("got a Vol1\n"));return(VOL1_TKN);}
58 {S}             {dprint(("got a string(%s)\n", yytext));
59                  Replace(yytext, yylval.strval);
60                  return(STRING_TKN);
61                 }
62 {Q}             {dprint(("got a quote: '%s'\n", yytext));
63                  Replace(yytext, yylval.strval);
64                  return(STRING_TKN);
65                 }
66 {EOL}           {line++;
67                  return(EOL_TKN);};
68
69 %%
70
71 /*
72  * This routine copies the in buf to out and replaces every known
73  * variable, e.g. $user, $1, ... by its value.  This value either
74  * comes from main program, or the handling routine will figure it
75  * out.  If given a quoted string, it ignores the first double quote
76  * and replaces the second with a null.
77  */
78
79 Replace(in, out)
80     char *in, *out;
81
82 { /*Replace*/
83
84     char *in_text, *in_var, *out_cp, VarNo;
85     int n;
86     int isQuotedString;
87     char *nullP;
88     
89     if(in[0] == '"') {
90         /*
91          * Strip the opening quote, remember we're handling a
92          * quoted string
93          */
94         in_text = in+1;
95         isQuotedString = 1;
96     }
97     else {
98         in_text = in;
99         isQuotedString = 0;
100     }
101     out_cp = out;
102     
103     while ((in_var = strchr(in_text, '$')) != NULL) {
104         while(in_text < in_var)
105             *out_cp++ = *in_text++;
106         VarNo = *(in_var+1);
107         if(VarNo >= '0' && VarNo <= '9') {
108             /*In the 0-9 range*/
109             n = VarNo - '0';
110             if (n == 0) {
111                 fprintf(stderr,
112                         "$0 is the program name.  Please start from $1.\n");
113                 exit(-1);
114             }
115             if (n > uss_VarMax){
116                 fprintf(stderr,
117                         "Illegal variable number ($%d is the largest acceptable)\n",
118                         uss_VarMax);
119                 exit(-1);
120             }
121             
122             strcpy(out_cp, uss_Var[n]);
123             out_cp += strlen(uss_Var[n]);
124             in_text += 2;
125         }
126         
127         else if (strncmp(in_var, "$USER", 5) == 0) {
128             strcpy(out_cp, uss_User);
129             out_cp += strlen(uss_User);
130             in_text += 5;
131         }
132         
133         else if (strncmp(in_var, "$UID", 4) == 0) {
134             strcpy(out_cp, uss_Uid);
135             out_cp += strlen(uss_Uid);
136             in_text += 4;
137         }
138         
139         else if (strncmp(in_var, "$SERVER", 7) == 0) {
140             strcpy(out_cp, uss_Server);
141             out_cp += strlen(uss_Server);
142             in_text += 7;
143         }
144         
145         else if (strncmp(in_var, "$PART", 5) == 0) {
146             strcpy(out_cp, uss_Partition);
147             out_cp += strlen(uss_Partition);
148             in_text += 5;
149         }
150         
151         else if (strncmp(in_var, "$MTPT", 5) == 0) {
152             strcpy(out_cp, uss_MountPoint);
153             out_cp += strlen(uss_MountPoint);
154             in_text += 5;
155         }
156         
157         else if (strncmp(in_var, "$NAME", 5) == 0) {
158             strcpy(out_cp, uss_RealName);
159             out_cp += strlen(uss_RealName);
160             in_text += 5;
161         }
162         
163         else if (strncmp(in_var, "$AUTO", 5) == 0) {
164             /*Picks a dir with minimum entries*/
165             uss_procs_PickADir(out, out_cp /*, uss_Auto*/);
166             printf("debug: $AUTO = %s\n", uss_Auto);
167             strcpy(out_cp, uss_Auto);
168             out_cp += strlen(uss_Auto);
169             in_text += 5;
170         }
171         else if (strncmp(in_var, "$PWEXPIRES", 10) == 0) {
172             sprintf(out_cp, " %d ", uss_Expires);
173             out_cp += strlen(out_cp);
174             in_text += 10;
175         }
176         
177         else{
178             /*Unknown variable*/
179             fprintf(stderr,
180                     "Warning: unknown variable in config file: '%s'\n",
181                     in_var);
182             *out_cp++ = *in_text++;
183         }
184     }
185     
186     /*
187      * At this point, we've copied over the in buffer up to the point
188      * of the last variable instance, so copy over the rest. If this
189      * is a quoted string, we place the terminating null where the
190      * ending double quote is.
191      */
192     while(*in_text != '\0')
193         *out_cp++ = *in_text++;
194     
195     if (isQuotedString) {
196         nullP = strchr(out, '"');
197         if (nullP == NULL)
198             nullP = out_cp;
199     }
200     else
201         nullP = out_cp;
202     *nullP = '\0';
203
204 } /*Replace*/
205
206 yywrap()
207 {
208 return(1);
209 }