Blame src/tokenparser.l

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
}