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/10.3/usr.sbin/apmd/apmdparse.y 116442 2003-06-16 14:57:07Z maxim $
3148730Siwasaki */
3248730Siwasaki
3348730Siwasaki#include <stdio.h>
3448730Siwasaki#include <bitstring.h>
3576611Snsayer#include <stdlib.h>
36116074Simp#include <string.h>
3748730Siwasaki#include "apmd.h"
3848730Siwasaki
3948730Siwasaki#ifdef DEBUG
4048730Siwasaki#define YYDEBUG 1
4148730Siwasaki#endif
4248730Siwasaki
4348730Siwasakiextern int first_time;
4448730Siwasaki
4548730Siwasaki%}
4648730Siwasaki
4748730Siwasaki%union {
4848730Siwasaki	char *str;
4948730Siwasaki	bitstr_t bit_decl(evlist, EVENT_MAX);
5048730Siwasaki	int ev;
5148730Siwasaki	struct event_cmd * evcmd;
5276611Snsayer	int i;
5348730Siwasaki}
5448730Siwasaki
5548730Siwasaki%token BEGINBLOCK ENDBLOCK
5648730Siwasaki%token COMMA SEMICOLON
5748730Siwasaki%token APMEVENT
5876611Snsayer%token APMBATT
5976611Snsayer%token BATTCHARGE BATTDISCHARGE
60116442Smaxim%token <i> BATTTIME BATTPERCENT
6148730Siwasaki%token EXECCMD REJECTCMD
6248730Siwasaki%token <ev> EVENT
6348730Siwasaki%token <str> STRING UNKNOWN
6448730Siwasaki
6576611Snsayer%type <i> apm_battery_level
6676611Snsayer%type <i> apm_battery_direction
6748730Siwasaki%type <str> string
6848730Siwasaki%type <str> unknown
6948730Siwasaki%type <evlist> event_list
7048730Siwasaki%type <evcmd> cmd_list
7148730Siwasaki%type <evcmd> cmd
7248730Siwasaki%type <evcmd> exec_cmd reject_cmd
7348730Siwasaki
7448730Siwasaki%%
7548730Siwasaki
7648730Siwasakiconfig_file
7748730Siwasaki	: { first_time = 1; } config_list
7848730Siwasaki	;
7948730Siwasaki
8048730Siwasakiconfig_list
8148730Siwasaki	: config
8248730Siwasaki	| config_list config
8348730Siwasaki	;
8448730Siwasaki
8548730Siwasakiconfig
8648730Siwasaki	: apm_event_statement
8776611Snsayer	| apm_battery_statement
8848730Siwasaki	;
8948730Siwasaki
9048730Siwasakiapm_event_statement
9148730Siwasaki	: APMEVENT event_list BEGINBLOCK cmd_list ENDBLOCK
9248730Siwasaki		{
9348730Siwasaki			if (register_apm_event_handlers($2, $4) < 0)
9448730Siwasaki				abort(); /* XXX */
9548730Siwasaki			free_event_cmd_list($4);
9648730Siwasaki		}
9748730Siwasaki	;
9848730Siwasaki
9976611Snsayerapm_battery_level
10076611Snsayer	: BATTPERCENT
10176611Snsayer		{
10276611Snsayer			$$ = $1;
10376611Snsayer		}
10476611Snsayer	| BATTTIME
10576611Snsayer		{
10676611Snsayer			$$ = $1;
10776611Snsayer		}
10876611Snsayer	;
10976611Snsayer
11076611Snsayerapm_battery_direction
11176611Snsayer	: BATTCHARGE
11276611Snsayer		{
11376611Snsayer			$$ = 1;
11476611Snsayer		}
11576611Snsayer	| BATTDISCHARGE
11676611Snsayer		{
11776611Snsayer			$$ = -1;
11876611Snsayer		}
11976611Snsayer	;
12076611Snsayerapm_battery_statement
12176611Snsayer	: APMBATT apm_battery_level apm_battery_direction
12276611Snsayer		BEGINBLOCK cmd_list ENDBLOCK
12376611Snsayer		{
12476611Snsayer			if (register_battery_handlers($2, $3, $5) < 0)
12576611Snsayer				abort(); /* XXX */
12676611Snsayer			free_event_cmd_list($5);
12776611Snsayer		}
12876611Snsayer	;
12976611Snsayer
13048730Siwasakievent_list
13148730Siwasaki	: EVENT
13248730Siwasaki		{
13348730Siwasaki			bit_nclear($$, 0, EVENT_MAX - 1);
13448730Siwasaki			bit_set($$, $1);
13548730Siwasaki		}
13648730Siwasaki	| event_list COMMA EVENT
13748730Siwasaki		{
13848730Siwasaki			memcpy(&($$), &($1), bitstr_size(EVENT_MAX));
13948730Siwasaki			bit_set($$, $3);
14048730Siwasaki		}
14148730Siwasaki	;
14248730Siwasaki
14348730Siwasakicmd_list
14448730Siwasaki	: /* empty */
14548730Siwasaki		{
14648730Siwasaki			$$  = NULL;
14748730Siwasaki		}
14848730Siwasaki	| cmd_list cmd
14948730Siwasaki		{
15048730Siwasaki			struct event_cmd * p = $1;
15148730Siwasaki			if (p) {
15248730Siwasaki				while (p->next != NULL)
15348730Siwasaki					p = p->next;
15448730Siwasaki				p->next = $2;
15548730Siwasaki				$$ = $1;
15648730Siwasaki			} else {
15748730Siwasaki				$$ = $2;
15848730Siwasaki			}
15948730Siwasaki		}
16048730Siwasaki	;
16148730Siwasaki
16248730Siwasakicmd
16348730Siwasaki	: exec_cmd SEMICOLON	{ $$ = $1; }
16448730Siwasaki	| reject_cmd SEMICOLON	{ $$ = $1; }
16548730Siwasaki	;
16648730Siwasaki
16748730Siwasakiexec_cmd
16848730Siwasaki	: EXECCMD string
16948730Siwasaki		{
17048730Siwasaki			size_t len = sizeof (struct event_cmd_exec);
17148730Siwasaki			struct event_cmd_exec *cmd = malloc(len);
17248730Siwasaki			cmd->evcmd.next = NULL;
17348730Siwasaki			cmd->evcmd.len = len;
17448730Siwasaki			cmd->evcmd.name = "exec";
17548730Siwasaki			cmd->evcmd.op = &event_cmd_exec_ops;
17648730Siwasaki			cmd->line = $2;
17748730Siwasaki			$$ = (struct event_cmd *) cmd;
17848730Siwasaki		}
17948730Siwasaki	;
18048730Siwasaki
18148730Siwasakireject_cmd
18248730Siwasaki	: REJECTCMD
18348730Siwasaki		{
18448730Siwasaki			size_t len = sizeof (struct event_cmd_reject);
18548730Siwasaki			struct event_cmd_reject *cmd = malloc(len);
18648730Siwasaki			cmd->evcmd.next = NULL;
18748730Siwasaki			cmd->evcmd.len = len;
18848730Siwasaki			cmd->evcmd.name = "reject";
18948730Siwasaki			cmd->evcmd.op = &event_cmd_reject_ops;
19048730Siwasaki			$$ = (struct event_cmd *) cmd;
19148730Siwasaki		}
19248730Siwasaki	;
19348730Siwasaki
19448730Siwasakistring
19548730Siwasaki	: STRING	{ $$ = $1; }
19648730Siwasaki	;
19748730Siwasaki
19848730Siwasakiunknown
19948730Siwasaki	: UNKNOWN
20048730Siwasaki		{
20148730Siwasaki			$$ = $1;
20248730Siwasaki		}
20348730Siwasaki	;
20448730Siwasaki%%
20548730Siwasaki
206