| /* This Source Code Form is subject to the terms of the Mozilla Public |
| * License, v. 2.0. If a copy of the MPL was not distributed with this |
| * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| |
| %{ |
| |
| #include "crlgen.h" |
| |
| static SECStatus parserStatus = SECSuccess; |
| static CRLGENGeneratorData *parserData; |
| static PRFileDesc *src; |
| |
| #define YY_INPUT(buf,result,max_size) \ |
| if ( parserStatus != SECFailure) { \ |
| if (((result = PR_Read(src, buf, max_size)) == 0) && \ |
| ferror( yyin )) \ |
| return SECFailure; \ |
| } else { return SECFailure; } |
| |
| |
| %} |
| |
| %a 5000 |
| DIGIT [0-9]+ |
| DIGIT_RANGE [0-9]+-[0-9]+ |
| ID [a-zA-Z][a-zA-Z0-9]* |
| OID [0-9]+\.[\.0-9]+ |
| DATE [0-9]{4}[01][0-9][0-3][0-9][0-2][0-9][0-6][0-9][0-6][0-9] |
| ZDATE [0-9]{4}[01][0-9][0-3][0-9][0-2][0-9][0-6][0-9][0-6][0-9]Z |
| N_SP_STRING [a-zA-Z0-9\:\|\.]+ |
| |
| %% |
| |
| {ZDATE} { |
| parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_ZDATE); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| {DIGIT} { |
| parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_DIGIT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| {DIGIT_RANGE} { |
| parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_DIGIT_RANGE); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| {OID} { |
| parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_OID); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| issuer { |
| parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_ISSUER_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| update { |
| parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_UPDATE_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| nextupdate { |
| parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_NEXT_UPDATE_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| range { |
| parserStatus = crlgen_createNewLangStruct(parserData, CRLGEN_CHANGE_RANGE_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| {ID} { |
| if (strcmp(yytext, "addcert") == 0) { |
| parserStatus = crlgen_createNewLangStruct(parserData, |
| CRLGEN_ADD_CERT_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } else if (strcmp(yytext, "rmcert") == 0) { |
| parserStatus = crlgen_createNewLangStruct(parserData, |
| CRLGEN_RM_CERT_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } else if (strcmp(yytext, "addext") == 0) { |
| parserStatus = crlgen_createNewLangStruct(parserData, |
| CRLGEN_ADD_EXTENSION_CONTEXT); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } else { |
| parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_ID); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| } |
| |
| "=" |
| |
| \"[^\"]* { |
| if (yytext[yyleng-1] == '\\') { |
| yymore(); |
| } else { |
| register int c; |
| c = input(); |
| if (c != '\"') { |
| printf( "Error: Line ending \" is missing: %c\n", c); |
| unput(c); |
| } else { |
| parserStatus = crlgen_setNextData(parserData, yytext + 1, |
| CRLGEN_TYPE_STRING); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| } |
| } |
| |
| {N_SP_STRING} { |
| parserStatus = crlgen_setNextData(parserData, yytext, CRLGEN_TYPE_STRING); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| |
| |
| ^#[^\n]* /* eat up one-line comments */ {} |
| |
| [ \t]+ {} |
| |
| (\n|\r\n) { |
| parserStatus = crlgen_updateCrl(parserData); |
| if (parserStatus != SECSuccess) |
| return parserStatus; |
| } |
| |
| . { |
| fprintf(stderr, "Syntax error at line %d: unknown token %s\n", |
| parserData->parsedLineNum, yytext); |
| return SECFailure; |
| } |
| |
| %% |
| #include "prlock.h" |
| |
| static PRLock *parserInvocationLock; |
| |
| void CRLGEN_InitCrlGenParserLock() |
| { |
| parserInvocationLock = PR_NewLock(); |
| } |
| |
| void CRLGEN_DestroyCrlGenParserLock() |
| { |
| PR_DestroyLock(parserInvocationLock); |
| } |
| |
| |
| SECStatus CRLGEN_StartCrlGen(CRLGENGeneratorData *parserCtlData) |
| { |
| SECStatus rv; |
| |
| PR_Lock(parserInvocationLock); |
| |
| parserStatus = SECSuccess; |
| parserData = parserCtlData; |
| src = parserCtlData->src; |
| |
| rv = yylex(); |
| |
| PR_Unlock(parserInvocationLock); |
| |
| return rv; |
| } |
| |
| int yywrap() {return 1;} |