xref: /freebsd/usr.sbin/apmd/apmdparse.y (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1d50a71bdSMitsuru IWASAKI %{
2d50a71bdSMitsuru IWASAKI /*-
3*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
41de7b4b8SPedro F. Giffuni  *
5d50a71bdSMitsuru IWASAKI  * APM (Advanced Power Management) Event Dispatcher
6d50a71bdSMitsuru IWASAKI  *
7d50a71bdSMitsuru IWASAKI  * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
8d50a71bdSMitsuru IWASAKI  * Copyright (c) 1999 KOIE Hidetaka <koie@suri.co.jp>
9d50a71bdSMitsuru IWASAKI  * All rights reserved.
10d50a71bdSMitsuru IWASAKI  *
11d50a71bdSMitsuru IWASAKI  * Redistribution and use in source and binary forms, with or without
12d50a71bdSMitsuru IWASAKI  * modification, are permitted provided that the following conditions
13d50a71bdSMitsuru IWASAKI  * are met:
14d50a71bdSMitsuru IWASAKI  * 1. Redistributions of source code must retain the above copyright
15d50a71bdSMitsuru IWASAKI  *    notice, this list of conditions and the following disclaimer.
16d50a71bdSMitsuru IWASAKI  * 2. Redistributions in binary form must reproduce the above copyright
17d50a71bdSMitsuru IWASAKI  *    notice, this list of conditions and the following disclaimer in the
18d50a71bdSMitsuru IWASAKI  *    documentation and/or other materials provided with the distribution.
19d50a71bdSMitsuru IWASAKI  *
20d50a71bdSMitsuru IWASAKI  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21d50a71bdSMitsuru IWASAKI  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22d50a71bdSMitsuru IWASAKI  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23d50a71bdSMitsuru IWASAKI  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24d50a71bdSMitsuru IWASAKI  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25d50a71bdSMitsuru IWASAKI  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26d50a71bdSMitsuru IWASAKI  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27d50a71bdSMitsuru IWASAKI  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28d50a71bdSMitsuru IWASAKI  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29d50a71bdSMitsuru IWASAKI  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30d50a71bdSMitsuru IWASAKI  * SUCH DAMAGE.
31d50a71bdSMitsuru IWASAKI  */
32d50a71bdSMitsuru IWASAKI 
3300774f35SPeter Wemm #include <sys/types.h>
34d50a71bdSMitsuru IWASAKI #include <stdio.h>
35d50a71bdSMitsuru IWASAKI #include <bitstring.h>
36719b9dc1SNick Sayer #include <stdlib.h>
37f4fe0dcbSWarner Losh #include <string.h>
38d50a71bdSMitsuru IWASAKI #include "apmd.h"
39d50a71bdSMitsuru IWASAKI 
40d50a71bdSMitsuru IWASAKI #ifdef DEBUG
41d50a71bdSMitsuru IWASAKI #define YYDEBUG 1
42d50a71bdSMitsuru IWASAKI #endif
43d50a71bdSMitsuru IWASAKI 
44d50a71bdSMitsuru IWASAKI extern int first_time;
45d50a71bdSMitsuru IWASAKI 
46d50a71bdSMitsuru IWASAKI %}
47d50a71bdSMitsuru IWASAKI 
48d50a71bdSMitsuru IWASAKI %union {
49d50a71bdSMitsuru IWASAKI 	char *str;
50d50a71bdSMitsuru IWASAKI 	bitstr_t bit_decl(evlist, EVENT_MAX);
51d50a71bdSMitsuru IWASAKI 	int ev;
52d50a71bdSMitsuru IWASAKI 	struct event_cmd * evcmd;
53719b9dc1SNick Sayer 	int i;
54d50a71bdSMitsuru IWASAKI }
55d50a71bdSMitsuru IWASAKI 
56d50a71bdSMitsuru IWASAKI %token BEGINBLOCK ENDBLOCK
57d50a71bdSMitsuru IWASAKI %token COMMA SEMICOLON
58d50a71bdSMitsuru IWASAKI %token APMEVENT
59719b9dc1SNick Sayer %token APMBATT
60719b9dc1SNick Sayer %token BATTCHARGE BATTDISCHARGE
61c7012f4aSMaxim Konovalov %token <i> BATTTIME BATTPERCENT
62d50a71bdSMitsuru IWASAKI %token EXECCMD REJECTCMD
63d50a71bdSMitsuru IWASAKI %token <ev> EVENT
64d50a71bdSMitsuru IWASAKI %token <str> STRING UNKNOWN
65d50a71bdSMitsuru IWASAKI 
66719b9dc1SNick Sayer %type <i> apm_battery_level
67719b9dc1SNick Sayer %type <i> apm_battery_direction
68d50a71bdSMitsuru IWASAKI %type <str> string
69d50a71bdSMitsuru IWASAKI %type <str> unknown
70d50a71bdSMitsuru IWASAKI %type <evlist> event_list
71d50a71bdSMitsuru IWASAKI %type <evcmd> cmd_list
72d50a71bdSMitsuru IWASAKI %type <evcmd> cmd
73d50a71bdSMitsuru IWASAKI %type <evcmd> exec_cmd reject_cmd
74d50a71bdSMitsuru IWASAKI 
75d50a71bdSMitsuru IWASAKI %%
76d50a71bdSMitsuru IWASAKI 
77d50a71bdSMitsuru IWASAKI config_file
78d50a71bdSMitsuru IWASAKI 	: { first_time = 1; } config_list
79d50a71bdSMitsuru IWASAKI 	;
80d50a71bdSMitsuru IWASAKI 
81d50a71bdSMitsuru IWASAKI config_list
82d50a71bdSMitsuru IWASAKI 	: config
83d50a71bdSMitsuru IWASAKI 	| config_list config
84d50a71bdSMitsuru IWASAKI 	;
85d50a71bdSMitsuru IWASAKI 
86d50a71bdSMitsuru IWASAKI config
87d50a71bdSMitsuru IWASAKI 	: apm_event_statement
88719b9dc1SNick Sayer 	| apm_battery_statement
89d50a71bdSMitsuru IWASAKI 	;
90d50a71bdSMitsuru IWASAKI 
91d50a71bdSMitsuru IWASAKI apm_event_statement
92d50a71bdSMitsuru IWASAKI 	: APMEVENT event_list BEGINBLOCK cmd_list ENDBLOCK
93d50a71bdSMitsuru IWASAKI 		{
94d50a71bdSMitsuru IWASAKI 			if (register_apm_event_handlers($2, $4) < 0)
95d50a71bdSMitsuru IWASAKI 				abort(); /* XXX */
96d50a71bdSMitsuru IWASAKI 			free_event_cmd_list($4);
97d50a71bdSMitsuru IWASAKI 		}
98d50a71bdSMitsuru IWASAKI 	;
99d50a71bdSMitsuru IWASAKI 
100719b9dc1SNick Sayer apm_battery_level
101719b9dc1SNick Sayer 	: BATTPERCENT
102719b9dc1SNick Sayer 		{
103719b9dc1SNick Sayer 			$$ = $1;
104719b9dc1SNick Sayer 		}
105719b9dc1SNick Sayer 	| BATTTIME
106719b9dc1SNick Sayer 		{
107719b9dc1SNick Sayer 			$$ = $1;
108719b9dc1SNick Sayer 		}
109719b9dc1SNick Sayer 	;
110719b9dc1SNick Sayer 
111719b9dc1SNick Sayer apm_battery_direction
112719b9dc1SNick Sayer 	: BATTCHARGE
113719b9dc1SNick Sayer 		{
114719b9dc1SNick Sayer 			$$ = 1;
115719b9dc1SNick Sayer 		}
116719b9dc1SNick Sayer 	| BATTDISCHARGE
117719b9dc1SNick Sayer 		{
118719b9dc1SNick Sayer 			$$ = -1;
119719b9dc1SNick Sayer 		}
120719b9dc1SNick Sayer 	;
121719b9dc1SNick Sayer apm_battery_statement
122719b9dc1SNick Sayer 	: APMBATT apm_battery_level apm_battery_direction
123719b9dc1SNick Sayer 		BEGINBLOCK cmd_list ENDBLOCK
124719b9dc1SNick Sayer 		{
125719b9dc1SNick Sayer 			if (register_battery_handlers($2, $3, $5) < 0)
126719b9dc1SNick Sayer 				abort(); /* XXX */
127719b9dc1SNick Sayer 			free_event_cmd_list($5);
128719b9dc1SNick Sayer 		}
129719b9dc1SNick Sayer 	;
130719b9dc1SNick Sayer 
131d50a71bdSMitsuru IWASAKI event_list
132d50a71bdSMitsuru IWASAKI 	: EVENT
133d50a71bdSMitsuru IWASAKI 		{
134d50a71bdSMitsuru IWASAKI 			bit_nclear($$, 0, EVENT_MAX - 1);
135d50a71bdSMitsuru IWASAKI 			bit_set($$, $1);
136d50a71bdSMitsuru IWASAKI 		}
137d50a71bdSMitsuru IWASAKI 	| event_list COMMA EVENT
138d50a71bdSMitsuru IWASAKI 		{
139d50a71bdSMitsuru IWASAKI 			memcpy(&($$), &($1), bitstr_size(EVENT_MAX));
140d50a71bdSMitsuru IWASAKI 			bit_set($$, $3);
141d50a71bdSMitsuru IWASAKI 		}
142d50a71bdSMitsuru IWASAKI 	;
143d50a71bdSMitsuru IWASAKI 
144d50a71bdSMitsuru IWASAKI cmd_list
145d50a71bdSMitsuru IWASAKI 	: /* empty */
146d50a71bdSMitsuru IWASAKI 		{
147d50a71bdSMitsuru IWASAKI 			$$  = NULL;
148d50a71bdSMitsuru IWASAKI 		}
149d50a71bdSMitsuru IWASAKI 	| cmd_list cmd
150d50a71bdSMitsuru IWASAKI 		{
151d50a71bdSMitsuru IWASAKI 			struct event_cmd * p = $1;
152d50a71bdSMitsuru IWASAKI 			if (p) {
153d50a71bdSMitsuru IWASAKI 				while (p->next != NULL)
154d50a71bdSMitsuru IWASAKI 					p = p->next;
155d50a71bdSMitsuru IWASAKI 				p->next = $2;
156d50a71bdSMitsuru IWASAKI 				$$ = $1;
157d50a71bdSMitsuru IWASAKI 			} else {
158d50a71bdSMitsuru IWASAKI 				$$ = $2;
159d50a71bdSMitsuru IWASAKI 			}
160d50a71bdSMitsuru IWASAKI 		}
161d50a71bdSMitsuru IWASAKI 	;
162d50a71bdSMitsuru IWASAKI 
163d50a71bdSMitsuru IWASAKI cmd
164d50a71bdSMitsuru IWASAKI 	: exec_cmd SEMICOLON	{ $$ = $1; }
165d50a71bdSMitsuru IWASAKI 	| reject_cmd SEMICOLON	{ $$ = $1; }
166d50a71bdSMitsuru IWASAKI 	;
167d50a71bdSMitsuru IWASAKI 
168d50a71bdSMitsuru IWASAKI exec_cmd
169d50a71bdSMitsuru IWASAKI 	: EXECCMD string
170d50a71bdSMitsuru IWASAKI 		{
171d50a71bdSMitsuru IWASAKI 			size_t len = sizeof (struct event_cmd_exec);
172d50a71bdSMitsuru IWASAKI 			struct event_cmd_exec *cmd = malloc(len);
173d50a71bdSMitsuru IWASAKI 			cmd->evcmd.next = NULL;
174d50a71bdSMitsuru IWASAKI 			cmd->evcmd.len = len;
175d50a71bdSMitsuru IWASAKI 			cmd->evcmd.name = "exec";
176d50a71bdSMitsuru IWASAKI 			cmd->evcmd.op = &event_cmd_exec_ops;
177d50a71bdSMitsuru IWASAKI 			cmd->line = $2;
178d50a71bdSMitsuru IWASAKI 			$$ = (struct event_cmd *) cmd;
179d50a71bdSMitsuru IWASAKI 		}
180d50a71bdSMitsuru IWASAKI 	;
181d50a71bdSMitsuru IWASAKI 
182d50a71bdSMitsuru IWASAKI reject_cmd
183d50a71bdSMitsuru IWASAKI 	: REJECTCMD
184d50a71bdSMitsuru IWASAKI 		{
185d50a71bdSMitsuru IWASAKI 			size_t len = sizeof (struct event_cmd_reject);
186d50a71bdSMitsuru IWASAKI 			struct event_cmd_reject *cmd = malloc(len);
187d50a71bdSMitsuru IWASAKI 			cmd->evcmd.next = NULL;
188d50a71bdSMitsuru IWASAKI 			cmd->evcmd.len = len;
189d50a71bdSMitsuru IWASAKI 			cmd->evcmd.name = "reject";
190d50a71bdSMitsuru IWASAKI 			cmd->evcmd.op = &event_cmd_reject_ops;
191d50a71bdSMitsuru IWASAKI 			$$ = (struct event_cmd *) cmd;
192d50a71bdSMitsuru IWASAKI 		}
193d50a71bdSMitsuru IWASAKI 	;
194d50a71bdSMitsuru IWASAKI 
195d50a71bdSMitsuru IWASAKI string
196d50a71bdSMitsuru IWASAKI 	: STRING	{ $$ = $1; }
197d50a71bdSMitsuru IWASAKI 	;
198d50a71bdSMitsuru IWASAKI 
199d50a71bdSMitsuru IWASAKI unknown
200d50a71bdSMitsuru IWASAKI 	: UNKNOWN
201d50a71bdSMitsuru IWASAKI 		{
202d50a71bdSMitsuru IWASAKI 			$$ = $1;
203d50a71bdSMitsuru IWASAKI 		}
204d50a71bdSMitsuru IWASAKI 	;
205d50a71bdSMitsuru IWASAKI %%
206d50a71bdSMitsuru IWASAKI 
207