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