Wed, 31 Dec 2014 07:16:47 +0100
Revert simplistic fix pending revisit of Mozilla integration attempt.
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/. */
5 %{
7 #include "crlgen.h"
9 static SECStatus parserStatus = SECSuccess;
10 static CRLGENGeneratorData *parserData;
11 static PRFileDesc *src;
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; }
21 %}
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\:\|\.]+
32 %%
34 {ZDATE} {
35 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_ZDATE);
36 if (parserStatus != SECSuccess)
37 return parserStatus;
38 }
40 {DIGIT} {
41 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_DIGIT);
42 if (parserStatus != SECSuccess)
43 return parserStatus;
44 }
46 {DIGIT_RANGE} {
47 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_DIGIT_RANGE);
48 if (parserStatus != SECSuccess)
49 return parserStatus;
50 }
52 {OID} {
53 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_OID);
54 if (parserStatus != SECSuccess)
55 return parserStatus;
56 }
58 issuer {
59 parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_ISSUER_CONTEXT);
60 if (parserStatus != SECSuccess)
61 return parserStatus;
62 }
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 }
75 range {
76 parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_CHANGE_RANGE_CONTEXT);
77 if (parserStatus != SECSuccess)
78 return parserStatus;
79 }
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 }
104 "="
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 }
124 {N_SP_STRING} {
125 parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_STRING);
126 if (parserStatus != SECSuccess)
127 return parserStatus;
128 }
132 ^#[^\n]* /* eat up one-line comments */ {}
134 [ \t]+ {}
136 (\n|\r\n) {
137 parserStatus = crlgen_updateCrl(parserData);
138 if (parserStatus != SECSuccess)
139 return parserStatus;
140 }
142 . {
143 fprintf(stderr, "Syntax error at line %d: unknown token %s\n",
144 parserData->parsedLineNum, yytext);
145 return SECFailure;
146 }
148 %%
149 #include "prlock.h"
151 static PRLock *parserInvocationLock;
153 void CRLGEN_InitCrlGenParserLock()
154 {
155 parserInvocationLock = PR_NewLock();
156 }
158 void CRLGEN_DestroyCrlGenParserLock()
159 {
160 PR_DestroyLock(parserInvocationLock);
161 }
164 SECStatus CRLGEN_StartCrlGen(CRLGENGeneratorData *parserCtlData)
165 {
166 SECStatus rv;
168 PR_Lock(parserInvocationLock);
170 parserStatus = SECSuccess;
171 parserData = parserCtlData;
172 src = parserCtlData->src;
174 rv = yylex();
176 PR_Unlock(parserInvocationLock);
178 return rv;
179 }
181 int yywrap() {return 1;}