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