Blame src/tokenparser.l

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