1*7c478bd9Sstevel@tonic-gate %{
2*7c478bd9Sstevel@tonic-gate /*
3*7c478bd9Sstevel@tonic-gate * CDDL HEADER START
4*7c478bd9Sstevel@tonic-gate *
5*7c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the
6*7c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
7*7c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance
8*7c478bd9Sstevel@tonic-gate * with the License.
9*7c478bd9Sstevel@tonic-gate *
10*7c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
11*7c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
12*7c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions
13*7c478bd9Sstevel@tonic-gate * and limitations under the License.
14*7c478bd9Sstevel@tonic-gate *
15*7c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
16*7c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
17*7c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
18*7c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
19*7c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
20*7c478bd9Sstevel@tonic-gate *
21*7c478bd9Sstevel@tonic-gate * CDDL HEADER END
22*7c478bd9Sstevel@tonic-gate *
23*7c478bd9Sstevel@tonic-gate * Copyright (c) 1999-2000 by Sun Microsystems, Inc.
24*7c478bd9Sstevel@tonic-gate * All rights reserved.
25*7c478bd9Sstevel@tonic-gate */
26*7c478bd9Sstevel@tonic-gate
27*7c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI"
28*7c478bd9Sstevel@tonic-gate
29*7c478bd9Sstevel@tonic-gate #include <stdio.h>
30*7c478bd9Sstevel@tonic-gate #include <locale.h>
31*7c478bd9Sstevel@tonic-gate #include <sys/param.h>
32*7c478bd9Sstevel@tonic-gate #include <sys/fs/udf_volume.h>
33*7c478bd9Sstevel@tonic-gate
34*7c478bd9Sstevel@tonic-gate char shell_name[128] = "/bin/sh";
35*7c478bd9Sstevel@tonic-gate extern char prompt[];
36*7c478bd9Sstevel@tonic-gate extern uint16_t ricb_prn;
37*7c478bd9Sstevel@tonic-gate extern uint32_t ricb_loc;
38*7c478bd9Sstevel@tonic-gate extern int32_t bsize, bmask, l2d, l2b;
39*7c478bd9Sstevel@tonic-gate
40*7c478bd9Sstevel@tonic-gate int base = 16;
41*7c478bd9Sstevel@tonic-gate int old_value = 0;
42*7c478bd9Sstevel@tonic-gate int value = 0;
43*7c478bd9Sstevel@tonic-gate int count = 0;
44*7c478bd9Sstevel@tonic-gate
45*7c478bd9Sstevel@tonic-gate
46*7c478bd9Sstevel@tonic-gate int last_op_type = 0;
47*7c478bd9Sstevel@tonic-gate #define TYPE_NONE 0
48*7c478bd9Sstevel@tonic-gate #define TYPE_INODE 1
49*7c478bd9Sstevel@tonic-gate #define TYPE_DIRENT 2
50*7c478bd9Sstevel@tonic-gate #define TYPE_BLOCK 3
51*7c478bd9Sstevel@tonic-gate #define TYPE_CD 4
52*7c478bd9Sstevel@tonic-gate
53*7c478bd9Sstevel@tonic-gate uint32_t i_number = 0;
54*7c478bd9Sstevel@tonic-gate uint32_t d_entry = 0;
55*7c478bd9Sstevel@tonic-gate int error_override = 0;
56*7c478bd9Sstevel@tonic-gate
57*7c478bd9Sstevel@tonic-gate int register_array[256];
58*7c478bd9Sstevel@tonic-gate char cwd[MAXPATHLEN] = "/";
59*7c478bd9Sstevel@tonic-gate
60*7c478bd9Sstevel@tonic-gate int32_t ls_flags;
61*7c478bd9Sstevel@tonic-gate #define LONG_LIST 0x1
62*7c478bd9Sstevel@tonic-gate #define RECU_LIST 0x2
63*7c478bd9Sstevel@tonic-gate #define LIST_LS 0x4
64*7c478bd9Sstevel@tonic-gate
65*7c478bd9Sstevel@tonic-gate int32_t find_flags;
66*7c478bd9Sstevel@tonic-gate #define FIND_DIR 0x1
67*7c478bd9Sstevel@tonic-gate #define FIND_NAME 0x2
68*7c478bd9Sstevel@tonic-gate #define FIND_INODE 0x4
69*7c478bd9Sstevel@tonic-gate #define FIND_DONE 0x8
70*7c478bd9Sstevel@tonic-gate char find_dir[1024];
71*7c478bd9Sstevel@tonic-gate char find_name[1024];
72*7c478bd9Sstevel@tonic-gate uint32_t find_in;
73*7c478bd9Sstevel@tonic-gate
74*7c478bd9Sstevel@tonic-gate %}
75*7c478bd9Sstevel@tonic-gate
76*7c478bd9Sstevel@tonic-gate %union
77*7c478bd9Sstevel@tonic-gate {
78*7c478bd9Sstevel@tonic-gate uint8_t *strval;
79*7c478bd9Sstevel@tonic-gate uint64_t intval;
80*7c478bd9Sstevel@tonic-gate };
81*7c478bd9Sstevel@tonic-gate
82*7c478bd9Sstevel@tonic-gate %token BASE BLOCK CD DIRECTORY TFILE FIND FILL
83*7c478bd9Sstevel@tonic-gate %token INODE LS OVERRIDE PROMPT PWD QUIT TAG BANG
84*7c478bd9Sstevel@tonic-gate
85*7c478bd9Sstevel@tonic-gate %token AVD MVDS RVDS INTS FSDS ROOT
86*7c478bd9Sstevel@tonic-gate %token ATTZ ATYE ATMO ATDA ATHO ATMI ATSE ATCE ATHU ATMIC
87*7c478bd9Sstevel@tonic-gate %token CTTZ CTYE CTMO CTDA CTHO CTMI CTSE CTCE CTHU CTMIC
88*7c478bd9Sstevel@tonic-gate %token MTTZ MTYE MTMO MTDA MTHO MTMI MTSE MTCE MTHU MTMIC
89*7c478bd9Sstevel@tonic-gate %token GID LN MD MAJ MIO NM SZ UID UNIQ
90*7c478bd9Sstevel@tonic-gate %token DOT
91*7c478bd9Sstevel@tonic-gate %token NL
92*7c478bd9Sstevel@tonic-gate
93*7c478bd9Sstevel@tonic-gate %token WORD
94*7c478bd9Sstevel@tonic-gate
95*7c478bd9Sstevel@tonic-gate %left '-' '+'
96*7c478bd9Sstevel@tonic-gate %left '*' '%'
97*7c478bd9Sstevel@tonic-gate
98*7c478bd9Sstevel@tonic-gate %type <strval> WORD
99*7c478bd9Sstevel@tonic-gate %type <intval> expr
100*7c478bd9Sstevel@tonic-gate
101*7c478bd9Sstevel@tonic-gate %%
102*7c478bd9Sstevel@tonic-gate
103*7c478bd9Sstevel@tonic-gate session : statement_list
104*7c478bd9Sstevel@tonic-gate
105*7c478bd9Sstevel@tonic-gate statement_list : /* empty */ { print_prompt(); }
106*7c478bd9Sstevel@tonic-gate | statement_list statement
107*7c478bd9Sstevel@tonic-gate {
108*7c478bd9Sstevel@tonic-gate ls_flags = 0;
109*7c478bd9Sstevel@tonic-gate }
110*7c478bd9Sstevel@tonic-gate ;
111*7c478bd9Sstevel@tonic-gate
112*7c478bd9Sstevel@tonic-gate statement : empty_statement
113*7c478bd9Sstevel@tonic-gate | current_value
114*7c478bd9Sstevel@tonic-gate | register
115*7c478bd9Sstevel@tonic-gate | base | block | cd | directory | file | find | fill
116*7c478bd9Sstevel@tonic-gate | inode | ls | override | nprompt | pwd | quit | tag | shell
117*7c478bd9Sstevel@tonic-gate | avd | mvds | rvds | ints | fsds | root
118*7c478bd9Sstevel@tonic-gate | at | ct | gid | ln | mt | md
119*7c478bd9Sstevel@tonic-gate | maj | min | nm | sz | uid | uniq
120*7c478bd9Sstevel@tonic-gate | dump | texpr
121*7c478bd9Sstevel@tonic-gate | error { yyclearin; yyerrok; }
122*7c478bd9Sstevel@tonic-gate ;
123*7c478bd9Sstevel@tonic-gate
124*7c478bd9Sstevel@tonic-gate empty_statement : NL
125*7c478bd9Sstevel@tonic-gate {
126*7c478bd9Sstevel@tonic-gate print_prompt();
127*7c478bd9Sstevel@tonic-gate }
128*7c478bd9Sstevel@tonic-gate ;
129*7c478bd9Sstevel@tonic-gate
130*7c478bd9Sstevel@tonic-gate
131*7c478bd9Sstevel@tonic-gate current_value : DOT
132*7c478bd9Sstevel@tonic-gate {
133*7c478bd9Sstevel@tonic-gate if (last_op_type == TYPE_INODE) {
134*7c478bd9Sstevel@tonic-gate print_inode(i_number << l2b);
135*7c478bd9Sstevel@tonic-gate } else if (last_op_type == TYPE_DIRENT) {
136*7c478bd9Sstevel@tonic-gate print_dent(i_number << l2b, d_entry);
137*7c478bd9Sstevel@tonic-gate } else {
138*7c478bd9Sstevel@tonic-gate fprintf(stdout,
139*7c478bd9Sstevel@tonic-gate gettext("%x\n"), value);
140*7c478bd9Sstevel@tonic-gate }
141*7c478bd9Sstevel@tonic-gate }
142*7c478bd9Sstevel@tonic-gate ;
143*7c478bd9Sstevel@tonic-gate
144*7c478bd9Sstevel@tonic-gate register : '<' WORD
145*7c478bd9Sstevel@tonic-gate {
146*7c478bd9Sstevel@tonic-gate if ((strlen((caddr_t)$2) == 1) &&
147*7c478bd9Sstevel@tonic-gate ((($2[0] >= 'a') &&
148*7c478bd9Sstevel@tonic-gate ($2[0] <= 'z')) ||
149*7c478bd9Sstevel@tonic-gate (($2[0] >= 'A') &&
150*7c478bd9Sstevel@tonic-gate ($2[0] <= 'Z')))) {
151*7c478bd9Sstevel@tonic-gate value = register_array[$2[0]];
152*7c478bd9Sstevel@tonic-gate } else {
153*7c478bd9Sstevel@tonic-gate fprintf(stdout,
154*7c478bd9Sstevel@tonic-gate gettext("Registers can"
155*7c478bd9Sstevel@tonic-gate " be only a-z or A-Z\n"));
156*7c478bd9Sstevel@tonic-gate }
157*7c478bd9Sstevel@tonic-gate }
158*7c478bd9Sstevel@tonic-gate | '>' WORD
159*7c478bd9Sstevel@tonic-gate {
160*7c478bd9Sstevel@tonic-gate if ((strlen((caddr_t)$2) == 1) &&
161*7c478bd9Sstevel@tonic-gate ((($2[0] >= 'a') &&
162*7c478bd9Sstevel@tonic-gate ($2[0] <= 'z')) ||
163*7c478bd9Sstevel@tonic-gate (($2[0] >= 'A') &&
164*7c478bd9Sstevel@tonic-gate ($2[0] <= 'Z')))) {
165*7c478bd9Sstevel@tonic-gate register_array[$2[0]] = value;
166*7c478bd9Sstevel@tonic-gate } else {
167*7c478bd9Sstevel@tonic-gate fprintf(stdout,
168*7c478bd9Sstevel@tonic-gate gettext("Registers can"
169*7c478bd9Sstevel@tonic-gate " be only a-z or A-Z\n"));
170*7c478bd9Sstevel@tonic-gate }
171*7c478bd9Sstevel@tonic-gate }
172*7c478bd9Sstevel@tonic-gate ;
173*7c478bd9Sstevel@tonic-gate
174*7c478bd9Sstevel@tonic-gate base : BASE '=' expr
175*7c478bd9Sstevel@tonic-gate {
176*7c478bd9Sstevel@tonic-gate if (($3 == 8) || ($3 == 10) || ($3 == 16)) {
177*7c478bd9Sstevel@tonic-gate base = $3;
178*7c478bd9Sstevel@tonic-gate } else {
179*7c478bd9Sstevel@tonic-gate fprintf(stdout,
180*7c478bd9Sstevel@tonic-gate gettext("Requested %x Only"
181*7c478bd9Sstevel@tonic-gate " Oct, Dec and"
182*7c478bd9Sstevel@tonic-gate " Hex are Supported\n"), $3);
183*7c478bd9Sstevel@tonic-gate }
184*7c478bd9Sstevel@tonic-gate }
185*7c478bd9Sstevel@tonic-gate | BASE
186*7c478bd9Sstevel@tonic-gate {
187*7c478bd9Sstevel@tonic-gate fprintf(stdout,
188*7c478bd9Sstevel@tonic-gate gettext("Current Base in Decimal"
189*7c478bd9Sstevel@tonic-gate " : %d\n"), base);
190*7c478bd9Sstevel@tonic-gate }
191*7c478bd9Sstevel@tonic-gate ;
192*7c478bd9Sstevel@tonic-gate
193*7c478bd9Sstevel@tonic-gate block : BLOCK
194*7c478bd9Sstevel@tonic-gate {
195*7c478bd9Sstevel@tonic-gate last_op_type = TYPE_NONE;
196*7c478bd9Sstevel@tonic-gate value = value * DEV_BSIZE;
197*7c478bd9Sstevel@tonic-gate }
198*7c478bd9Sstevel@tonic-gate ;
199*7c478bd9Sstevel@tonic-gate
200*7c478bd9Sstevel@tonic-gate cd : CD ' ' WORD
201*7c478bd9Sstevel@tonic-gate {
202*7c478bd9Sstevel@tonic-gate uint8_t fl;
203*7c478bd9Sstevel@tonic-gate uint32_t temp;
204*7c478bd9Sstevel@tonic-gate char temp_cwd[MAXPATHLEN];
205*7c478bd9Sstevel@tonic-gate
206*7c478bd9Sstevel@tonic-gate strcpy(temp_cwd, cwd);
207*7c478bd9Sstevel@tonic-gate if (strcmp((caddr_t)$3, "..") == 0) {
208*7c478bd9Sstevel@tonic-gate if (strlen(temp_cwd) == 1) {
209*7c478bd9Sstevel@tonic-gate if (temp_cwd[0] != '/') {
210*7c478bd9Sstevel@tonic-gate fprintf(stdout,
211*7c478bd9Sstevel@tonic-gate gettext("cwd is invalid"
212*7c478bd9Sstevel@tonic-gate "setting to /\n"));
213*7c478bd9Sstevel@tonic-gate strcpy(temp_cwd, "/");
214*7c478bd9Sstevel@tonic-gate }
215*7c478bd9Sstevel@tonic-gate } else {
216*7c478bd9Sstevel@tonic-gate dirname(temp_cwd);
217*7c478bd9Sstevel@tonic-gate }
218*7c478bd9Sstevel@tonic-gate } else {
219*7c478bd9Sstevel@tonic-gate int32_t len;
220*7c478bd9Sstevel@tonic-gate
221*7c478bd9Sstevel@tonic-gate len = strlen(temp_cwd);
222*7c478bd9Sstevel@tonic-gate if (temp_cwd[len - 1] != '/') {
223*7c478bd9Sstevel@tonic-gate temp_cwd[len] = '/';
224*7c478bd9Sstevel@tonic-gate temp_cwd[len + 1] = '\0';
225*7c478bd9Sstevel@tonic-gate }
226*7c478bd9Sstevel@tonic-gate strcat(temp_cwd, (caddr_t)$3);
227*7c478bd9Sstevel@tonic-gate }
228*7c478bd9Sstevel@tonic-gate if (inode_from_path(temp_cwd, &temp,
229*7c478bd9Sstevel@tonic-gate &fl) != 0) {
230*7c478bd9Sstevel@tonic-gate fprintf(stdout,
231*7c478bd9Sstevel@tonic-gate gettext("Could not locate inode"
232*7c478bd9Sstevel@tonic-gate " for path %s\n"), temp_cwd);
233*7c478bd9Sstevel@tonic-gate strcpy(temp_cwd, "/");
234*7c478bd9Sstevel@tonic-gate if ((temp = ud_xlate_to_daddr(ricb_prn,
235*7c478bd9Sstevel@tonic-gate ricb_loc)) == 0) {
236*7c478bd9Sstevel@tonic-gate fprintf(stdout,
237*7c478bd9Sstevel@tonic-gate gettext("Failed to translate"
238*7c478bd9Sstevel@tonic-gate " prn %x loc %x\n"),
239*7c478bd9Sstevel@tonic-gate ricb_prn, ricb_loc);
240*7c478bd9Sstevel@tonic-gate }
241*7c478bd9Sstevel@tonic-gate } else {
242*7c478bd9Sstevel@tonic-gate if ((fl & FID_DIR) == 0) {
243*7c478bd9Sstevel@tonic-gate fprintf(stdout,
244*7c478bd9Sstevel@tonic-gate gettext("%s is not a"
245*7c478bd9Sstevel@tonic-gate " directory\n"), temp_cwd);
246*7c478bd9Sstevel@tonic-gate } else {
247*7c478bd9Sstevel@tonic-gate strcpy(cwd, temp_cwd);
248*7c478bd9Sstevel@tonic-gate value = temp << l2b;
249*7c478bd9Sstevel@tonic-gate last_op_type = TYPE_CD;
250*7c478bd9Sstevel@tonic-gate i_number = temp;
251*7c478bd9Sstevel@tonic-gate }
252*7c478bd9Sstevel@tonic-gate }
253*7c478bd9Sstevel@tonic-gate }
254*7c478bd9Sstevel@tonic-gate | CD
255*7c478bd9Sstevel@tonic-gate {
256*7c478bd9Sstevel@tonic-gate uint32_t block;
257*7c478bd9Sstevel@tonic-gate
258*7c478bd9Sstevel@tonic-gate (void) strcpy(cwd, "/");
259*7c478bd9Sstevel@tonic-gate /*
260*7c478bd9Sstevel@tonic-gate * set current value to root icb
261*7c478bd9Sstevel@tonic-gate */
262*7c478bd9Sstevel@tonic-gate if ((block = ud_xlate_to_daddr(ricb_prn,
263*7c478bd9Sstevel@tonic-gate ricb_loc)) == 0) {
264*7c478bd9Sstevel@tonic-gate fprintf(stdout,
265*7c478bd9Sstevel@tonic-gate gettext("Failed to translate "
266*7c478bd9Sstevel@tonic-gate "prn %x loc %x\n"),
267*7c478bd9Sstevel@tonic-gate ricb_prn, ricb_loc);
268*7c478bd9Sstevel@tonic-gate } else {
269*7c478bd9Sstevel@tonic-gate value = block << l2b;
270*7c478bd9Sstevel@tonic-gate last_op_type = TYPE_CD;
271*7c478bd9Sstevel@tonic-gate i_number = block;
272*7c478bd9Sstevel@tonic-gate }
273*7c478bd9Sstevel@tonic-gate }
274*7c478bd9Sstevel@tonic-gate ;
275*7c478bd9Sstevel@tonic-gate
276*7c478bd9Sstevel@tonic-gate directory : DIRECTORY
277*7c478bd9Sstevel@tonic-gate {
278*7c478bd9Sstevel@tonic-gate if (verify_dent(i_number << l2b, value) == 0) {
279*7c478bd9Sstevel@tonic-gate last_op_type = TYPE_DIRENT;
280*7c478bd9Sstevel@tonic-gate d_entry = value;
281*7c478bd9Sstevel@tonic-gate }
282*7c478bd9Sstevel@tonic-gate }
283*7c478bd9Sstevel@tonic-gate ;
284*7c478bd9Sstevel@tonic-gate
285*7c478bd9Sstevel@tonic-gate file : TFILE
286*7c478bd9Sstevel@tonic-gate {
287*7c478bd9Sstevel@tonic-gate }
288*7c478bd9Sstevel@tonic-gate ;
289*7c478bd9Sstevel@tonic-gate
290*7c478bd9Sstevel@tonic-gate find : xfind
291*7c478bd9Sstevel@tonic-gate {
292*7c478bd9Sstevel@tonic-gate if ((find_flags & (FIND_NAME | FIND_INODE)) &&
293*7c478bd9Sstevel@tonic-gate (find_flags & FIND_DONE)) {
294*7c478bd9Sstevel@tonic-gate if (find_dir[0] != '/') {
295*7c478bd9Sstevel@tonic-gate char buf[1024];
296*7c478bd9Sstevel@tonic-gate
297*7c478bd9Sstevel@tonic-gate strcpy(buf, find_dir);
298*7c478bd9Sstevel@tonic-gate if ((strlen(cwd) == 1) &&
299*7c478bd9Sstevel@tonic-gate (cwd[0] == '/')) {
300*7c478bd9Sstevel@tonic-gate strcpy(find_dir, "/");
301*7c478bd9Sstevel@tonic-gate } else {
302*7c478bd9Sstevel@tonic-gate strcpy(find_dir, cwd);
303*7c478bd9Sstevel@tonic-gate strcat(find_dir, "/");
304*7c478bd9Sstevel@tonic-gate }
305*7c478bd9Sstevel@tonic-gate strcat(find_dir, buf);
306*7c478bd9Sstevel@tonic-gate }
307*7c478bd9Sstevel@tonic-gate find_it(find_dir, find_name, find_in,
308*7c478bd9Sstevel@tonic-gate (find_flags & (FIND_NAME | FIND_INODE)));
309*7c478bd9Sstevel@tonic-gate }
310*7c478bd9Sstevel@tonic-gate find_flags = 0;
311*7c478bd9Sstevel@tonic-gate find_dir[0] = '\0';
312*7c478bd9Sstevel@tonic-gate find_name[0] = '\0';
313*7c478bd9Sstevel@tonic-gate find_in = 0;
314*7c478bd9Sstevel@tonic-gate }
315*7c478bd9Sstevel@tonic-gate ;
316*7c478bd9Sstevel@tonic-gate
317*7c478bd9Sstevel@tonic-gate xfind : FIND WORD
318*7c478bd9Sstevel@tonic-gate {
319*7c478bd9Sstevel@tonic-gate strcpy(find_dir, (char *)$2);
320*7c478bd9Sstevel@tonic-gate find_flags = FIND_DIR;
321*7c478bd9Sstevel@tonic-gate }
322*7c478bd9Sstevel@tonic-gate | xfind ' ' WORD
323*7c478bd9Sstevel@tonic-gate {
324*7c478bd9Sstevel@tonic-gate if (find_flags == FIND_DIR) {
325*7c478bd9Sstevel@tonic-gate if (strcmp((char *)$3, "-name") == 0) {
326*7c478bd9Sstevel@tonic-gate find_flags = FIND_NAME;
327*7c478bd9Sstevel@tonic-gate } else if (strcmp((char *)$3, "-inum")
328*7c478bd9Sstevel@tonic-gate == 0) {
329*7c478bd9Sstevel@tonic-gate find_flags = FIND_INODE;
330*7c478bd9Sstevel@tonic-gate } else {
331*7c478bd9Sstevel@tonic-gate fprintf(stdout,
332*7c478bd9Sstevel@tonic-gate gettext("find dir-name {-name n | -inum n}\n"));
333*7c478bd9Sstevel@tonic-gate }
334*7c478bd9Sstevel@tonic-gate } else if (find_flags == FIND_NAME) {
335*7c478bd9Sstevel@tonic-gate strcpy(find_name, (char *)$3);
336*7c478bd9Sstevel@tonic-gate find_flags |= FIND_DONE;
337*7c478bd9Sstevel@tonic-gate } else if (find_flags == FIND_INODE) {
338*7c478bd9Sstevel@tonic-gate uint64_t temp;
339*7c478bd9Sstevel@tonic-gate
340*7c478bd9Sstevel@tonic-gate if (check_and_get_int($3, &temp) ==
341*7c478bd9Sstevel@tonic-gate 0) {
342*7c478bd9Sstevel@tonic-gate find_in = temp;
343*7c478bd9Sstevel@tonic-gate find_flags |= FIND_DONE;
344*7c478bd9Sstevel@tonic-gate } else {
345*7c478bd9Sstevel@tonic-gate fprintf(stdout,
346*7c478bd9Sstevel@tonic-gate gettext("find dir-name {-name n | -inum n}\n"));
347*7c478bd9Sstevel@tonic-gate }
348*7c478bd9Sstevel@tonic-gate } else {
349*7c478bd9Sstevel@tonic-gate fprintf(stdout,
350*7c478bd9Sstevel@tonic-gate gettext("find dir-name {-name n | -inum n}\n"));
351*7c478bd9Sstevel@tonic-gate }
352*7c478bd9Sstevel@tonic-gate }
353*7c478bd9Sstevel@tonic-gate | xfind ' ' expr
354*7c478bd9Sstevel@tonic-gate {
355*7c478bd9Sstevel@tonic-gate if (find_flags == FIND_INODE) {
356*7c478bd9Sstevel@tonic-gate find_in = $3;
357*7c478bd9Sstevel@tonic-gate find_flags |= FIND_DONE;
358*7c478bd9Sstevel@tonic-gate } else {
359*7c478bd9Sstevel@tonic-gate fprintf(stdout,
360*7c478bd9Sstevel@tonic-gate gettext("find dir-name {-name n | -inum n}\n"));
361*7c478bd9Sstevel@tonic-gate }
362*7c478bd9Sstevel@tonic-gate }
363*7c478bd9Sstevel@tonic-gate ;
364*7c478bd9Sstevel@tonic-gate
365*7c478bd9Sstevel@tonic-gate
366*7c478bd9Sstevel@tonic-gate fill : FILL '=' WORD
367*7c478bd9Sstevel@tonic-gate {
368*7c478bd9Sstevel@tonic-gate fill_pattern(value, count, $3);
369*7c478bd9Sstevel@tonic-gate }
370*7c478bd9Sstevel@tonic-gate ;
371*7c478bd9Sstevel@tonic-gate
372*7c478bd9Sstevel@tonic-gate inode : INODE
373*7c478bd9Sstevel@tonic-gate {
374*7c478bd9Sstevel@tonic-gate uint32_t temp;
375*7c478bd9Sstevel@tonic-gate
376*7c478bd9Sstevel@tonic-gate if (last_op_type == TYPE_CD) {
377*7c478bd9Sstevel@tonic-gate temp = value;
378*7c478bd9Sstevel@tonic-gate } else {
379*7c478bd9Sstevel@tonic-gate temp = value << l2b;
380*7c478bd9Sstevel@tonic-gate }
381*7c478bd9Sstevel@tonic-gate last_op_type = TYPE_INODE;
382*7c478bd9Sstevel@tonic-gate if (verify_inode(temp, 0) != 0) {
383*7c478bd9Sstevel@tonic-gate i_number = temp >> l2b;
384*7c478bd9Sstevel@tonic-gate d_entry = 0;
385*7c478bd9Sstevel@tonic-gate }
386*7c478bd9Sstevel@tonic-gate }
387*7c478bd9Sstevel@tonic-gate ;
388*7c478bd9Sstevel@tonic-gate
389*7c478bd9Sstevel@tonic-gate ls : xls
390*7c478bd9Sstevel@tonic-gate {
391*7c478bd9Sstevel@tonic-gate if (ls_flags & LIST_LS) {
392*7c478bd9Sstevel@tonic-gate list(".", i_number, ls_flags);
393*7c478bd9Sstevel@tonic-gate }
394*7c478bd9Sstevel@tonic-gate }
395*7c478bd9Sstevel@tonic-gate ;
396*7c478bd9Sstevel@tonic-gate
397*7c478bd9Sstevel@tonic-gate xls : LS
398*7c478bd9Sstevel@tonic-gate {
399*7c478bd9Sstevel@tonic-gate /* Do nothing */
400*7c478bd9Sstevel@tonic-gate ls_flags = LIST_LS;
401*7c478bd9Sstevel@tonic-gate }
402*7c478bd9Sstevel@tonic-gate | xls ' ' WORD
403*7c478bd9Sstevel@tonic-gate {
404*7c478bd9Sstevel@tonic-gate if (strcmp((caddr_t)$3, "-l") == 0) {
405*7c478bd9Sstevel@tonic-gate ls_flags |= LONG_LIST;
406*7c478bd9Sstevel@tonic-gate } else if (strcmp((caddr_t)$3, "-R") == 0) {
407*7c478bd9Sstevel@tonic-gate ls_flags |= RECU_LIST;
408*7c478bd9Sstevel@tonic-gate } else if ((strcmp((caddr_t)$3, "-lR") == 0) ||
409*7c478bd9Sstevel@tonic-gate (strcmp((caddr_t)$3, "-Rl") == 0)) {
410*7c478bd9Sstevel@tonic-gate ls_flags |= LONG_LIST | RECU_LIST;
411*7c478bd9Sstevel@tonic-gate } else {
412*7c478bd9Sstevel@tonic-gate list(".", i_number, ls_flags);
413*7c478bd9Sstevel@tonic-gate ls_flags &= ~LIST_LS;
414*7c478bd9Sstevel@tonic-gate }
415*7c478bd9Sstevel@tonic-gate }
416*7c478bd9Sstevel@tonic-gate ;
417*7c478bd9Sstevel@tonic-gate
418*7c478bd9Sstevel@tonic-gate override : OVERRIDE
419*7c478bd9Sstevel@tonic-gate {
420*7c478bd9Sstevel@tonic-gate if (error_override == 0) {
421*7c478bd9Sstevel@tonic-gate error_override = 1;
422*7c478bd9Sstevel@tonic-gate (void) fprintf(stdout,
423*7c478bd9Sstevel@tonic-gate gettext("error checking on\n"));
424*7c478bd9Sstevel@tonic-gate } else {
425*7c478bd9Sstevel@tonic-gate error_override = 0;
426*7c478bd9Sstevel@tonic-gate (void) fprintf(stdout,
427*7c478bd9Sstevel@tonic-gate gettext("error checking off\n"));
428*7c478bd9Sstevel@tonic-gate }
429*7c478bd9Sstevel@tonic-gate }
430*7c478bd9Sstevel@tonic-gate ;
431*7c478bd9Sstevel@tonic-gate
432*7c478bd9Sstevel@tonic-gate nprompt : PROMPT '=' WORD
433*7c478bd9Sstevel@tonic-gate {
434*7c478bd9Sstevel@tonic-gate (void) strcpy(prompt, (caddr_t)$3);
435*7c478bd9Sstevel@tonic-gate }
436*7c478bd9Sstevel@tonic-gate ;
437*7c478bd9Sstevel@tonic-gate
438*7c478bd9Sstevel@tonic-gate pwd : PWD
439*7c478bd9Sstevel@tonic-gate {
440*7c478bd9Sstevel@tonic-gate fprintf(stdout, gettext("%s\n"), cwd);
441*7c478bd9Sstevel@tonic-gate }
442*7c478bd9Sstevel@tonic-gate ;
443*7c478bd9Sstevel@tonic-gate
444*7c478bd9Sstevel@tonic-gate quit : QUIT
445*7c478bd9Sstevel@tonic-gate {
446*7c478bd9Sstevel@tonic-gate exit (0);
447*7c478bd9Sstevel@tonic-gate }
448*7c478bd9Sstevel@tonic-gate ;
449*7c478bd9Sstevel@tonic-gate
450*7c478bd9Sstevel@tonic-gate tag : TAG
451*7c478bd9Sstevel@tonic-gate {
452*7c478bd9Sstevel@tonic-gate print_desc(value, 0);
453*7c478bd9Sstevel@tonic-gate }
454*7c478bd9Sstevel@tonic-gate ;
455*7c478bd9Sstevel@tonic-gate
456*7c478bd9Sstevel@tonic-gate shell : BANG
457*7c478bd9Sstevel@tonic-gate {
458*7c478bd9Sstevel@tonic-gate system(shell_name);
459*7c478bd9Sstevel@tonic-gate }
460*7c478bd9Sstevel@tonic-gate ;
461*7c478bd9Sstevel@tonic-gate
462*7c478bd9Sstevel@tonic-gate avd : AVD { print_desc(NULL, AVD); }
463*7c478bd9Sstevel@tonic-gate ;
464*7c478bd9Sstevel@tonic-gate mvds : MVDS { print_desc(NULL, MVDS); }
465*7c478bd9Sstevel@tonic-gate ;
466*7c478bd9Sstevel@tonic-gate rvds : RVDS { print_desc(NULL, RVDS); }
467*7c478bd9Sstevel@tonic-gate ;
468*7c478bd9Sstevel@tonic-gate ints : INTS { print_desc(NULL, INTS); }
469*7c478bd9Sstevel@tonic-gate ;
470*7c478bd9Sstevel@tonic-gate fsds : FSDS { print_desc(NULL, FSDS); }
471*7c478bd9Sstevel@tonic-gate ;
472*7c478bd9Sstevel@tonic-gate root : ROOT { print_desc(NULL, ROOT); }
473*7c478bd9Sstevel@tonic-gate ;
474*7c478bd9Sstevel@tonic-gate
475*7c478bd9Sstevel@tonic-gate at : ATTZ '=' expr { set_file(ATTZ, i_number << l2b, $3); }
476*7c478bd9Sstevel@tonic-gate | ATYE '=' expr { set_file(ATYE, i_number << l2b, $3); }
477*7c478bd9Sstevel@tonic-gate | ATMO '=' expr { set_file(ATMO, i_number << l2b, $3); }
478*7c478bd9Sstevel@tonic-gate | ATDA '=' expr { set_file(ATDA, i_number << l2b, $3); }
479*7c478bd9Sstevel@tonic-gate | ATHO '=' expr { set_file(ATHO, i_number << l2b, $3); }
480*7c478bd9Sstevel@tonic-gate | ATMI '=' expr { set_file(ATMI, i_number << l2b, $3); }
481*7c478bd9Sstevel@tonic-gate | ATSE '=' expr { set_file(ATSE, i_number << l2b, $3); }
482*7c478bd9Sstevel@tonic-gate | ATCE '=' expr { set_file(ATCE, i_number << l2b, $3); }
483*7c478bd9Sstevel@tonic-gate | ATHU '=' expr { set_file(ATHU, i_number << l2b, $3); }
484*7c478bd9Sstevel@tonic-gate | ATMIC '=' expr
485*7c478bd9Sstevel@tonic-gate {
486*7c478bd9Sstevel@tonic-gate set_file(ATMIC, i_number << l2b, $3);
487*7c478bd9Sstevel@tonic-gate }
488*7c478bd9Sstevel@tonic-gate ;
489*7c478bd9Sstevel@tonic-gate
490*7c478bd9Sstevel@tonic-gate ct : CTTZ '=' expr { set_file(CTTZ, i_number << l2b, $3); }
491*7c478bd9Sstevel@tonic-gate | CTYE '=' expr { set_file(CTYE, i_number << l2b, $3); }
492*7c478bd9Sstevel@tonic-gate | CTMO '=' expr { set_file(CTMO, i_number << l2b, $3); }
493*7c478bd9Sstevel@tonic-gate | CTDA '=' expr { set_file(CTDA, i_number << l2b, $3); }
494*7c478bd9Sstevel@tonic-gate | CTHO '=' expr { set_file(CTHO, i_number << l2b, $3); }
495*7c478bd9Sstevel@tonic-gate | CTMI '=' expr { set_file(CTMI, i_number << l2b, $3); }
496*7c478bd9Sstevel@tonic-gate | CTSE '=' expr { set_file(CTSE, i_number << l2b, $3); }
497*7c478bd9Sstevel@tonic-gate | CTCE '=' expr { set_file(CTCE, i_number << l2b, $3); }
498*7c478bd9Sstevel@tonic-gate | CTHU '=' expr { set_file(CTHU, i_number << l2b, $3); }
499*7c478bd9Sstevel@tonic-gate | CTMIC '=' expr
500*7c478bd9Sstevel@tonic-gate {
501*7c478bd9Sstevel@tonic-gate set_file(CTMIC, i_number << l2b, $3);
502*7c478bd9Sstevel@tonic-gate }
503*7c478bd9Sstevel@tonic-gate ;
504*7c478bd9Sstevel@tonic-gate
505*7c478bd9Sstevel@tonic-gate mt : MTTZ '=' expr { set_file(MTTZ, i_number << l2b, $3); }
506*7c478bd9Sstevel@tonic-gate | MTYE '=' expr { set_file(MTYE, i_number << l2b, $3); }
507*7c478bd9Sstevel@tonic-gate | MTMO '=' expr { set_file(MTMO, i_number << l2b, $3); }
508*7c478bd9Sstevel@tonic-gate | MTDA '=' expr { set_file(MTDA, i_number << l2b, $3); }
509*7c478bd9Sstevel@tonic-gate | MTHO '=' expr { set_file(MTHO, i_number << l2b, $3); }
510*7c478bd9Sstevel@tonic-gate | MTMI '=' expr { set_file(MTMI, i_number << l2b, $3); }
511*7c478bd9Sstevel@tonic-gate | MTSE '=' expr { set_file(MTSE, i_number << l2b, $3); }
512*7c478bd9Sstevel@tonic-gate | MTCE '=' expr { set_file(MTCE, i_number << l2b, $3); }
513*7c478bd9Sstevel@tonic-gate | MTHU '=' expr { set_file(MTHU, i_number << l2b, $3); }
514*7c478bd9Sstevel@tonic-gate | MTMIC '=' expr
515*7c478bd9Sstevel@tonic-gate {
516*7c478bd9Sstevel@tonic-gate set_file(MTMIC, i_number << l2b, $3);
517*7c478bd9Sstevel@tonic-gate }
518*7c478bd9Sstevel@tonic-gate ;
519*7c478bd9Sstevel@tonic-gate
520*7c478bd9Sstevel@tonic-gate
521*7c478bd9Sstevel@tonic-gate gid : GID '=' expr { set_file(GID, i_number << l2b, $3); }
522*7c478bd9Sstevel@tonic-gate ;
523*7c478bd9Sstevel@tonic-gate
524*7c478bd9Sstevel@tonic-gate ln : LN '=' expr { set_file(LN, i_number << l2b, $3); }
525*7c478bd9Sstevel@tonic-gate ;
526*7c478bd9Sstevel@tonic-gate
527*7c478bd9Sstevel@tonic-gate md : MD '=' expr { set_file(MD, i_number << l2b, $3); }
528*7c478bd9Sstevel@tonic-gate ;
529*7c478bd9Sstevel@tonic-gate
530*7c478bd9Sstevel@tonic-gate maj : MAJ '=' expr { set_file(MAJ, i_number << l2b, $3); }
531*7c478bd9Sstevel@tonic-gate ;
532*7c478bd9Sstevel@tonic-gate
533*7c478bd9Sstevel@tonic-gate min : MIO '=' expr { set_file(MIO, i_number << l2b, $3); }
534*7c478bd9Sstevel@tonic-gate ;
535*7c478bd9Sstevel@tonic-gate
536*7c478bd9Sstevel@tonic-gate nm : NM '=' expr { set_file(NM, i_number << l2b, $3); }
537*7c478bd9Sstevel@tonic-gate ;
538*7c478bd9Sstevel@tonic-gate
539*7c478bd9Sstevel@tonic-gate sz : SZ '=' expr { set_file(SZ, i_number << l2b, $3); }
540*7c478bd9Sstevel@tonic-gate ;
541*7c478bd9Sstevel@tonic-gate
542*7c478bd9Sstevel@tonic-gate uid : UID '=' expr { set_file(UID, i_number << l2b, $3); }
543*7c478bd9Sstevel@tonic-gate ;
544*7c478bd9Sstevel@tonic-gate
545*7c478bd9Sstevel@tonic-gate uniq : UNIQ '=' expr { set_file(UNIQ, i_number << l2b, $3); }
546*7c478bd9Sstevel@tonic-gate ;
547*7c478bd9Sstevel@tonic-gate
548*7c478bd9Sstevel@tonic-gate dump : '/' WORD
549*7c478bd9Sstevel@tonic-gate {
550*7c478bd9Sstevel@tonic-gate if (strlen((char *)$2) != 1) {
551*7c478bd9Sstevel@tonic-gate fprintf(stdout,
552*7c478bd9Sstevel@tonic-gate gettext("Invalid command\n"));
553*7c478bd9Sstevel@tonic-gate } else {
554*7c478bd9Sstevel@tonic-gate dump_disk(value, count, $2);
555*7c478bd9Sstevel@tonic-gate }
556*7c478bd9Sstevel@tonic-gate }
557*7c478bd9Sstevel@tonic-gate | '?' WORD
558*7c478bd9Sstevel@tonic-gate {
559*7c478bd9Sstevel@tonic-gate if (strcmp((char *)$2, "i") == 0) {
560*7c478bd9Sstevel@tonic-gate if (verify_inode(value << l2b,
561*7c478bd9Sstevel@tonic-gate 0) != 0) {
562*7c478bd9Sstevel@tonic-gate print_inode(value << l2b);
563*7c478bd9Sstevel@tonic-gate i_number = value;
564*7c478bd9Sstevel@tonic-gate last_op_type == TYPE_INODE;
565*7c478bd9Sstevel@tonic-gate }
566*7c478bd9Sstevel@tonic-gate } else if (strcmp((char *)$2, "d") == 0) {
567*7c478bd9Sstevel@tonic-gate if (verify_dent(i_number << l2b,
568*7c478bd9Sstevel@tonic-gate value) == 0) {
569*7c478bd9Sstevel@tonic-gate print_dent(i_number << l2b,
570*7c478bd9Sstevel@tonic-gate value);
571*7c478bd9Sstevel@tonic-gate d_entry = value;
572*7c478bd9Sstevel@tonic-gate last_op_type == TYPE_DIRENT;
573*7c478bd9Sstevel@tonic-gate }
574*7c478bd9Sstevel@tonic-gate } else {
575*7c478bd9Sstevel@tonic-gate fprintf(stdout,
576*7c478bd9Sstevel@tonic-gate gettext("Invalid command\n"));
577*7c478bd9Sstevel@tonic-gate }
578*7c478bd9Sstevel@tonic-gate }
579*7c478bd9Sstevel@tonic-gate ;
580*7c478bd9Sstevel@tonic-gate
581*7c478bd9Sstevel@tonic-gate texpr : expr
582*7c478bd9Sstevel@tonic-gate {
583*7c478bd9Sstevel@tonic-gate value = $1;
584*7c478bd9Sstevel@tonic-gate count = 0;
585*7c478bd9Sstevel@tonic-gate }
586*7c478bd9Sstevel@tonic-gate | expr ',' expr
587*7c478bd9Sstevel@tonic-gate {
588*7c478bd9Sstevel@tonic-gate value = $1;
589*7c478bd9Sstevel@tonic-gate count = $3;
590*7c478bd9Sstevel@tonic-gate }
591*7c478bd9Sstevel@tonic-gate ;
592*7c478bd9Sstevel@tonic-gate
593*7c478bd9Sstevel@tonic-gate expr : '+'
594*7c478bd9Sstevel@tonic-gate {
595*7c478bd9Sstevel@tonic-gate if (last_op_type == TYPE_INODE) {
596*7c478bd9Sstevel@tonic-gate if (verify_inode((i_number + 1) << l2b,
597*7c478bd9Sstevel@tonic-gate 0) != 0) {
598*7c478bd9Sstevel@tonic-gate i_number ++;
599*7c478bd9Sstevel@tonic-gate print_inode(i_number << l2b);
600*7c478bd9Sstevel@tonic-gate $$ = i_number << l2b;
601*7c478bd9Sstevel@tonic-gate }
602*7c478bd9Sstevel@tonic-gate } else if (last_op_type == TYPE_DIRENT) {
603*7c478bd9Sstevel@tonic-gate if (verify_dent(i_number << l2b,
604*7c478bd9Sstevel@tonic-gate d_entry + 1) == 0) {
605*7c478bd9Sstevel@tonic-gate d_entry ++;
606*7c478bd9Sstevel@tonic-gate print_dent(i_number << l2b,
607*7c478bd9Sstevel@tonic-gate d_entry);
608*7c478bd9Sstevel@tonic-gate }
609*7c478bd9Sstevel@tonic-gate } else {
610*7c478bd9Sstevel@tonic-gate count = 0; $$ = value++;
611*7c478bd9Sstevel@tonic-gate }
612*7c478bd9Sstevel@tonic-gate }
613*7c478bd9Sstevel@tonic-gate | '-'
614*7c478bd9Sstevel@tonic-gate {
615*7c478bd9Sstevel@tonic-gate if (last_op_type == TYPE_INODE) {
616*7c478bd9Sstevel@tonic-gate if (verify_inode((i_number - 1) << l2b,
617*7c478bd9Sstevel@tonic-gate 0) != 0) {
618*7c478bd9Sstevel@tonic-gate i_number --;
619*7c478bd9Sstevel@tonic-gate print_inode(i_number << l2b);
620*7c478bd9Sstevel@tonic-gate $$ = i_number << l2b;
621*7c478bd9Sstevel@tonic-gate }
622*7c478bd9Sstevel@tonic-gate } else if (last_op_type == TYPE_DIRENT) {
623*7c478bd9Sstevel@tonic-gate if (verify_dent(i_number << l2b,
624*7c478bd9Sstevel@tonic-gate d_entry - 1) == 0) {
625*7c478bd9Sstevel@tonic-gate d_entry --;
626*7c478bd9Sstevel@tonic-gate print_dent(i_number << l2b,
627*7c478bd9Sstevel@tonic-gate d_entry);
628*7c478bd9Sstevel@tonic-gate }
629*7c478bd9Sstevel@tonic-gate } else {
630*7c478bd9Sstevel@tonic-gate count = 0; $$ = value--;
631*7c478bd9Sstevel@tonic-gate }
632*7c478bd9Sstevel@tonic-gate }
633*7c478bd9Sstevel@tonic-gate | '-' WORD
634*7c478bd9Sstevel@tonic-gate {
635*7c478bd9Sstevel@tonic-gate uint64_t number;
636*7c478bd9Sstevel@tonic-gate
637*7c478bd9Sstevel@tonic-gate if (check_and_get_int($2, &number) == 0) {
638*7c478bd9Sstevel@tonic-gate count = 0;
639*7c478bd9Sstevel@tonic-gate $$ = value - number;
640*7c478bd9Sstevel@tonic-gate }
641*7c478bd9Sstevel@tonic-gate }
642*7c478bd9Sstevel@tonic-gate | '+' WORD
643*7c478bd9Sstevel@tonic-gate {
644*7c478bd9Sstevel@tonic-gate uint64_t number;
645*7c478bd9Sstevel@tonic-gate
646*7c478bd9Sstevel@tonic-gate if (check_and_get_int($2, &number) == 0) {
647*7c478bd9Sstevel@tonic-gate count = 0;
648*7c478bd9Sstevel@tonic-gate $$ = value + number;
649*7c478bd9Sstevel@tonic-gate }
650*7c478bd9Sstevel@tonic-gate }
651*7c478bd9Sstevel@tonic-gate | '*' WORD
652*7c478bd9Sstevel@tonic-gate {
653*7c478bd9Sstevel@tonic-gate uint64_t number;
654*7c478bd9Sstevel@tonic-gate
655*7c478bd9Sstevel@tonic-gate if (check_and_get_int($2, &number) == 0) {
656*7c478bd9Sstevel@tonic-gate count = 0;
657*7c478bd9Sstevel@tonic-gate $$ = value * number;
658*7c478bd9Sstevel@tonic-gate }
659*7c478bd9Sstevel@tonic-gate }
660*7c478bd9Sstevel@tonic-gate | '%' WORD
661*7c478bd9Sstevel@tonic-gate {
662*7c478bd9Sstevel@tonic-gate uint64_t number;
663*7c478bd9Sstevel@tonic-gate
664*7c478bd9Sstevel@tonic-gate if (check_and_get_int($2, &number) == 0) {
665*7c478bd9Sstevel@tonic-gate if (number == 0) {
666*7c478bd9Sstevel@tonic-gate fprintf(stdout,
667*7c478bd9Sstevel@tonic-gate gettext("Divide by zero ?\n"));
668*7c478bd9Sstevel@tonic-gate } else {
669*7c478bd9Sstevel@tonic-gate count = 0;
670*7c478bd9Sstevel@tonic-gate $$ = value / number;
671*7c478bd9Sstevel@tonic-gate }
672*7c478bd9Sstevel@tonic-gate }
673*7c478bd9Sstevel@tonic-gate }
674*7c478bd9Sstevel@tonic-gate | expr '-' expr { count = 0; $$ = $1 - $3; }
675*7c478bd9Sstevel@tonic-gate | expr '+' expr { count = 0; $$ = $1 + $3; }
676*7c478bd9Sstevel@tonic-gate | expr '*' expr { count = 0; $$ = $1 * $3; }
677*7c478bd9Sstevel@tonic-gate | expr '%' expr
678*7c478bd9Sstevel@tonic-gate {
679*7c478bd9Sstevel@tonic-gate if ($3 == 0) {
680*7c478bd9Sstevel@tonic-gate fprintf(stdout,
681*7c478bd9Sstevel@tonic-gate gettext("Divide by zero ?\n"));
682*7c478bd9Sstevel@tonic-gate } else {
683*7c478bd9Sstevel@tonic-gate $$ = $1 / $3;
684*7c478bd9Sstevel@tonic-gate }
685*7c478bd9Sstevel@tonic-gate count = 0;
686*7c478bd9Sstevel@tonic-gate }
687*7c478bd9Sstevel@tonic-gate | WORD
688*7c478bd9Sstevel@tonic-gate {
689*7c478bd9Sstevel@tonic-gate uint64_t number;
690*7c478bd9Sstevel@tonic-gate
691*7c478bd9Sstevel@tonic-gate count = 0;
692*7c478bd9Sstevel@tonic-gate if (check_and_get_int($1, &number) == 0) {
693*7c478bd9Sstevel@tonic-gate $$ = number;
694*7c478bd9Sstevel@tonic-gate }
695*7c478bd9Sstevel@tonic-gate }
696*7c478bd9Sstevel@tonic-gate ;
697*7c478bd9Sstevel@tonic-gate
698*7c478bd9Sstevel@tonic-gate %%
699*7c478bd9Sstevel@tonic-gate
700*7c478bd9Sstevel@tonic-gate int32_t
701*7c478bd9Sstevel@tonic-gate check_and_get_int(uint8_t *str, uint64_t *value)
702*7c478bd9Sstevel@tonic-gate {
703*7c478bd9Sstevel@tonic-gate int32_t length, cbase, index, cvalue;
704*7c478bd9Sstevel@tonic-gate
705*7c478bd9Sstevel@tonic-gate *value = 0;
706*7c478bd9Sstevel@tonic-gate length = strlen((caddr_t)str);
707*7c478bd9Sstevel@tonic-gate /*
708*7c478bd9Sstevel@tonic-gate * Decide on what base to be used
709*7c478bd9Sstevel@tonic-gate * and strip off the base specifier
710*7c478bd9Sstevel@tonic-gate */
711*7c478bd9Sstevel@tonic-gate if ((str[0] == '0') && (str[1] == 'x')) {
712*7c478bd9Sstevel@tonic-gate cbase = 0x10;
713*7c478bd9Sstevel@tonic-gate index = 2;
714*7c478bd9Sstevel@tonic-gate } else if ((str[0] == '0') && (str[1] == 't')) {
715*7c478bd9Sstevel@tonic-gate cbase = 0xa;
716*7c478bd9Sstevel@tonic-gate index = 2;
717*7c478bd9Sstevel@tonic-gate } else if (str[0] == '0') {
718*7c478bd9Sstevel@tonic-gate cbase = 0x8;
719*7c478bd9Sstevel@tonic-gate index = 1;
720*7c478bd9Sstevel@tonic-gate } else {
721*7c478bd9Sstevel@tonic-gate cbase = base;
722*7c478bd9Sstevel@tonic-gate index = 0;
723*7c478bd9Sstevel@tonic-gate }
724*7c478bd9Sstevel@tonic-gate
725*7c478bd9Sstevel@tonic-gate /*
726*7c478bd9Sstevel@tonic-gate * Verify if the string is integer
727*7c478bd9Sstevel@tonic-gate * and convert to a binary value
728*7c478bd9Sstevel@tonic-gate */
729*7c478bd9Sstevel@tonic-gate for ( ; index < length; index++) {
730*7c478bd9Sstevel@tonic-gate if (cbase == 0x8) {
731*7c478bd9Sstevel@tonic-gate if ((str[index] < '0') ||
732*7c478bd9Sstevel@tonic-gate (str[index] > '7')) {
733*7c478bd9Sstevel@tonic-gate fprintf(stdout,
734*7c478bd9Sstevel@tonic-gate gettext("Invalid Octal Number %s\n"),
735*7c478bd9Sstevel@tonic-gate str);
736*7c478bd9Sstevel@tonic-gate return (1);
737*7c478bd9Sstevel@tonic-gate }
738*7c478bd9Sstevel@tonic-gate cvalue = str[index] - '0';
739*7c478bd9Sstevel@tonic-gate } else if (cbase == 0xa) {
740*7c478bd9Sstevel@tonic-gate if ((str[index] < '0') ||
741*7c478bd9Sstevel@tonic-gate (str[index] > '9' )) {
742*7c478bd9Sstevel@tonic-gate fprintf(stdout,
743*7c478bd9Sstevel@tonic-gate gettext("Invalid Decimal Number %s\n"),
744*7c478bd9Sstevel@tonic-gate str);
745*7c478bd9Sstevel@tonic-gate return (1);
746*7c478bd9Sstevel@tonic-gate }
747*7c478bd9Sstevel@tonic-gate cvalue = str[index] - '0';
748*7c478bd9Sstevel@tonic-gate } else {
749*7c478bd9Sstevel@tonic-gate if ((str[index] >= '0') &&
750*7c478bd9Sstevel@tonic-gate (str[index] <= '9')) {
751*7c478bd9Sstevel@tonic-gate cvalue = str[index] - '0';
752*7c478bd9Sstevel@tonic-gate } else if ((str[index] >= 'a') &&
753*7c478bd9Sstevel@tonic-gate (str[index] <= 'f')) {
754*7c478bd9Sstevel@tonic-gate cvalue = str[index] - 'a' + 10;
755*7c478bd9Sstevel@tonic-gate } else if ((str[index] >= 'A') &&
756*7c478bd9Sstevel@tonic-gate (str[index] <= 'F')) {
757*7c478bd9Sstevel@tonic-gate cvalue = str[index] - 'A' + 10;
758*7c478bd9Sstevel@tonic-gate } else {
759*7c478bd9Sstevel@tonic-gate fprintf(stdout,
760*7c478bd9Sstevel@tonic-gate gettext("Invalid Hex Number %s\n"),
761*7c478bd9Sstevel@tonic-gate str);
762*7c478bd9Sstevel@tonic-gate return (1);
763*7c478bd9Sstevel@tonic-gate }
764*7c478bd9Sstevel@tonic-gate }
765*7c478bd9Sstevel@tonic-gate *value = *value * cbase + cvalue;
766*7c478bd9Sstevel@tonic-gate }
767*7c478bd9Sstevel@tonic-gate return (0);
768*7c478bd9Sstevel@tonic-gate }
769*7c478bd9Sstevel@tonic-gate
770*7c478bd9Sstevel@tonic-gate void print_prompt();
771*7c478bd9Sstevel@tonic-gate extern FILE *yyin;
772*7c478bd9Sstevel@tonic-gate
773*7c478bd9Sstevel@tonic-gate void
print_prompt()774*7c478bd9Sstevel@tonic-gate print_prompt()
775*7c478bd9Sstevel@tonic-gate {
776*7c478bd9Sstevel@tonic-gate fprintf(stdout, gettext("%s"), prompt);
777*7c478bd9Sstevel@tonic-gate }
778*7c478bd9Sstevel@tonic-gate
779*7c478bd9Sstevel@tonic-gate int32_t
run_fsdb()780*7c478bd9Sstevel@tonic-gate run_fsdb()
781*7c478bd9Sstevel@tonic-gate {
782*7c478bd9Sstevel@tonic-gate yyin = stdin;
783*7c478bd9Sstevel@tonic-gate if (yyparse() != 0)
784*7c478bd9Sstevel@tonic-gate return (-1);
785*7c478bd9Sstevel@tonic-gate return 0;
786*7c478bd9Sstevel@tonic-gate }
787