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 } 138