2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-09-05 08:45:26 +00:00
Files
lm-sensors/lib/conf-lex.l
Mark M. Hoffman 71a96916d5 Patch by Philipp Thomas <pth@suse.de>:
> Current gcc versions warn when type punning is used, as this breaks the
> strict aliasing analysis gcc 3.3 does by default. When checking the causes
> for these warnings I discovered that sensors_malloc_array,
> sensors_free_array, sensors_add_array_el and sensors_add_array_els in
> lib/general.c all take a 'void **' for the list. This is plain wrong as
> the C standard only allow 'char *' and 'void *' to alias any other type, so
> if these functions should take a generic pointer, it *must* be a 'void *'
> that's internally cast to a 'void **'.
>
> The attached patch does this and adapts all places where these functions are
> called. Note that when done correctly, no cast what-so-ever in the calling
> code is needed.
>
> The patch is against current lm_sensors2 cvs version.


git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@2345 7894878c-1315-0410-8ee3-d5d059ff63e0
2004-03-08 04:39:50 +00:00

272 lines
5.6 KiB
Plaintext

%{
/*
conf-lex.l - Part of libsensors, a Linux library for reading sensor data.
Copyright (c) 1998, 1999 Frodo Looijaard <frodol@dds.nl>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stdlib.h>
#include <string.h>
#include "general.h"
#include "data.h"
#include "conf-parse.h"
#include "error.h"
static int buffer_count;
static int buffer_max;
static char *buffer;
char sensors_lex_error[100];
#define buffer_malloc() sensors_malloc_array(&buffer,&buffer_count,\
&buffer_max,1)
#define buffer_free() sensors_free_array(&buffer,&buffer_count,\
&buffer_max)
#define buffer_add_char(c) sensors_add_array_el(c,&buffer,\
&buffer_count,\
&buffer_max,1)
#define buffer_add_string(s) sensors_add_array_els(s,strlen(s),\
&buffer, \
&buffer_count,&buffer_max,1)
%}
/* Scanner for configuration files */
%option noyywrap
%option nodefault
%option yylineno
%option nounput
/* States. 'Normal' states STRING and MIDDLE share some rules; other states
have only their own rules */
%s MIDDLE
%x STRING
%x ERR
/* Any whitespace-like character */
BLANK [[:space:]]
IDCHAR [[:alnum:]_]
/* Note: `10', `10.4' and `.4' are valid, `10.' is not */
FLOAT [[:digit:]]*\.?[[:digit:]]+
/* Only positive whole numbers are recognized here */
NUM 0|([1-9][[:digit:]]*)
/* Only number between 1 and 255, octally represented. */
OCTESC (1[0-7]{0,2})|([2-7][0-7]?)|(0[1-7][0-7]?)|(00[1-7])
%%
/* End of line: It may be the end of this line. Same for End of file. */
<MIDDLE>\n |
<MIDDLE><<EOF>> {
BEGIN(INITIAL);
return EOL;
}
/* We want to match any blank, except End of line; that is why we have to
match whitespace one by one! */
{BLANK} /* Eat up a blank */
/* Escaped End of line: eat and be happy */
<MIDDLE>\\\n /* Eat this! */
/* Remove a comment; we do not change the state, this is done when the \n is
eaten */
#[^\n]* /* Eat this! */
/* Some keywords at the beginning of lines */
<INITIAL>"label" {
sensors_yylval.line = sensors_yylineno;
BEGIN(MIDDLE);
return LABEL;
}
<INITIAL>"set" {
sensors_yylval.line = sensors_yylineno;
BEGIN(MIDDLE);
return SET;
}
<INITIAL>"compute" {
sensors_yylval.line = sensors_yylineno;
BEGIN(MIDDLE);
return COMPUTE;
}
<INITIAL>"bus" {
sensors_yylval.line = sensors_yylineno;
BEGIN(MIDDLE);
return BUS;
}
<INITIAL>"chip" {
sensors_yylval.line = sensors_yylineno;
BEGIN(MIDDLE);
return CHIP;
}
<INITIAL>"ignore" {
sensors_yylval.line = sensors_yylineno;
BEGIN(MIDDLE);
return IGNORE;
}
/* Anything else at the beginning of a line is an error */
<INITIAL>. {
yymore();
BEGIN(ERR);
}
<ERR>[^\n]*\n {
BEGIN(INITIAL);
strcpy(sensors_lex_error,"Invalid keyword");
return ERROR;
}
/* A number */
<MIDDLE>{FLOAT} {
sensors_yylval.value = atof(sensors_yytext);
return FLOAT;
}
/* Some operators */
<MIDDLE>"+" {
return '+';
}
<MIDDLE>"-" {
return '-';
}
<MIDDLE>"*" {
return '*';
}
<MIDDLE>"/" {
return '/';
}
<MIDDLE>"(" {
return '(';
}
<MIDDLE>")" {
return ')';
}
<MIDDLE>"," {
return ',';
}
<MIDDLE>"@" {
return '@';
}
<MIDDLE>"^" {
return '^';
}
<MIDDLE>"`" {
return '`';
}
/* Quoted string */
<MIDDLE>\" {
buffer_malloc();
BEGIN(STRING);
}
/* Oops, newline while in a string is not good */
<STRING>\n |
<STRING>\\\n {
buffer_add_char("\0");
strcpy(sensors_lex_error,"No matching double quote");
buffer_free();
BEGIN(INITIAL);
return ERROR;
}
/* At the end */
<STRING>\" {
buffer_add_char("\0");
sensors_yylval.name = strdup(buffer);
if (! sensors_yylval.name)
sensors_fatal_error("conf-lex.l",
"Allocating a new string");
buffer_free();
BEGIN(MIDDLE);
return NAME;
}
<STRING>\\a {
buffer_add_char("\a");
}
<STRING>\\b {
buffer_add_char("\b");
}
<STRING>\\f {
buffer_add_char("\f");
}
<STRING>\\n {
buffer_add_char("\n");
}
<STRING>\\r {
buffer_add_char("\r");
}
<STRING>\\t {
buffer_add_char("\t");
}
<STRING>\\v {
buffer_add_char("\v");
}
/* We can't support \0, this would cause havoc! */
<STRING>\\{OCTESC} {
int res;
sscanf(sensors_yytext+1,"%o",&res);
buffer_add_char(&res);
}
/* Other escapes: just copy the character behind the slash */
<STRING>\\. {
buffer_add_char(&sensors_yytext[1]);
}
/* Anything else */
<STRING>[^\\\n\"]+ {
buffer_add_string(sensors_yytext);
}
/* A normal, unquoted identifier */
<MIDDLE>{IDCHAR}+ {
sensors_yylval.name = strdup(sensors_yytext);
if (! sensors_yylval.name)
sensors_fatal_error("conf-lex.l",
"Allocating a new string");
return NAME;
}
%%