1 /* $NetBSD: parse.c,v 1.8 2016/11/25 17:37:04 tsutsui Exp $ */
2
3 /*
4 * Copyright (c) 1992 OMRON Corporation.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * OMRON Corporation.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 * must display the following acknowledgement:
19 * This product includes software developed by the University of
20 * California, Berkeley and its contributors.
21 * 4. Neither the name of the University nor the names of its contributors
22 * may be used to endorse or promote products derived from this software
23 * without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 * SUCH DAMAGE.
36 *
37 * @(#)parse.c 8.1 (Berkeley) 6/10/93
38 */
39 /*
40 * Copyright (c) 1992, 1993
41 * The Regents of the University of California. All rights reserved.
42 *
43 * This code is derived from software contributed to Berkeley by
44 * OMRON Corporation.
45 *
46 * Redistribution and use in source and binary forms, with or without
47 * modification, are permitted provided that the following conditions
48 * are met:
49 * 1. Redistributions of source code must retain the above copyright
50 * notice, this list of conditions and the following disclaimer.
51 * 2. Redistributions in binary form must reproduce the above copyright
52 * notice, this list of conditions and the following disclaimer in the
53 * documentation and/or other materials provided with the distribution.
54 * 3. Neither the name of the University nor the names of its contributors
55 * may be used to endorse or promote products derived from this software
56 * without specific prior written permission.
57 *
58 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
59 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
60 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
61 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
62 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
63 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
64 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
65 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
66 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
67 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
68 * SUCH DAMAGE.
69 *
70 * @(#)parse.c 8.1 (Berkeley) 6/10/93
71 */
72
73 /*
74 * parse.c -- command parser
75 * by A.Fujita, JAN-30-1992
76 */
77
78 #include <lib/libkern/libkern.h>
79 #include <luna68k/stand/boot/samachdep.h>
80 #include <luna68k/stand/boot/status.h>
81
82 static int cmd_help(int, char *[]);
83
84 int
check_args(int argc,char * argv[])85 check_args(int argc, char *argv[])
86 {
87 int i;
88
89 for (i = 0; i < argc; i++)
90 printf("argv[%d] = \"%s\"\n", i, argv[i]);
91
92 return ST_NORMAL;
93 }
94
95 int
exit_program(int argc,char * argv[])96 exit_program(int argc, char *argv[])
97 {
98
99 return ST_EXIT;
100 }
101
102 static const char helpmsg[] =
103 "commands are:\n"
104 "boot [device(unit,part)filename] [-ads]\n"
105 " (ex. \"boot sd(6,0)netbsd\", \"boot le()netbsd.old\" etc.)\n"
106 " Note unit number for SCSI device is (ctlr) * 10 + (id).\n"
107 "ls [device(unit, part)[path]]\n"
108 " (ex. \"ls sd(0,0)/bin\")\n"
109 "help\n"
110 "exit\n"
111 #if 0 /* debug commands */
112 "checkargs\n"
113 "disklabel\n"
114 "howto\n"
115 "screen\n"
116 "scsi\n"
117 #endif
118 ;
119
120 static int
cmd_help(int argc,char * argv[])121 cmd_help(int argc, char *argv[])
122 {
123
124 printf(helpmsg);
125 return ST_NORMAL;
126 }
127
128 struct command_entry {
129 char *name;
130 int (*func)(int, char **);
131 };
132
133 static const struct command_entry entries[] = {
134 { "b", boot },
135 { "boot", boot },
136 { "chkargs", check_args },
137 { "disklabel", disklabel },
138 { "exit", exit_program },
139 #ifdef notyet
140 { "fsdump", fsdump },
141 { "fsrestore", fsrestore },
142 #endif
143 { "help", cmd_help },
144 { "ls", cmd_ls },
145 { "screen", screen },
146 #ifdef notyet
147 { "tape", tape },
148 { "tp", tape },
149 #endif
150 { "scsi", scsi },
151 { "quit", exit_program },
152 { NULL, NULL }
153 };
154
155
156 int
parse(int argc,char * argv[])157 parse(int argc, char *argv[])
158 {
159 int i, status = ST_NOTFOUND;
160
161 for (i = 0; entries[i].name != NULL; i++) {
162 if (!strcmp(argv[0], entries[i].name)) {
163 status = (*entries[i].func)(argc, argv);
164 break;
165 }
166 }
167
168 return status;
169 }
170
171
172
173 /*
174 * getargs -- make argument arrays
175 */
176
177 int
getargs(char buffer[],char * argv[],int maxargs)178 getargs(char buffer[], char *argv[], int maxargs)
179 {
180 int n = 0;
181 char *p = buffer;
182
183 argv[n++] = p;
184 while (*p != '\0') {
185 if (*p == ' ') {
186 *p = '\0';
187 } else if (p != buffer && *(p - 1) == '\0') {
188 if (n < maxargs)
189 argv[n++] = p;
190 }
191 p++;
192 }
193
194 return n;
195 }
196