|
Packit |
9f0df5 |
/*
|
|
Packit |
9f0df5 |
* Reads lexical config files and updates database.
|
|
Packit |
9f0df5 |
*
|
|
Packit |
9f0df5 |
* MUSCLE SmartCard Development ( http://pcsclite.alioth.debian.org/pcsclite.html )
|
|
Packit |
9f0df5 |
*
|
|
Packit |
9f0df5 |
* Copyright (C) 2001-2003
|
|
Packit |
9f0df5 |
* David Corcoran <corcoran@musclecard.com>
|
|
Packit |
9f0df5 |
* Copyright (C) 2003-2010
|
|
Packit |
9f0df5 |
* Ludovic Rousseau <ludovic.rousseau@free.fr>
|
|
Packit |
9f0df5 |
*
|
|
Packit |
9f0df5 |
Redistribution and use in source and binary forms, with or without
|
|
Packit |
9f0df5 |
modification, are permitted provided that the following conditions
|
|
Packit |
9f0df5 |
are met:
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
1. Redistributions of source code must retain the above copyright
|
|
Packit |
9f0df5 |
notice, this list of conditions and the following disclaimer.
|
|
Packit |
9f0df5 |
2. Redistributions in binary form must reproduce the above copyright
|
|
Packit |
9f0df5 |
notice, this list of conditions and the following disclaimer in the
|
|
Packit |
9f0df5 |
documentation and/or other materials provided with the distribution.
|
|
Packit |
9f0df5 |
3. The name of the author may not be used to endorse or promote products
|
|
Packit |
9f0df5 |
derived from this software without specific prior written permission.
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
Packit |
9f0df5 |
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
Packit |
9f0df5 |
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
Packit |
9f0df5 |
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
Packit |
9f0df5 |
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
Packit |
9f0df5 |
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
Packit |
9f0df5 |
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
Packit |
9f0df5 |
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
Packit |
9f0df5 |
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
Packit |
9f0df5 |
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
9f0df5 |
*/
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/**
|
|
Packit |
9f0df5 |
* @file
|
|
Packit |
9f0df5 |
* @brief provides parsing functions for Info.plist files
|
|
Packit |
9f0df5 |
* platforms
|
|
Packit |
9f0df5 |
*/
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
%{
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#include "config.h"
|
|
Packit |
9f0df5 |
#include <stdio.h>
|
|
Packit |
9f0df5 |
#include <string.h>
|
|
Packit |
9f0df5 |
#include <errno.h>
|
|
Packit |
9f0df5 |
#define NDEBUG
|
|
Packit |
9f0df5 |
#include <assert.h>
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#include "simclist.h"
|
|
Packit |
9f0df5 |
#include "debuglog.h"
|
|
Packit |
9f0df5 |
#include "parser.h"
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
static void eval_key(char *pcToken, list_t *list_key);
|
|
Packit |
9f0df5 |
static void eval_value(char *pcToken, list_t *list_values);
|
|
Packit |
9f0df5 |
void tperrorCheck (char *pcToken_error);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
static list_t *ListKeys;
|
|
Packit |
9f0df5 |
static list_t *ListValues;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
%}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
%option nounput
|
|
Packit |
9f0df5 |
%option noinput
|
|
Packit |
9f0df5 |
%option noyywrap
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
%%
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#.* {}
|
|
Packit |
9f0df5 |
"\n" {}
|
|
Packit |
9f0df5 |
\<key\>([A-Z]|[a-z]|[0-9]|[ \t])+\<\/key\> { eval_key(yytext, ListKeys); }
|
|
Packit |
9f0df5 |
[ \t] {}
|
|
Packit |
9f0df5 |
\<string\>([A-Z]|[a-z]|[0-9]|[ \t]|[!@#$%^&*()\-+/_\:?.,=~'";\[\]])+\<\/string\> { eval_value(yytext, ListValues); }
|
|
Packit |
9f0df5 |
. { tperrorCheck(yytext); }
|
|
Packit |
9f0df5 |
%%
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
static void eval_key(char *pcToken, list_t *list_key)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
struct bundleElt *elt;
|
|
Packit |
9f0df5 |
int r;
|
|
Packit |
9f0df5 |
size_t len;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* create a new list element */
|
|
Packit |
9f0df5 |
elt = malloc(sizeof(*elt));
|
|
Packit |
9f0df5 |
assert(elt);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* <key>foobar</key>
|
|
Packit |
9f0df5 |
* 012345 : 5 is the first key character index */
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* calculate the argument length */
|
|
Packit |
9f0df5 |
for (len=0; pcToken[len+5] != '<'; len++)
|
|
Packit |
9f0df5 |
;
|
|
Packit |
9f0df5 |
len++; /* final NULL byte */
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
elt->key = malloc(len);
|
|
Packit |
9f0df5 |
memcpy(elt->key, &pcToken[5], len-1);
|
|
Packit |
9f0df5 |
elt->key[len-1] = '\0';
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
r = list_init(&elt->values);
|
|
Packit |
9f0df5 |
assert(r >= 0);
|
|
Packit |
9f0df5 |
(void)r;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* add the key/values */
|
|
Packit |
9f0df5 |
list_append(list_key, elt);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* set the list to store the values */
|
|
Packit |
9f0df5 |
ListValues = &elt->values;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
static void eval_value(char *pcToken, list_t *list_values)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
int r;
|
|
Packit |
9f0df5 |
size_t len;
|
|
Packit |
9f0df5 |
char *value;
|
|
Packit |
9f0df5 |
char *amp;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* <string>foobar</string>
|
|
Packit |
9f0df5 |
* 012345678 : 8 is the first string character index */
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* calculate the argument length */
|
|
Packit |
9f0df5 |
for (len=0; pcToken[len+8] != '<'; len++)
|
|
Packit |
9f0df5 |
;
|
|
Packit |
9f0df5 |
len++; /* final NULL byte */
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
value = malloc(len);
|
|
Packit |
9f0df5 |
assert(value);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
memcpy(value, &pcToken[8], len-1);
|
|
Packit |
9f0df5 |
value[len-1] = '\0';
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* for all & in the string */
|
|
Packit |
9f0df5 |
amp = value;
|
|
Packit |
9f0df5 |
while ((amp = strstr(amp, "&")) != NULL)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
char *p;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* just skip "amp;" substring (4 letters) */
|
|
Packit |
9f0df5 |
for (p = amp+1; *(p+4); p++)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
*p = *(p+4);
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
/* terminate the now shorter string */
|
|
Packit |
9f0df5 |
*p = '\0';
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* skip the & and continue */
|
|
Packit |
9f0df5 |
amp++;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
r = list_append(list_values, value);
|
|
Packit |
9f0df5 |
assert(r >= 0);
|
|
Packit |
9f0df5 |
(void)r;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
void tperrorCheck (char *token_error)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
(void)token_error;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/**
|
|
Packit |
9f0df5 |
* Find an optional key in a configuration file
|
|
Packit |
9f0df5 |
* No error is logged if the key is not found
|
|
Packit |
9f0df5 |
*
|
|
Packit |
9f0df5 |
* @param l list generated by bundleParse()
|
|
Packit |
9f0df5 |
* @param key searched key
|
|
Packit |
9f0df5 |
* @param[out] values list of token value (if key found)
|
|
Packit |
9f0df5 |
* @retval 0 OK
|
|
Packit |
9f0df5 |
* @retval 1 key not found
|
|
Packit |
9f0df5 |
*/
|
|
Packit |
9f0df5 |
int LTPBundleFindValueWithKey(list_t *l, const char *key, list_t **values)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
unsigned int i;
|
|
Packit |
9f0df5 |
int ret = 1;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
for (i=0; i < list_size(l); i++)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
struct bundleElt *elt;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
elt = list_get_at(l, i);
|
|
Packit |
9f0df5 |
assert(elt);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
if (0 == strcmp(elt->key, key))
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
*values = &elt->values;
|
|
Packit |
9f0df5 |
ret = 0;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
return ret;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/**
|
|
Packit |
9f0df5 |
* Parse a Info.plist file and file a list
|
|
Packit |
9f0df5 |
*
|
|
Packit |
9f0df5 |
* @param fileName file name
|
|
Packit |
9f0df5 |
* @param l list containing the results
|
|
Packit |
9f0df5 |
* @retval -1 configuration file not found
|
|
Packit |
9f0df5 |
* @retval 0 OK
|
|
Packit |
9f0df5 |
*/
|
|
Packit |
9f0df5 |
int bundleParse(const char *fileName, list_t *l)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
FILE *file = NULL;
|
|
Packit |
9f0df5 |
int r;
|
|
Packit |
9f0df5 |
#ifndef NDEBUG
|
|
Packit |
9f0df5 |
int i;
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
file = fopen(fileName, "r");
|
|
Packit |
9f0df5 |
if (!file)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
Log3(PCSC_LOG_CRITICAL, "Could not open bundle file %s: %s",
|
|
Packit |
9f0df5 |
fileName, strerror(errno));
|
|
Packit |
9f0df5 |
return 1;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
r = list_init(l);
|
|
Packit |
9f0df5 |
assert(r >= 0);
|
|
Packit |
9f0df5 |
(void)r;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
ListKeys = l;
|
|
Packit |
9f0df5 |
yyin = file;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
do
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
(void)yylex();
|
|
Packit |
9f0df5 |
} while (!feof(file));
|
|
Packit |
9f0df5 |
yylex_destroy();
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
(void)fclose(file);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
#ifndef NDEBUG
|
|
Packit |
9f0df5 |
printf("size: %d\n", list_size(l));
|
|
Packit |
9f0df5 |
for (i=0; i < list_size(l); i++)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
struct bundleElt *elt;
|
|
Packit |
9f0df5 |
unsigned int j;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
elt = list_get_at(l, i);
|
|
Packit |
9f0df5 |
assert(elt);
|
|
Packit |
9f0df5 |
printf("Key: %s\n", elt->key);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
for (j=0; j<list_size(&elt->values); j++)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
char *v = list_get_at(&elt->values, j);
|
|
Packit |
9f0df5 |
printf(" value: %s\n", v);
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
#endif
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
return 0;
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/**
|
|
Packit |
9f0df5 |
* Free the list created by bundleParse()
|
|
Packit |
9f0df5 |
*
|
|
Packit |
9f0df5 |
* @param l list containing the results
|
|
Packit |
9f0df5 |
*/
|
|
Packit |
9f0df5 |
void bundleRelease(list_t *l)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
unsigned int i;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
for (i=0; i < list_size(l); i++)
|
|
Packit |
9f0df5 |
{
|
|
Packit |
9f0df5 |
struct bundleElt *elt;
|
|
Packit |
9f0df5 |
unsigned int j;
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
elt = list_get_at(l, i);
|
|
Packit |
9f0df5 |
assert(elt);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* free all the values */
|
|
Packit |
9f0df5 |
for (j=0; j<list_size(&elt->values); j++)
|
|
Packit |
9f0df5 |
free(list_get_at(&elt->values, j));
|
|
Packit |
9f0df5 |
list_destroy(&elt->values);
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
/* free the key */
|
|
Packit |
9f0df5 |
free(elt->key);
|
|
Packit |
9f0df5 |
free(elt);
|
|
Packit |
9f0df5 |
}
|
|
Packit |
9f0df5 |
|
|
Packit |
9f0df5 |
list_destroy(l);
|
|
Packit |
9f0df5 |
}
|