Blame lib/conf-parse.y

Packit 53d5b6
%{
Packit 53d5b6
/*
Packit 53d5b6
    conf-parse.y - Part of libsensors, a Linux library for reading sensor data.
Packit 53d5b6
    Copyright (c) 1998, 1999  Frodo Looijaard <frodol@dds.nl>
Packit 53d5b6
Packit 53d5b6
    This library is free software; you can redistribute it and/or
Packit 53d5b6
    modify it under the terms of the GNU Lesser General Public
Packit 53d5b6
    License as published by the Free Software Foundation; either
Packit 53d5b6
    version 2.1 of the License, or (at your option) any later version.
Packit 53d5b6
Packit 53d5b6
    This library is distributed in the hope that it will be useful,
Packit 53d5b6
    but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 53d5b6
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 53d5b6
    GNU Lesser General Public License for more details.
Packit 53d5b6
Packit 53d5b6
    You should have received a copy of the GNU General Public License
Packit 53d5b6
    along with this program; if not, write to the Free Software
Packit 53d5b6
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
Packit 53d5b6
    MA 02110-1301 USA.
Packit 53d5b6
*/
Packit 53d5b6
Packit 53d5b6
#define YYERROR_VERBOSE
Packit 53d5b6
Packit 53d5b6
#include <stdio.h>
Packit 53d5b6
#include <string.h>
Packit 53d5b6
#include <stdlib.h>
Packit 53d5b6
Packit 53d5b6
#include "data.h"
Packit 53d5b6
#include "general.h"
Packit 53d5b6
#include "error.h"
Packit 53d5b6
#include "conf.h"
Packit 53d5b6
#include "access.h"
Packit 53d5b6
#include "init.h"
Packit 53d5b6
Packit 53d5b6
static void sensors_yyerror(const char *err);
Packit 53d5b6
static sensors_expr *malloc_expr(void);
Packit 53d5b6
Packit 53d5b6
static sensors_chip *current_chip = NULL;
Packit 53d5b6
Packit 53d5b6
#define bus_add_el(el) sensors_add_array_el(el,\
Packit 53d5b6
                                      &sensors_config_busses,\
Packit 53d5b6
                                      &sensors_config_busses_count,\
Packit 53d5b6
                                      &sensors_config_busses_max,\
Packit 53d5b6
                                      sizeof(sensors_bus))
Packit 53d5b6
#define label_add_el(el) sensors_add_array_el(el,\
Packit 53d5b6
                                        &current_chip->labels,\
Packit 53d5b6
                                        &current_chip->labels_count,\
Packit 53d5b6
                                        &current_chip->labels_max,\
Packit 53d5b6
                                        sizeof(sensors_label));
Packit 53d5b6
#define set_add_el(el) sensors_add_array_el(el,\
Packit 53d5b6
                                      &current_chip->sets,\
Packit 53d5b6
                                      &current_chip->sets_count,\
Packit 53d5b6
                                      &current_chip->sets_max,\
Packit 53d5b6
                                      sizeof(sensors_set));
Packit 53d5b6
#define compute_add_el(el) sensors_add_array_el(el,\
Packit 53d5b6
                                          &current_chip->computes,\
Packit 53d5b6
                                          &current_chip->computes_count,\
Packit 53d5b6
                                          &current_chip->computes_max,\
Packit 53d5b6
                                          sizeof(sensors_compute));
Packit 53d5b6
#define ignore_add_el(el) sensors_add_array_el(el,\
Packit 53d5b6
                                          &current_chip->ignores,\
Packit 53d5b6
                                          &current_chip->ignores_count,\
Packit 53d5b6
                                          &current_chip->ignores_max,\
Packit 53d5b6
                                          sizeof(sensors_ignore));
Packit 53d5b6
#define chip_add_el(el) sensors_add_array_el(el,\
Packit 53d5b6
                                       &sensors_config_chips,\
Packit 53d5b6
                                       &sensors_config_chips_count,\
Packit 53d5b6
                                       &sensors_config_chips_max,\
Packit 53d5b6
                                       sizeof(sensors_chip));
Packit 53d5b6
Packit 53d5b6
#define fits_add_el(el,list) sensors_add_array_el(el,\
Packit 53d5b6
                                                  &(list).fits,\
Packit 53d5b6
                                                  &(list).fits_count,\
Packit 53d5b6
                                                  &(list).fits_max, \
Packit 53d5b6
		                                  sizeof(sensors_chip_name));
Packit 53d5b6
Packit 53d5b6
%}
Packit 53d5b6
Packit 53d5b6
%union {
Packit 53d5b6
  double value;
Packit 53d5b6
  char *name;
Packit 53d5b6
  void *nothing;
Packit 53d5b6
  sensors_chip_name_list chips;
Packit 53d5b6
  sensors_expr *expr;
Packit 53d5b6
  sensors_bus_id bus;
Packit 53d5b6
  sensors_chip_name chip;
Packit 53d5b6
  sensors_config_line line;
Packit 53d5b6
}  
Packit 53d5b6
Packit 53d5b6
%left <nothing> '-' '+'
Packit 53d5b6
%left <nothing> '*' '/'
Packit 53d5b6
%left <nothing> NEG
Packit 53d5b6
%right <nothing> '^' '`'
Packit 53d5b6
Packit 53d5b6
%token <nothing> ','
Packit 53d5b6
%token <nothing> EOL
Packit 53d5b6
%token <line> BUS
Packit 53d5b6
%token <line> LABEL
Packit 53d5b6
%token <line> SET
Packit 53d5b6
%token <line> CHIP
Packit 53d5b6
%token <line> COMPUTE
Packit 53d5b6
%token <line> IGNORE
Packit 53d5b6
%token <value> FLOAT
Packit 53d5b6
%token <name> NAME
Packit 53d5b6
%token <nothing> ERROR
Packit 53d5b6
Packit 53d5b6
%type <chips> chip_name_list
Packit 53d5b6
%type <expr> expression
Packit 53d5b6
%type <bus> bus_id
Packit 53d5b6
%type <name> adapter_name
Packit 53d5b6
%type <name> function_name
Packit 53d5b6
%type <name> string
Packit 53d5b6
%type <chip> chip_name
Packit 53d5b6
Packit 53d5b6
%start input
Packit 53d5b6
Packit 53d5b6
%%
Packit 53d5b6
Packit 53d5b6
input:	  /* empty */
Packit 53d5b6
	| input line
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
line:	  bus_statement EOL
Packit 53d5b6
	| label_statement EOL
Packit 53d5b6
	| set_statement EOL
Packit 53d5b6
	| chip_statement EOL
Packit 53d5b6
	| compute_statement EOL
Packit 53d5b6
	| ignore_statement EOL
Packit 53d5b6
	| error	EOL
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
bus_statement:	  BUS bus_id adapter_name
Packit 53d5b6
		  { sensors_bus new_el;
Packit 53d5b6
		    new_el.line = $1;
Packit 53d5b6
		    new_el.bus = $2;
Packit 53d5b6
                    new_el.adapter = $3;
Packit 53d5b6
		    bus_add_el(&new_el);
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
label_statement:	  LABEL function_name string
Packit 53d5b6
			  { sensors_label new_el;
Packit 53d5b6
			    if (!current_chip) {
Packit 53d5b6
			      sensors_yyerror("Label statement before first chip statement");
Packit 53d5b6
			      free($2);
Packit 53d5b6
			      free($3);
Packit 53d5b6
			      YYERROR;
Packit 53d5b6
			    }
Packit 53d5b6
			    new_el.line = $1;
Packit 53d5b6
			    new_el.name = $2;
Packit 53d5b6
			    new_el.value = $3;
Packit 53d5b6
			    label_add_el(&new_el);
Packit 53d5b6
			  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
set_statement:	  SET function_name expression
Packit 53d5b6
		  { sensors_set new_el;
Packit 53d5b6
		    if (!current_chip) {
Packit 53d5b6
		      sensors_yyerror("Set statement before first chip statement");
Packit 53d5b6
		      free($2);
Packit 53d5b6
		      sensors_free_expr($3);
Packit 53d5b6
		      YYERROR;
Packit 53d5b6
		    }
Packit 53d5b6
		    new_el.line = $1;
Packit 53d5b6
		    new_el.name = $2;
Packit 53d5b6
		    new_el.value = $3;
Packit 53d5b6
		    set_add_el(&new_el);
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
compute_statement:	  COMPUTE function_name expression ',' expression
Packit 53d5b6
			  { sensors_compute new_el;
Packit 53d5b6
			    if (!current_chip) {
Packit 53d5b6
			      sensors_yyerror("Compute statement before first chip statement");
Packit 53d5b6
			      free($2);
Packit 53d5b6
			      sensors_free_expr($3);
Packit 53d5b6
			      sensors_free_expr($5);
Packit 53d5b6
			      YYERROR;
Packit 53d5b6
			    }
Packit 53d5b6
			    new_el.line = $1;
Packit 53d5b6
			    new_el.name = $2;
Packit 53d5b6
			    new_el.from_proc = $3;
Packit 53d5b6
			    new_el.to_proc = $5;
Packit 53d5b6
			    compute_add_el(&new_el);
Packit 53d5b6
			  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
ignore_statement:	IGNORE function_name
Packit 53d5b6
			{ sensors_ignore new_el;
Packit 53d5b6
			  if (!current_chip) {
Packit 53d5b6
			    sensors_yyerror("Ignore statement before first chip statement");
Packit 53d5b6
			    free($2);
Packit 53d5b6
			    YYERROR;
Packit 53d5b6
			  }
Packit 53d5b6
			  new_el.line = $1;
Packit 53d5b6
			  new_el.name = $2;
Packit 53d5b6
			  ignore_add_el(&new_el);
Packit 53d5b6
			}
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
chip_statement:	  CHIP chip_name_list
Packit 53d5b6
		  { sensors_chip new_el;
Packit 53d5b6
		    new_el.line = $1;
Packit 53d5b6
		    new_el.labels = NULL;
Packit 53d5b6
		    new_el.sets = NULL;
Packit 53d5b6
		    new_el.computes = NULL;
Packit 53d5b6
		    new_el.ignores = NULL;
Packit 53d5b6
		    new_el.labels_count = new_el.labels_max = 0;
Packit 53d5b6
		    new_el.sets_count = new_el.sets_max = 0;
Packit 53d5b6
		    new_el.computes_count = new_el.computes_max = 0;
Packit 53d5b6
		    new_el.ignores_count = new_el.ignores_max = 0;
Packit 53d5b6
		    new_el.chips = $2;
Packit 53d5b6
		    chip_add_el(&new_el);
Packit 53d5b6
		    current_chip = sensors_config_chips + 
Packit 53d5b6
		                   sensors_config_chips_count - 1;
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
chip_name_list:	  chip_name
Packit 53d5b6
		  { 
Packit 53d5b6
		    $$.fits = NULL;
Packit 53d5b6
		    $$.fits_count = $$.fits_max = 0;
Packit 53d5b6
		    fits_add_el(&$1,$$);
Packit 53d5b6
		  }
Packit 53d5b6
		| chip_name_list chip_name
Packit 53d5b6
		  { $$ = $1;
Packit 53d5b6
		    fits_add_el(&$2,$$);
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
	
Packit 53d5b6
expression:	  FLOAT	
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->data.val = $1; 
Packit 53d5b6
		    $$->kind = sensors_kind_val;
Packit 53d5b6
		  }
Packit 53d5b6
		| NAME
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->data.var = $1;
Packit 53d5b6
		    $$->kind = sensors_kind_var;
Packit 53d5b6
		  }
Packit 53d5b6
		| '@'
Packit 53d5b6
		  { $$ = malloc_expr();
Packit 53d5b6
		    $$->kind = sensors_kind_source;
Packit 53d5b6
		  }
Packit 53d5b6
		| expression '+' expression
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_add;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $1;
Packit 53d5b6
		    $$->data.subexpr.sub2 = $3;
Packit 53d5b6
		  }
Packit 53d5b6
		| expression '-' expression
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_sub;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $1;
Packit 53d5b6
		    $$->data.subexpr.sub2 = $3;
Packit 53d5b6
		  }
Packit 53d5b6
		| expression '*' expression
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_multiply;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $1;
Packit 53d5b6
		    $$->data.subexpr.sub2 = $3;
Packit 53d5b6
		  }
Packit 53d5b6
		| expression '/' expression
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_divide;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $1;
Packit 53d5b6
		    $$->data.subexpr.sub2 = $3;
Packit 53d5b6
		  }
Packit 53d5b6
		| '-' expression  %prec NEG
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_negate;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $2;
Packit 53d5b6
		    $$->data.subexpr.sub2 = NULL;
Packit 53d5b6
		  }
Packit 53d5b6
		| '(' expression ')'
Packit 53d5b6
		  { $$ = $2; }
Packit 53d5b6
		| '^' expression
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_exp;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $2;
Packit 53d5b6
		    $$->data.subexpr.sub2 = NULL;
Packit 53d5b6
		  }
Packit 53d5b6
		| '`' expression
Packit 53d5b6
		  { $$ = malloc_expr(); 
Packit 53d5b6
		    $$->kind = sensors_kind_sub;
Packit 53d5b6
		    $$->data.subexpr.op = sensors_log;
Packit 53d5b6
		    $$->data.subexpr.sub1 = $2;
Packit 53d5b6
		    $$->data.subexpr.sub2 = NULL;
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
bus_id:		  NAME
Packit 53d5b6
		  { int res = sensors_parse_bus_id($1,&$$);
Packit 53d5b6
		    free($1);
Packit 53d5b6
		    if (res) {
Packit 53d5b6
                      sensors_yyerror("Parse error in bus id");
Packit 53d5b6
		      YYERROR;
Packit 53d5b6
                    }
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
adapter_name:	  NAME
Packit 53d5b6
		  { $$ = $1; }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
function_name:	  NAME
Packit 53d5b6
		  { $$ = $1; }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
string:	  NAME
Packit 53d5b6
	  { $$ = $1; }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
chip_name:	  NAME
Packit 53d5b6
		  { int res = sensors_parse_chip_name($1,&$$); 
Packit 53d5b6
		    free($1);
Packit 53d5b6
		    if (res) {
Packit 53d5b6
		      sensors_yyerror("Parse error in chip name");
Packit 53d5b6
		      YYERROR;
Packit 53d5b6
		    }
Packit 53d5b6
		  }
Packit 53d5b6
;
Packit 53d5b6
Packit 53d5b6
%%
Packit 53d5b6
Packit 53d5b6
void sensors_yyerror(const char *err)
Packit 53d5b6
{
Packit 53d5b6
  if (sensors_lex_error[0]) {
Packit 53d5b6
    sensors_parse_error_wfn(sensors_lex_error, sensors_yyfilename, sensors_yylineno);
Packit 53d5b6
    sensors_lex_error[0] = '\0';
Packit 53d5b6
  } else
Packit 53d5b6
    sensors_parse_error_wfn(err, sensors_yyfilename, sensors_yylineno);
Packit 53d5b6
}
Packit 53d5b6
Packit 53d5b6
sensors_expr *malloc_expr(void)
Packit 53d5b6
{
Packit 53d5b6
  sensors_expr *res = malloc(sizeof(sensors_expr));
Packit 53d5b6
  if (! res)
Packit 53d5b6
    sensors_fatal_error(__func__, "Allocating a new expression");
Packit 53d5b6
  return res;
Packit 53d5b6
}