148730Siwasaki%{ 248730Siwasaki/*- 348730Siwasaki * APM (Advanced Power Management) Event Dispatcher 448730Siwasaki * 548730Siwasaki * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org> 648730Siwasaki * Copyright (c) 1999 KOIE Hidetaka <koie@suri.co.jp> 748730Siwasaki * All rights reserved. 848730Siwasaki * 948730Siwasaki * Redistribution and use in source and binary forms, with or without 1048730Siwasaki * modification, are permitted provided that the following conditions 1148730Siwasaki * are met: 1248730Siwasaki * 1. Redistributions of source code must retain the above copyright 1348730Siwasaki * notice, this list of conditions and the following disclaimer. 1448730Siwasaki * 2. Redistributions in binary form must reproduce the above copyright 1548730Siwasaki * notice, this list of conditions and the following disclaimer in the 1648730Siwasaki * documentation and/or other materials provided with the distribution. 1748730Siwasaki * 1848730Siwasaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1948730Siwasaki * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2048730Siwasaki * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2148730Siwasaki * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2248730Siwasaki * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2348730Siwasaki * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2448730Siwasaki * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2548730Siwasaki * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2648730Siwasaki * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2748730Siwasaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2848730Siwasaki * SUCH DAMAGE. 2948730Siwasaki * 3050479Speter * $FreeBSD: releng/11.0/usr.sbin/apmd/apmdparse.y 300557 2016-05-24 03:15:46Z peter $ 3148730Siwasaki */ 3248730Siwasaki 33300557Speter#include <sys/types.h> 3448730Siwasaki#include <stdio.h> 3548730Siwasaki#include <bitstring.h> 3676611Snsayer#include <stdlib.h> 37116074Simp#include <string.h> 3848730Siwasaki#include "apmd.h" 3948730Siwasaki 4048730Siwasaki#ifdef DEBUG 4148730Siwasaki#define YYDEBUG 1 4248730Siwasaki#endif 4348730Siwasaki 4448730Siwasakiextern int first_time; 4548730Siwasaki 4648730Siwasaki%} 4748730Siwasaki 4848730Siwasaki%union { 4948730Siwasaki char *str; 5048730Siwasaki bitstr_t bit_decl(evlist, EVENT_MAX); 5148730Siwasaki int ev; 5248730Siwasaki struct event_cmd * evcmd; 5376611Snsayer int i; 5448730Siwasaki} 5548730Siwasaki 5648730Siwasaki%token BEGINBLOCK ENDBLOCK 5748730Siwasaki%token COMMA SEMICOLON 5848730Siwasaki%token APMEVENT 5976611Snsayer%token APMBATT 6076611Snsayer%token BATTCHARGE BATTDISCHARGE 61116442Smaxim%token <i> BATTTIME BATTPERCENT 6248730Siwasaki%token EXECCMD REJECTCMD 6348730Siwasaki%token <ev> EVENT 6448730Siwasaki%token <str> STRING UNKNOWN 6548730Siwasaki 6676611Snsayer%type <i> apm_battery_level 6776611Snsayer%type <i> apm_battery_direction 6848730Siwasaki%type <str> string 6948730Siwasaki%type <str> unknown 7048730Siwasaki%type <evlist> event_list 7148730Siwasaki%type <evcmd> cmd_list 7248730Siwasaki%type <evcmd> cmd 7348730Siwasaki%type <evcmd> exec_cmd reject_cmd 7448730Siwasaki 7548730Siwasaki%% 7648730Siwasaki 7748730Siwasakiconfig_file 7848730Siwasaki : { first_time = 1; } config_list 7948730Siwasaki ; 8048730Siwasaki 8148730Siwasakiconfig_list 8248730Siwasaki : config 8348730Siwasaki | config_list config 8448730Siwasaki ; 8548730Siwasaki 8648730Siwasakiconfig 8748730Siwasaki : apm_event_statement 8876611Snsayer | apm_battery_statement 8948730Siwasaki ; 9048730Siwasaki 9148730Siwasakiapm_event_statement 9248730Siwasaki : APMEVENT event_list BEGINBLOCK cmd_list ENDBLOCK 9348730Siwasaki { 9448730Siwasaki if (register_apm_event_handlers($2, $4) < 0) 9548730Siwasaki abort(); /* XXX */ 9648730Siwasaki free_event_cmd_list($4); 9748730Siwasaki } 9848730Siwasaki ; 9948730Siwasaki 10076611Snsayerapm_battery_level 10176611Snsayer : BATTPERCENT 10276611Snsayer { 10376611Snsayer $$ = $1; 10476611Snsayer } 10576611Snsayer | BATTTIME 10676611Snsayer { 10776611Snsayer $$ = $1; 10876611Snsayer } 10976611Snsayer ; 11076611Snsayer 11176611Snsayerapm_battery_direction 11276611Snsayer : BATTCHARGE 11376611Snsayer { 11476611Snsayer $$ = 1; 11576611Snsayer } 11676611Snsayer | BATTDISCHARGE 11776611Snsayer { 11876611Snsayer $$ = -1; 11976611Snsayer } 12076611Snsayer ; 12176611Snsayerapm_battery_statement 12276611Snsayer : APMBATT apm_battery_level apm_battery_direction 12376611Snsayer BEGINBLOCK cmd_list ENDBLOCK 12476611Snsayer { 12576611Snsayer if (register_battery_handlers($2, $3, $5) < 0) 12676611Snsayer abort(); /* XXX */ 12776611Snsayer free_event_cmd_list($5); 12876611Snsayer } 12976611Snsayer ; 13076611Snsayer 13148730Siwasakievent_list 13248730Siwasaki : EVENT 13348730Siwasaki { 13448730Siwasaki bit_nclear($$, 0, EVENT_MAX - 1); 13548730Siwasaki bit_set($$, $1); 13648730Siwasaki } 13748730Siwasaki | event_list COMMA EVENT 13848730Siwasaki { 13948730Siwasaki memcpy(&($$), &($1), bitstr_size(EVENT_MAX)); 14048730Siwasaki bit_set($$, $3); 14148730Siwasaki } 14248730Siwasaki ; 14348730Siwasaki 14448730Siwasakicmd_list 14548730Siwasaki : /* empty */ 14648730Siwasaki { 14748730Siwasaki $$ = NULL; 14848730Siwasaki } 14948730Siwasaki | cmd_list cmd 15048730Siwasaki { 15148730Siwasaki struct event_cmd * p = $1; 15248730Siwasaki if (p) { 15348730Siwasaki while (p->next != NULL) 15448730Siwasaki p = p->next; 15548730Siwasaki p->next = $2; 15648730Siwasaki $$ = $1; 15748730Siwasaki } else { 15848730Siwasaki $$ = $2; 15948730Siwasaki } 16048730Siwasaki } 16148730Siwasaki ; 16248730Siwasaki 16348730Siwasakicmd 16448730Siwasaki : exec_cmd SEMICOLON { $$ = $1; } 16548730Siwasaki | reject_cmd SEMICOLON { $$ = $1; } 16648730Siwasaki ; 16748730Siwasaki 16848730Siwasakiexec_cmd 16948730Siwasaki : EXECCMD string 17048730Siwasaki { 17148730Siwasaki size_t len = sizeof (struct event_cmd_exec); 17248730Siwasaki struct event_cmd_exec *cmd = malloc(len); 17348730Siwasaki cmd->evcmd.next = NULL; 17448730Siwasaki cmd->evcmd.len = len; 17548730Siwasaki cmd->evcmd.name = "exec"; 17648730Siwasaki cmd->evcmd.op = &event_cmd_exec_ops; 17748730Siwasaki cmd->line = $2; 17848730Siwasaki $$ = (struct event_cmd *) cmd; 17948730Siwasaki } 18048730Siwasaki ; 18148730Siwasaki 18248730Siwasakireject_cmd 18348730Siwasaki : REJECTCMD 18448730Siwasaki { 18548730Siwasaki size_t len = sizeof (struct event_cmd_reject); 18648730Siwasaki struct event_cmd_reject *cmd = malloc(len); 18748730Siwasaki cmd->evcmd.next = NULL; 18848730Siwasaki cmd->evcmd.len = len; 18948730Siwasaki cmd->evcmd.name = "reject"; 19048730Siwasaki cmd->evcmd.op = &event_cmd_reject_ops; 19148730Siwasaki $$ = (struct event_cmd *) cmd; 19248730Siwasaki } 19348730Siwasaki ; 19448730Siwasaki 19548730Siwasakistring 19648730Siwasaki : STRING { $$ = $1; } 19748730Siwasaki ; 19848730Siwasaki 19948730Siwasakiunknown 20048730Siwasaki : UNKNOWN 20148730Siwasaki { 20248730Siwasaki $$ = $1; 20348730Siwasaki } 20448730Siwasaki ; 20548730Siwasaki%% 20648730Siwasaki 207