mirror of
https://github.com/lm-sensors/lm-sensors.git
synced 2026-11-13 17:00:15 +00:00
The first bunch of library files
These are the relatively well-tested files. They allow you to parse a configuration file, and to build an internal abstract syntax tree. git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@91 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
1 parent
52696a8d2d
commit
c4cb096dd9
8 files changed
+798
-11
No files matched your search
@@ -198,7 +198,7 @@ version:
|
||||
|
||||
%.d: %.c
|
||||
$(CC) -M -MG $(MODCFLAGS) $< | \
|
||||
sed -e 's@^\(.*\)\.o:@$*.d $*.o Makefile '`dirname $*.d`/Module.mk':@' > $@
|
||||
sed -e 's@^\(.*\)\.o:@$*.d $*.o: Makefile '`dirname $*.d`/Module.mk' @' > $@
|
||||
|
||||
|
||||
|
||||
@@ -208,7 +208,7 @@ version:
|
||||
|
||||
%.rd: %.c
|
||||
$(CC) -M -MG $(PROGCFLAGS) $< | \
|
||||
sed -e 's@^\(.*\)\.o:@$*.rd $*.ro Makefile '`dirname $*.rd`/Module.mk':@' > $@
|
||||
sed -e 's@^\(.*\)\.o:@$*.rd $*.ro: Makefile '`dirname $*.rd`/Module.mk' @' > $@
|
||||
|
||||
|
||||
%: %.ro
|
||||
@@ -221,7 +221,7 @@ version:
|
||||
|
||||
%.ad: %.c
|
||||
$(CC) -M -MG $(ARCFLAGS) $< | \
|
||||
sed -e 's@^\(.*\)\.o:@$*.ad $*.ao Makefile '`dirname $*.ad`/Module.mk':@' > $@
|
||||
sed -e 's@^\(.*\)\.o:@$*.ad $*.ao: Makefile '`dirname $*.ad`/Module.mk' @' > $@
|
||||
|
||||
|
||||
# .lo files are used for shared libraries
|
||||
@@ -230,12 +230,12 @@ version:
|
||||
|
||||
%.ld: %.c
|
||||
$(CC) -M -MG $(LIBCFLAGS) $< | \
|
||||
sed -e 's@^\(.*\)\.o:@$*.ld $*.lo Makefile '`dirname $*.ld`/Module.mk':@' > $@
|
||||
sed -e 's@^\(.*\)\.o:@$*.ld $*.lo: Makefile '`dirname $*.ld`/Module.mk' @' > $@
|
||||
|
||||
|
||||
# Flex and Bison
|
||||
%c: %y
|
||||
$(BISON) -d $< -o $@
|
||||
$(BISON) -p sensors_yy -d $< -o $@
|
||||
|
||||
%.c: %.l
|
||||
$(FLEX) -t $< > $@
|
||||
$(FLEX) -Psensors_yy -t $< > $@
|
||||
+18
-5
@@ -27,27 +27,37 @@ LIBVER := $(LIBMAINVER).$(LIBMINORVER)
|
||||
|
||||
# The static lib name, the shared lib name, and the internal ('so') name of
|
||||
# the shared lib.
|
||||
LIBSHBASENAME := libsensors.so
|
||||
LIBSHLIBNAME := libsensors.so.$(LIBVER)
|
||||
LIBSTLIBNAME := libsensors.a
|
||||
LIBSHSONAME := libsensors.so.$(LIBMAINVER)
|
||||
|
||||
LIBTARGETS := $(MODULE_DIR)/$(LIBSTLIBNAME) $(MODULE_DIR)/$(LIBSHLIBNAME)
|
||||
|
||||
LIBCSOURCES :=
|
||||
LIBSHOBJECTS := $(LIBCSOURCES:.c=.lo)
|
||||
LIBSTOBJECTS := $(LIBCSOURCES:.c=.ao)
|
||||
LIBCSOURCES := $(MODULE_DIR)/data.c $(MODULE_DIR)/general.c \
|
||||
$(MODULE_DIR)/error.c
|
||||
LIBOTHEROBJECTS := $(MODULE_DIR)/conf-parse.o $(MODULE_DIR)/conf-lex.o
|
||||
LIBSHOBJECTS := $(LIBCSOURCES:.c=.lo) $(LIBOTHEROBJECTS:.o=.lo)
|
||||
LIBSTOBJECTS := $(LIBCSOURCES:.c=.ao) $(LIBOTHEROBJECTS:.o=.ao)
|
||||
|
||||
LIBHEADERFILES :=
|
||||
LIBHEADERFILES := $(MODULE_DIR)/error.h
|
||||
|
||||
# How to create the shared library
|
||||
$(MODULE_DIR)/$(LIBSHLIBNAME): $(LIBSHOBJECTS)
|
||||
$(CC) -shared -Wl,-soname,$(LIBSONAME) -o $@ $< -lc
|
||||
$(CC) -shared -Wl,-soname,$(LIBSONAME) -o $@ $^ -lc
|
||||
|
||||
# And the static library
|
||||
$(MODULE_DIR)/$(LIBSTLIBNAME): $(LIBSTOBJECTS)
|
||||
$(RM) $@
|
||||
$(AR) rcvs $@ $^
|
||||
|
||||
# Depencies for non-C sources
|
||||
$(MODULE_DIR)/conf-lex.c: $(MODULE_DIR)/conf-lex.l $(MODULE_DIR)/general.h \
|
||||
$(MODULE_DIR)/data.h $(MODULE_DIR)/conf-parse.h
|
||||
$(MODULE_DIR)/conf-parse.c: $(MODULE_DIR)/conf-parse.y $(MODULE_DIR)/general.h \
|
||||
$(MODULE_DIR)/data.h
|
||||
$(MODULE_DIR)/conf-parse.h: $(MODULE_DIR)/conf-parse.c
|
||||
|
||||
# Include all dependency files
|
||||
INCLUDEFILES += $(LIBCSOURCES:.c=.ld) $(LIBCSOURCES:.c=.ad)
|
||||
|
||||
@@ -57,10 +67,13 @@ all :: all-lib
|
||||
install-lib:
|
||||
$(MKDIR) $(LIBDIR) $(LIBINCLUDEDIR)
|
||||
install -o root -g root -m 644 $(LIBTARGETS) $(LIBDIR)
|
||||
$(LN) $(LIBSHLIBNAME) $(LIBDIR)/$(LIBSHSONAME)
|
||||
$(LN) $(LIBSHSONAME) $(LIBDIR)/$(LIBSHBASENAME)
|
||||
install -o root -g root -m 644 $(LIBHEADERFILES) $(LIBINCLUDEDIR)
|
||||
install :: install-lib
|
||||
|
||||
clean-lib:
|
||||
$(RM) $(LIBTARGETS) $(LIBSHOBJECTS) $(LIBSTOBJECTS)
|
||||
$(RM) $(LIBSHOBJECTS:.lo=.ld) $(LIBSTOBJECTS:.ao=.ad)
|
||||
$(RM) $(LIBOTHEROBJECTS:.o=.c) $(MODULE_DIR)/conf-parse.h
|
||||
clean :: clean-lib
|
||||
+252
@@ -0,0 +1,252 @@
|
||||
%{
|
||||
/*
|
||||
conf-lex.l - Part of libsensors, a Linux library for reading sensor data.
|
||||
Copyright (c) 1998 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((void **) &buffer,&buffer_count,\
|
||||
&buffer_max,1)
|
||||
#define buffer_free() sensors_free_array((void **) &buffer,&buffer_count,\
|
||||
&buffer_max)
|
||||
#define buffer_add_char(c) sensors_add_array_el(c,(void **) &buffer,\
|
||||
&buffer_count,\
|
||||
&buffer_max,1)
|
||||
#define buffer_add_string(s) sensors_add_array_els(s,strlen(s),\
|
||||
(void **) &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" {
|
||||
BEGIN(MIDDLE);
|
||||
return LABEL;
|
||||
}
|
||||
|
||||
<INITIAL>"set" {
|
||||
BEGIN(MIDDLE);
|
||||
return SET;
|
||||
}
|
||||
|
||||
<INITIAL>"compute" {
|
||||
BEGIN(MIDDLE);
|
||||
return COMPUTE;
|
||||
}
|
||||
|
||||
<INITIAL>"bus" {
|
||||
BEGIN(MIDDLE);
|
||||
return BUS;
|
||||
}
|
||||
|
||||
<INITIAL>"chip" {
|
||||
BEGIN(MIDDLE);
|
||||
return CHIP;
|
||||
}
|
||||
|
||||
/* 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 ',';
|
||||
}
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
%%
|
||||
@@ -0,0 +1,301 @@
|
||||
%{
|
||||
/*
|
||||
conf-parse.y - Part of libsensors, a Linux library for reading sensor data.
|
||||
Copyright (c) 1998 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.
|
||||
*/
|
||||
|
||||
#define YYERROR_VERBOSE
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "data.h"
|
||||
#include "general.h"
|
||||
#include "error.h"
|
||||
|
||||
/* These two functions are defined in conf-lex.l */
|
||||
extern int sensors_yylex(void);
|
||||
extern char sensors_lex_error[];
|
||||
extern int sensors_yylineno;
|
||||
|
||||
static void sensors_yyerror(const char *err);
|
||||
static sensors_expr *malloc_expr(void);
|
||||
|
||||
static sensors_chip *current_chip = NULL;
|
||||
|
||||
#define bus_add_el(el) sensors_add_array_el(el,\
|
||||
(void **) &sensors_config_busses,\
|
||||
&sensors_config_busses_count,\
|
||||
&sensors_config_busses_max,\
|
||||
sizeof(sensors_bus))
|
||||
#define label_add_el(el) sensors_add_array_el(el,\
|
||||
(void **) ¤t_chip->labels,\
|
||||
¤t_chip->labels_count,\
|
||||
¤t_chip->labels_max,\
|
||||
sizeof(sensors_label));
|
||||
#define set_add_el(el) sensors_add_array_el(el,\
|
||||
(void **) ¤t_chip->sets,\
|
||||
¤t_chip->sets_count,\
|
||||
¤t_chip->sets_max,\
|
||||
sizeof(sensors_set));
|
||||
#define compute_add_el(el) sensors_add_array_el(el,\
|
||||
(void **) ¤t_chip->computes,\
|
||||
¤t_chip->computes_count,\
|
||||
¤t_chip->computes_max,\
|
||||
sizeof(sensors_compute));
|
||||
#define chip_add_el(el) sensors_add_array_el(el,\
|
||||
(void **) &sensors_config_chips,\
|
||||
&sensors_config_chips_count,\
|
||||
&sensors_config_chips_max,\
|
||||
sizeof(sensors_chip));
|
||||
|
||||
#define fits_add_el(el,list) sensors_add_array_el(el,\
|
||||
(void **) &(list).fits,\
|
||||
&(list).fits_count,\
|
||||
&(list).fits_max, \
|
||||
sizeof(sensors_chip_name));
|
||||
|
||||
/* YYERROR can only be called in rules, not in other functions, so this must
|
||||
be a macro */
|
||||
#define check_current_chip()\
|
||||
do { if (! current_chip) {\
|
||||
sensors_yyerror("Label, Set or Compute statement before first chip statement");\
|
||||
YYERROR;\
|
||||
}\
|
||||
} while (0)
|
||||
|
||||
%}
|
||||
|
||||
%union {
|
||||
double value;
|
||||
char *name;
|
||||
void *nothing;
|
||||
sensors_chip_name_list chips;
|
||||
sensors_expr *expr;
|
||||
int bus;
|
||||
sensors_chip_name chip;
|
||||
}
|
||||
|
||||
%left <nothing> '-' '+'
|
||||
%left <nothing> '*' '/'
|
||||
%left <nothing> NEG
|
||||
|
||||
%token <nothing> ','
|
||||
%token <nothing> EOL
|
||||
%token <nothing> BUS
|
||||
%token <nothing> LABEL
|
||||
%token <nothing> SET
|
||||
%token <nothing> CHIP
|
||||
%token <nothing> COMPUTE
|
||||
%token <value> FLOAT
|
||||
%token <name> NAME
|
||||
%token <nothing> ERROR
|
||||
|
||||
%type <chips> chip_name_list
|
||||
%type <expr> expression
|
||||
%type <bus> i2cbus_name
|
||||
%type <name> adapter_name
|
||||
%type <name> algorithm_name
|
||||
%type <name> function_name
|
||||
%type <name> string
|
||||
%type <chip> chip_name
|
||||
|
||||
%start input
|
||||
|
||||
%%
|
||||
|
||||
input: /* empty */
|
||||
| input line
|
||||
;
|
||||
|
||||
line: bus_statement EOL
|
||||
| label_statement EOL
|
||||
| set_statement EOL
|
||||
| chip_statement EOL
|
||||
| compute_statement EOL
|
||||
| error EOL
|
||||
;
|
||||
|
||||
bus_statement: BUS i2cbus_name adapter_name algorithm_name
|
||||
{ sensors_bus new_el;
|
||||
new_el.number = $2;
|
||||
new_el.adapter = $3;
|
||||
new_el.algorithm = $4;
|
||||
bus_add_el(&new_el);
|
||||
}
|
||||
;
|
||||
|
||||
label_statement: LABEL function_name string
|
||||
{ sensors_label new_el;
|
||||
check_current_chip();
|
||||
new_el.name = $2;
|
||||
new_el.value = $3;
|
||||
label_add_el(&new_el);
|
||||
}
|
||||
;
|
||||
|
||||
set_statement: SET function_name expression
|
||||
{ sensors_set new_el;
|
||||
check_current_chip();
|
||||
new_el.name = $2;
|
||||
new_el.value = $3;
|
||||
set_add_el(&new_el);
|
||||
}
|
||||
;
|
||||
|
||||
compute_statement: COMPUTE function_name expression ',' expression
|
||||
{ sensors_compute new_el;
|
||||
check_current_chip();
|
||||
new_el.name = $2;
|
||||
new_el.from_proc = $3;
|
||||
new_el.to_proc = $5;
|
||||
compute_add_el(&new_el);
|
||||
}
|
||||
;
|
||||
|
||||
chip_statement: CHIP chip_name_list
|
||||
{ sensors_chip new_el;
|
||||
new_el.labels = NULL;
|
||||
new_el.sets = NULL;
|
||||
new_el.computes = NULL;
|
||||
new_el.labels_count = new_el.labels_max = 0;
|
||||
new_el.sets_count = new_el.sets_max = 0;
|
||||
new_el.computes_count = new_el.computes_max = 0;
|
||||
new_el.chips = $2;
|
||||
chip_add_el(&new_el);
|
||||
current_chip = sensors_config_chips +
|
||||
sensors_config_chips_count - 1;
|
||||
}
|
||||
;
|
||||
|
||||
chip_name_list: chip_name
|
||||
{
|
||||
$$.fits = NULL;
|
||||
$$.fits_count = $$.fits_max = 0;
|
||||
fits_add_el(&$1,$$);
|
||||
}
|
||||
| chip_name_list chip_name
|
||||
{ $$ = $1;
|
||||
fits_add_el(&$2,$$);
|
||||
}
|
||||
;
|
||||
|
||||
expression: FLOAT
|
||||
{ $$ = malloc_expr();
|
||||
$$->data.val = $1;
|
||||
$$->kind = sensors_kind_val;
|
||||
}
|
||||
| NAME
|
||||
{ $$ = malloc_expr();
|
||||
$$->data.var = $1;
|
||||
$$->kind = sensors_kind_var;
|
||||
}
|
||||
| expression '+' expression
|
||||
{ $$ = malloc_expr();
|
||||
$$->kind = sensors_kind_sub;
|
||||
$$->data.subexpr.op = sensors_add;
|
||||
$$->data.subexpr.sub1 = $1;
|
||||
$$->data.subexpr.sub2 = $3;
|
||||
}
|
||||
| expression '-' expression
|
||||
{ $$ = malloc_expr();
|
||||
$$->kind = sensors_kind_sub;
|
||||
$$->data.subexpr.op = sensors_sub;
|
||||
$$->data.subexpr.sub1 = $1;
|
||||
$$->data.subexpr.sub2 = $3;
|
||||
}
|
||||
| expression '*' expression
|
||||
{ $$ = malloc_expr();
|
||||
$$->kind = sensors_kind_sub;
|
||||
$$->data.subexpr.op = sensors_multiply;
|
||||
$$->data.subexpr.sub1 = $1;
|
||||
$$->data.subexpr.sub2 = $3;
|
||||
}
|
||||
| expression '/' expression
|
||||
{ $$ = malloc_expr();
|
||||
$$->kind = sensors_kind_sub;
|
||||
$$->data.subexpr.op = sensors_divide;
|
||||
$$->data.subexpr.sub1 = $1;
|
||||
$$->data.subexpr.sub2 = $3;
|
||||
}
|
||||
| '-' expression %prec NEG
|
||||
{ $$ = malloc_expr();
|
||||
$$->kind = sensors_kind_sub;
|
||||
$$->data.subexpr.op = sensors_negate;
|
||||
$$->data.subexpr.sub1 = $2;
|
||||
$$->data.subexpr.sub2 = NULL;
|
||||
}
|
||||
| '(' expression ')'
|
||||
{ $$ = $2; }
|
||||
;
|
||||
|
||||
i2cbus_name: NAME
|
||||
{ int res = sensors_parse_i2cbus_name($1,&$$);
|
||||
free($1);
|
||||
if (res) {
|
||||
sensors_yyerror("Parse error in i2c bus name");
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
adapter_name: NAME
|
||||
{ $$ = $1; }
|
||||
;
|
||||
|
||||
algorithm_name: NAME
|
||||
{ $$ = $1; }
|
||||
;
|
||||
|
||||
function_name: NAME
|
||||
{ $$ = $1; }
|
||||
;
|
||||
|
||||
string: NAME
|
||||
{ $$ = $1; }
|
||||
;
|
||||
|
||||
chip_name: NAME
|
||||
{ int res = sensors_parse_chip_name($1,&$$);
|
||||
free($1);
|
||||
if (res) {
|
||||
sensors_yyerror("Parse error in chip name");
|
||||
YYERROR;
|
||||
}
|
||||
}
|
||||
;
|
||||
|
||||
%%
|
||||
|
||||
void sensors_yyerror(const char *err)
|
||||
{
|
||||
if (sensors_lex_error[0]) {
|
||||
sensors_parse_error(sensors_lex_error,sensors_yylineno);
|
||||
sensors_lex_error[0] = '\0';
|
||||
} else
|
||||
sensors_parse_error(err,sensors_yylineno);
|
||||
}
|
||||
|
||||
sensors_expr *malloc_expr(void)
|
||||
{
|
||||
sensors_expr *res = malloc(sizeof(sensors_expr));
|
||||
if (! res)
|
||||
sensors_fatal_error("malloc_expr","Allocating a new expression");
|
||||
return res;
|
||||
}
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
error.c - Part of libsensors, a Linux library for reading sensor data.
|
||||
Copyright (c) 1998 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 <stdio.h>
|
||||
#include "error.h"
|
||||
|
||||
static void sensors_default_parse_error(const char *err, int lineno);
|
||||
static void sensors_default_fatal_error(const char *proc,const char *err);
|
||||
|
||||
void (*sensors_parse_error) (const char *err, int lineno) =
|
||||
sensors_default_parse_error;
|
||||
void (*sensors_fatal_error) (const char *proc, const char *err) =
|
||||
sensors_default_fatal_error;
|
||||
|
||||
static const char *errorlist[] =
|
||||
{ /* Unknown error */ "sensors_strerror: Unknown error!",
|
||||
/* SENSORS_ERR_WILDCARDS */ "Wildcard found in chip name",
|
||||
/* SENSORS_ERR_NO_ENTRY */ "No such feature known",
|
||||
/* SENSORS_ERR_ACCESS */ "Can't read or write",
|
||||
/* SENSORS_ERR_PROC */ "Can't access /proc file",
|
||||
/* SENSORS_ERR_DIV_ZERO */ "Divide by zero",
|
||||
/* SENSORS_ERR_CHIP_NAME */ "Can't parse chip name",
|
||||
/* SENSORS_ERR_BUS_NAME */ "Can't parse bus name"
|
||||
};
|
||||
|
||||
#define ERROR_LIST_LEN (sizeof(errorlist) / sizeof(char *))
|
||||
|
||||
char *sensors_strerror(int errnum)
|
||||
{
|
||||
if (errnum < 0)
|
||||
errnum = -errnum;
|
||||
if (errnum >= ERROR_LIST_LEN)
|
||||
errnum = 0;
|
||||
return errorlist[errnum];
|
||||
}
|
||||
|
||||
void sensors_default_parse_error(const char *err, int lineno)
|
||||
{
|
||||
fprintf(stderr,"Line %d: %s\n",lineno,err);
|
||||
}
|
||||
|
||||
void sensors_default_fatal_error(const char *proc, const char *err)
|
||||
{
|
||||
fprintf(stderr,"Fatal error in `%s': %s\n",proc,err);
|
||||
exit(1);
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
error.h - Part of libsensors, a Linux library for reading sensor data.
|
||||
Copyright (c) 1998 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.
|
||||
*/
|
||||
|
||||
#ifndef LIB_SENSORS_ERROR_H
|
||||
#define LIB_SENSORS_ERROR_H
|
||||
|
||||
#define SENSORS_ERR_WILDCARDS 1 /* Wildcard found in chip name */
|
||||
#define SENSORS_ERR_NO_ENTRY 2 /* No such feature known */
|
||||
#define SENSORS_ERR_ACCESS 3 /* Can't read or write */
|
||||
#define SENSORS_ERR_PROC 4 /* Can't access /proc file */
|
||||
#define SENSORS_ERR_DIV_ZERO 5 /* Divide by zero */
|
||||
#define SENSORS_ERR_CHIP_NAME 6 /* Can't parse chip name */
|
||||
#define SENSORS_ERR_BUS_NAME 7 /* Can't parse bus name */
|
||||
|
||||
/* This function returns a pointer to a string which describes the error.
|
||||
errnum may be negative (the corresponding positive error is returned).
|
||||
You may not modify the result! */
|
||||
extern char *sensors_strerror(int errnum);
|
||||
|
||||
/* This function is called when a parse error is detected. Give it a new
|
||||
value, and your own function is called instead of the default (which
|
||||
prints to stderr). */
|
||||
extern void (*sensors_parse_error) (const char *err, int lineno);
|
||||
|
||||
/* This function is called when an immediately fatal error (like no
|
||||
memory left) is detected. Give it a new value, and your own function
|
||||
is called instead of the default (which prints to stderr and ends
|
||||
the program). */
|
||||
extern void (*sensors_fatal_error) (const char *proc, const char *err);
|
||||
|
||||
|
||||
#endif /* def LIB_SENSORS_ERROR_H */
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
general.c - Part of libsensors, a Linux library for reading sensor data.
|
||||
Copyright (c) 1998 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 "general.h"
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
#define A_BUNCH 16
|
||||
|
||||
void sensors_malloc_array(void **list, int *num_el, int *max_el, int el_size)
|
||||
{
|
||||
*list = malloc(el_size*A_BUNCH);
|
||||
if (! *list)
|
||||
sensors_fatal_error("sensors_malloc_array","Allocating new elements");
|
||||
*max_el = A_BUNCH;
|
||||
*num_el = 0;
|
||||
}
|
||||
|
||||
void sensors_free_array(void **list, int *num_el, int *max_el)
|
||||
{
|
||||
free(*list);
|
||||
*list = NULL;
|
||||
*num_el = 0;
|
||||
*max_el = 0;
|
||||
}
|
||||
|
||||
void sensors_add_array_el(const void *el, void **list, int *num_el,
|
||||
int *max_el, int el_size)
|
||||
{
|
||||
int new_max_el;
|
||||
if (*num_el + 1 > *max_el) {
|
||||
new_max_el = *max_el + A_BUNCH;
|
||||
*list = realloc(*list,new_max_el * el_size);
|
||||
if (! *list)
|
||||
sensors_fatal_error("sensors_add_array_el","Allocating new elements");
|
||||
*max_el = new_max_el;
|
||||
}
|
||||
memcpy(((char *) *list) + *num_el * el_size, el, el_size);
|
||||
(*num_el) ++;
|
||||
}
|
||||
|
||||
void sensors_add_array_els(const void *els, int nr_els, void **list,
|
||||
int *num_el, int *max_el, int el_size)
|
||||
{
|
||||
int new_max_el;
|
||||
if (*num_el + nr_els > *max_el) {
|
||||
new_max_el = (*max_el + nr_els + A_BUNCH);
|
||||
new_max_el -= new_max_el % A_BUNCH;
|
||||
*list = realloc(*list,new_max_el * el_size);
|
||||
if (! *list)
|
||||
sensors_fatal_error("sensors_add_array_els","Allocating new elements");
|
||||
*max_el = new_max_el;
|
||||
}
|
||||
memcpy(((char *)*list) + *num_el * el_size, els, el_size * nr_els);
|
||||
*num_el += nr_els;
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
general.h - Part of libsensors, a Linux library for reading sensor data.
|
||||
Copyright (c) 1998 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.
|
||||
*/
|
||||
|
||||
#ifndef LIB_SENSORS_GENERAL
|
||||
#define LIB_SENSORS_GENERAL
|
||||
|
||||
/* These are general purpose functions. They allow you to use variable-
|
||||
length arrays, which are extended automatically. A distinction is
|
||||
made between the current number of elements and the maximum number.
|
||||
You can only add elements at the end. Primitive, but very useful
|
||||
for internal use. */
|
||||
extern void sensors_malloc_array(void **list, int *num_el, int *max_el,
|
||||
int el_size);
|
||||
extern void sensors_free_array(void **list, int *num_el, int *max_el);
|
||||
extern void sensors_add_array_el(const void *el, void **list, int *num_el,
|
||||
int *max_el, int el_size);
|
||||
extern void sensors_add_array_els(const void *els, int nr_els, void **list,
|
||||
int *num_el, int *max_el, int el_size);
|
||||
|
||||
#endif /* LIB_SENSORS_GENERAL */
|
||||
Reference in new issue
Block a user