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 
7 #include "crlgen.h"
8 
9 static SECStatus parserStatus = SECSuccess;
10 static CRLGENGeneratorData *parserData;
11 static PRFileDesc *src;
12 
13 #define YY_INPUT(buf,result,max_size) \
14     if ( parserStatus != SECFailure) { \
15 	 if (((result = PR_Read(src, buf, max_size)) == 0) && \
16 	     ferror( yyin )) \
17 	   return SECFailure; \
18     } else  { return SECFailure; }
19 
20 
21 %}
22 
23 %a 5000
24 DIGIT          [0-9]+
25 DIGIT_RANGE    [0-9]+-[0-9]+
26 ID             [a-zA-Z][a-zA-Z0-9]*
27 OID            [0-9]+\.[\.0-9]+
28 DATE           [0-9]{4}[01][0-9][0-3][0-9][0-2][0-9][0-6][0-9][0-6][0-9]
29 ZDATE          [0-9]{4}[01][0-9][0-3][0-9][0-2][0-9][0-6][0-9][0-6][0-9]Z
30 N_SP_STRING    [a-zA-Z0-9\:\|\.]+
31 
32 %%
33 
34 {ZDATE}   {
35 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_ZDATE);
36 if (parserStatus != SECSuccess)
37     return parserStatus;
38 }
39 
40 {DIGIT}   {
41 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_DIGIT);
42 if (parserStatus != SECSuccess)
43     return parserStatus;
44 }
45 
46 {DIGIT_RANGE}  {
47 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_DIGIT_RANGE);
48 if (parserStatus != SECSuccess)
49     return parserStatus;
50 }
51 
52 {OID}     {
53 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_OID);
54 if (parserStatus != SECSuccess)
55     return parserStatus;
56 }
57 
58 issuer     {
59 parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_ISSUER_CONTEXT);
60 if (parserStatus != SECSuccess)
61     return parserStatus;
62 }
63 
64 update     {
65 parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_UPDATE_CONTEXT);
66 if (parserStatus != SECSuccess)
67     return parserStatus;
68 }
69 nextupdate {
70 parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_NEXT_UPDATE_CONTEXT);
71 if (parserStatus != SECSuccess)
72     return parserStatus;
73 }
74 
75 range      {
76 parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_CHANGE_RANGE_CONTEXT);
77 if (parserStatus != SECSuccess)
78     return parserStatus;
79 }
80 
81 {ID}      {
82 if (strcmp(yytext, "addcert") == 0) {
83     parserStatus = crlgen_createNewLangStruct(parserData,
84                                     CRLGEN_ADD_CERT_CONTEXT);
85     if (parserStatus != SECSuccess)
86         return parserStatus;
87 } else if (strcmp(yytext, "rmcert") == 0) {
88     parserStatus = crlgen_createNewLangStruct(parserData,
89                                     CRLGEN_RM_CERT_CONTEXT);
90     if (parserStatus != SECSuccess)
91         return parserStatus;
92 } else if (strcmp(yytext, "addext") == 0) {
93     parserStatus = crlgen_createNewLangStruct(parserData,
94                                     CRLGEN_ADD_EXTENSION_CONTEXT);
95     if (parserStatus != SECSuccess)
96         return parserStatus;
97 } else {
98     parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_ID);
99     if (parserStatus != SECSuccess)
100         return parserStatus;
101 }
102 }
103 
104 "="
105 
106 \"[^\"]* {
107 if (yytext[yyleng-1] == '\\') {
108     yymore();
109 } else {
110     register int c;
111     c = input();
112     if (c != '\"') {
113         printf( "Error: Line ending \" is missing:  %c\n", c);
114         unput(c);
115     } else {
116         parserStatus = crlgen_setNextData(parserData, yytext + 1,
117                                           CRLGEN_TYPE_STRING);
118         if (parserStatus != SECSuccess)
119             return parserStatus;
120     }
121 }
122 }
123 
124 {N_SP_STRING} {
125 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_STRING);
126 if (parserStatus != SECSuccess)
127     return parserStatus;
128 }
129 
130 
131 
132 ^#[^\n]*     /* eat up one-line comments */ {}
133 
134 [ \t]+      {}
135 
136 (\n|\r\n)  {
137 parserStatus = crlgen_updateCrl(parserData);
138 if (parserStatus != SECSuccess)
139     return parserStatus;
140 }
141 
142 .           {
143     fprintf(stderr, "Syntax error at line %d: unknown token %s\n",
144             parserData->parsedLineNum, yytext);
145     return SECFailure;
146 }
147 
148 %%
149 #include "prlock.h"
150 
151 static PRLock *parserInvocationLock;
152 
153 void CRLGEN_InitCrlGenParserLock()
154 {
155     parserInvocationLock = PR_NewLock();
156 }
157 
158 void CRLGEN_DestroyCrlGenParserLock()
159 {
160     PR_DestroyLock(parserInvocationLock);
161 }
162 
163 
164 SECStatus CRLGEN_StartCrlGen(CRLGENGeneratorData *parserCtlData)
165 {
166     SECStatus rv;
167 
168     PR_Lock(parserInvocationLock);
169 
170     parserStatus = SECSuccess;
171     parserData = parserCtlData;
172     src = parserCtlData->src;
173 
174     rv = yylex();
175 
176     PR_Unlock(parserInvocationLock);
177 
178     return rv;
179 }
180 
181 int yywrap() {return 1;}
182