|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 |
|
6 /* lex file for analyzing PKCS #11 Module installation instructions */ |
|
7 |
|
8 /*----------------------------- Definitions ---------------------------*/ |
|
9 %{ |
|
10 #include <string.h> |
|
11 |
|
12 #include "install-ds.h" /* defines tokens and data structures */ |
|
13 #include "installparse.h" /* produced by yacc -d */ |
|
14 #include <prprf.h> |
|
15 static char *putSimpleString(char*); /* return copy of string */ |
|
16 static char *putComplexString(char*); /* strip out quotes, deal with */ |
|
17 /* escaped characters */ |
|
18 |
|
19 void Pk11Install_yyerror(char *); |
|
20 |
|
21 /* Overrides to use NSPR */ |
|
22 #define malloc PR_Malloc |
|
23 #define realloc PR_Realloc |
|
24 #define free PR_Free |
|
25 |
|
26 int Pk11Install_yylinenum=1; |
|
27 static char *err; |
|
28 |
|
29 #define YY_NEVER_INTERACTIVE 1 |
|
30 #define yyunput Pkcs11Install_yyunput |
|
31 |
|
32 /* This is the default YY_INPUT modified for NSPR */ |
|
33 #define YY_INPUT(buf,result,max_size) \ |
|
34 if ( yy_current_buffer->yy_is_interactive ) { \ |
|
35 char c; \ |
|
36 int n; \ |
|
37 for ( n = 0; n < max_size && \ |
|
38 PR_Read(Pk11Install_FD, &c, 1)==1 && c != '\n'; ++n ) { \ |
|
39 buf[n] = c; \ |
|
40 } \ |
|
41 if ( c == '\n' ) { \ |
|
42 buf[n++] = c; \ |
|
43 } \ |
|
44 result = n; \ |
|
45 } else { \ |
|
46 result = PR_Read(Pk11Install_FD, buf, max_size); \ |
|
47 } |
|
48 |
|
49 %} |
|
50 |
|
51 /*** Regular expression definitions ***/ |
|
52 /* simple_string has no whitespace, quotes, or braces */ |
|
53 simple_string [^ \t\r\n\""{""}"]+ |
|
54 |
|
55 /* complex_string is enclosed in quotes. Inside the quotes, quotes and |
|
56 backslashes must be backslash-escaped. No newlines or carriage returns |
|
57 are allowed inside the quotes. Otherwise, anything goes. */ |
|
58 complex_string \"([^\"\\\r\n]|(\\\")|(\\\\))+\" |
|
59 |
|
60 /* Standard whitespace */ |
|
61 whitespace [ \t\r]+ |
|
62 |
|
63 other . |
|
64 |
|
65 /*---------------------------- Actions --------------------------------*/ |
|
66 %% |
|
67 |
|
68 "{" return OPENBRACE; |
|
69 "}" return CLOSEBRACE; |
|
70 {simple_string} {Pk11Install_yylval.string = |
|
71 putSimpleString(Pk11Install_yytext); |
|
72 return STRING;} |
|
73 {complex_string} {Pk11Install_yylval.string = |
|
74 putComplexString(Pk11Install_yytext); |
|
75 return STRING;} |
|
76 |
|
77 "\n" Pk11Install_yylinenum++; |
|
78 |
|
79 {whitespace} ; |
|
80 |
|
81 {other} {err = PR_smprintf("Invalid lexeme: %s",Pk11Install_yytext); |
|
82 Pk11Install_yyerror(err); |
|
83 PR_smprintf_free(err); |
|
84 return 1; |
|
85 } |
|
86 |
|
87 %% |
|
88 /*------------------------ Program Section ----------------------------*/ |
|
89 |
|
90 PRFileDesc *Pk11Install_FD=NULL; |
|
91 |
|
92 /*************************************************************************/ |
|
93 /* dummy function required by lex */ |
|
94 int Pk11Install_yywrap(void) { return 1;} |
|
95 |
|
96 /*************************************************************************/ |
|
97 /* Return a copy of the given string */ |
|
98 static char* |
|
99 putSimpleString(char *str) |
|
100 { |
|
101 char *tmp = (char*) PR_Malloc(strlen(str)+1); |
|
102 strcpy(tmp, str); |
|
103 return tmp; |
|
104 } |
|
105 |
|
106 /*************************************************************************/ |
|
107 /* Strip out quotes, replace escaped characters with what they stand for. |
|
108 This function assumes that what is passed in is actually a complex |
|
109 string, so error checking is lax. */ |
|
110 static char* |
|
111 putComplexString(char *str) |
|
112 { |
|
113 int size, i,j; |
|
114 char *tmp; |
|
115 |
|
116 if(!str) { |
|
117 return NULL; |
|
118 } |
|
119 size = strlen(str); |
|
120 |
|
121 /* Allocate the new space. This string will actually be too big, |
|
122 since quotes and backslashes will be stripped out. But that's ok. */ |
|
123 tmp = (char*) PR_Malloc(size+1); |
|
124 |
|
125 /* Copy it over */ |
|
126 for(i=0, j=0; i < size; i++) { |
|
127 if(str[i]=='\"') { |
|
128 continue; /* skip un-escaped quotes */ |
|
129 } else if(str[i]=='\\') { |
|
130 ++i; /* escaped character. skip the backslash */ |
|
131 } |
|
132 tmp[j++] = str[i]; |
|
133 } |
|
134 tmp[j] = '\0'; |
|
135 |
|
136 return tmp; |
|
137 } |