1/***************************************************************** 2 3 File : configfile.ll 4 Author : David Corcoran 5 Date : February 12, 1999 modified 7/28/99 6 Purpose: Reads lexical config files and updates database. 7 See http://www.linuxnet.com for more information. 8 License: Copyright (C) 1999 David Corcoran 9 <corcoran@linuxnet.com> 10 11******************************************************************/ 12 13%{ 14int evaluatetoken(char *pcToken); 15 16static int iLinenumber = 1; 17static char *pcPrevious = 0; 18static char *pcCurrent = 0; 19static char *pcFriendlyname = 0; 20static char *pcDevicename = 0; 21static char *pcLibpath = 0; 22static char *pcChannelid = 0; 23static int badError = 0; 24 25void tok_error(char *pcToken_error); 26 27%} 28 29%option nounput 30%option noyywrap 31 32%% 33 34#.* {} 35"\n" { iLinenumber++; } 36(\"[^"\n]*["\n])|(\'[^'\n]*['\n]) { (void)evaluatetoken(yytext); } 37[ \t] {} 38([A-Z]|[a-z]|[0-9]|[\\\/\-\.\_\@])+ { (void)evaluatetoken(yytext); } 39. { tok_error(yytext); } 40%% 41 42#include <stdio.h> 43#include <string.h> 44#include <wintypes.h> 45 46#include "pcsclite.h" 47#include "sys_generic.h" 48#include "readerfactory.h" 49#include "debuglog.h" 50 51int evaluatetoken(char *pcToken) 52{ 53 54 DWORD dwChannelId = 0; 55 int p = 0; 56 int n = 0; 57 58 if (pcPrevious == NULL) 59 { /* This is the key */ 60 pcPrevious = strdup(pcToken); 61 } 62 else 63 { 64 pcCurrent = pcToken; 65 if (strcmp(pcPrevious, "FRIENDLYNAME") == 0) 66 { 67 if (pcFriendlyname == NULL) 68 { 69 pcFriendlyname = malloc(strlen(pcCurrent) - 1); 70 for (n = 0; n < strlen(pcCurrent); n++) 71 { 72 if (pcCurrent[n] != '"') 73 { /* Strip off the quotes */ 74 pcFriendlyname[p++] = pcCurrent[n]; 75 } 76 } 77 pcFriendlyname[p++] = '\0'; 78 } 79 else 80 { 81 tok_error(pcPrevious); 82 return 1; 83 } 84 } 85 else if (strcmp(pcPrevious, "DEVICENAME") == 0) 86 { 87 if (pcDevicename == NULL) 88 { 89 pcDevicename = strdup(pcCurrent); 90 } 91 else 92 { 93 tok_error(pcPrevious); 94 return 1; 95 } 96 } 97 else if (strcmp(pcPrevious, "LIBPATH") == 0) 98 { 99 if (pcLibpath == NULL) 100 { 101 pcLibpath = strdup(pcCurrent); 102 } 103 else 104 { 105 tok_error(pcPrevious); 106 return 1; 107 } 108 } 109 else if (strcmp(pcPrevious, "CHANNELID") == 0) 110 { 111 if (pcChannelid == NULL) 112 pcChannelid = strdup(pcCurrent); 113 else 114 { 115 tok_error(pcPrevious); 116 return 1; 117 } 118 } 119 else 120 { 121 tok_error(pcPrevious); 122 return 1; 123 } 124 125 free(pcPrevious); 126 pcPrevious = NULL; 127 } 128 129 if (pcFriendlyname != NULL && pcDevicename != NULL && 130 pcLibpath != NULL && pcChannelid != NULL) 131 { 132 133 dwChannelId = strtoul(pcChannelid, 0, 16); 134 RFAddReader(pcFriendlyname, dwChannelId, pcLibpath, pcDevicename); 135 136 free(pcFriendlyname); 137 free(pcDevicename); 138 free(pcLibpath); 139 free(pcChannelid); 140 pcFriendlyname = NULL; 141 pcDevicename = NULL; 142 pcLibpath = NULL; 143 pcChannelid = NULL; 144 } 145 146 return 0; 147} 148 149void tok_error (char *token_error) 150{ 151 Log2(PCSC_LOG_ERROR, "tok_error: invalid value in " PCSCLITE_READER_CONFIG ": %s", token_error); 152 badError = 1; 153} 154 155int DBUpdateReaders (const char *readerconf) 156{ 157 FILE *configFile = NULL; 158 159 configFile = fopen(readerconf, "r"); 160 161 if (configFile == NULL) 162 return 1; 163 164 yyin = configFile; 165 166 do 167 { 168 (void)yylex(); 169 } 170 while (!feof(configFile)); 171 172 (void)fclose(configFile); 173 174 if (badError == 1) 175 return -1; 176 else 177 return 0; 178} /* End of configfile.c */ 179 180