annotate packages/redboot/current/src/parse.c @ 2631:13376f3cfc60 jifl-post-flashv2-merge-20081118

Merge flashv2 branch to trunk, with eCosCentric additions
author jlarmour
date Tue, 18 Nov 2008 01:28:11 +0000
parents 6cbecf3cc2e4
children 74dbf4c3f2e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
2 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
3 // parse.c
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
4 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
5 // RedBoot command line parsing routine
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
6 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
12 // Copyright (C) 2004, 2005, 2006 eCosCentric Limited
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
13 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
15 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
17 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
21 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
22 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
23 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
26 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
28 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
29 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
31 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
33 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
35 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
36 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 198
diff changeset
37 //####ECOSGPLCOPYRIGHTEND####
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
38 //==========================================================================
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
39 //#####DESCRIPTIONBEGIN####
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
40 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
41 // Author(s): gthomas
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
42 // Contributors: gthomas, eCosCentric
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
43 // Date: 2000-07-14
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
44 // Purpose:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
45 // Description:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
46 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
47 // This code is part of RedBoot (tm).
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
48 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
49 //####DESCRIPTIONEND####
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
50 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
51 //==========================================================================
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
52
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
53 #include <redboot.h>
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
54 #include <cyg/hal/hal_arch.h>
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
55 #include <cyg/hal/hal_intr.h>
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
56 #include <cyg/hal/hal_cache.h>
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
57 #include CYGHWR_MEMORY_LAYOUT_H
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
58 #include <cyg/hal/hal_tables.h>
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
59
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
60 // Define table boundaries
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
61 extern struct cmd __RedBoot_CMD_TAB__[], __RedBoot_CMD_TAB_END__;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
62
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
63 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
64 // Scan through an input line and break it into "arguments". These
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
65 // are space delimited strings. Return a structure which points to
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
66 // the strings, similar to a Unix program. Multiple commands in the line
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
67 // are separated by ; similar to sh. If we find a semi we stop processing the
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
68 // line, terminate the current command with a null and return the start
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
69 // of the next command in *line. parse() can then be called again to
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
70 // process the next command on the line.
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
71 // Note: original input is destroyed by replacing the delimiters with
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
72 // null ('\0') characters for ease of use.
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
73 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
74 struct cmd *
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
75 parse(char **line, int *argc, char **argv)
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
76 {
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
77 char *cp = *line;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
78 char *pp;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
79 int indx = 0;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
80 int semi = 0;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
81
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
82 while (*cp) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
83 // Skip leading spaces
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
84 while (*cp && *cp == ' ') cp++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
85 if (!*cp) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
86 break; // Line ended with a string of spaces
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
87 }
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
88 if (*cp == ';') {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
89 *cp = '\0';
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
90 semi=1;
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
91 break;
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
92 }
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 143
diff changeset
93 if (indx < MAX_ARGV) {
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 143
diff changeset
94 argv[indx++] = cp;
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 143
diff changeset
95 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
96 diag_printf("Too many arguments - stopped at: '%s'\n", cp);
161
ac086aa3217e Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents: 143
diff changeset
97 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
98 while (*cp) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
99 if (*cp == ' ') {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
100 *cp++ = '\0';
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
101 break;
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
102 } else if (*cp == ';') {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
103 break;
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
104 } else if (*cp == '"') {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
105 // Swallow quote, scan till following one
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
106 if (argv[indx-1] == cp) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
107 argv[indx-1] = ++cp;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
108 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
109 pp = cp;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
110 while (*cp && *cp != '"') {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
111 if (*cp == '\\') {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
112 // Skip over escape - allows for escaped '"'
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
113 cp++;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
114 }
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
115 // Move string to swallow escapes
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
116 *pp++ = *cp++;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
117 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
118 if (!*cp) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
119 diag_printf("Unbalanced string!\n");
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
120 } else {
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
121 if (pp != cp) *pp = '\0';
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
122 *cp++ = '\0';
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
123 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
124 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
125 } else {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
126 cp++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
127 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
128 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
129 }
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
130 if (semi) {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
131 *line = cp + 1;
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
132 } else {
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
133 *line = cp;
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
134 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
135 *argc = indx;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
136 return cmd_search(__RedBoot_CMD_TAB__, &__RedBoot_CMD_TAB_END__, argv[0]);
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
137 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
138
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
139 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
140 // Search through a list of commands
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
141 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
142 struct cmd *
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
143 cmd_search(struct cmd *tab, struct cmd *tabend, char *arg)
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
144 {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
145 int cmd_len;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
146 struct cmd *cmd, *cmd2;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
147 // Search command table
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
148 cmd_len = strlen(arg);
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
149 cmd = tab;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
150 while (cmd != tabend) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
151 if (strncasecmp(arg, cmd->str, cmd_len) == 0) {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
152 if (strlen(cmd->str) > cmd_len) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
153 // Check for ambiguous commands here
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
154 // Note: If there are commands which are not length-unique
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
155 // then this check will be invalid. E.g. "du" and "dump"
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
156 bool first = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
157 cmd2 = tab;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
158 while (cmd2 != tabend) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
159 if ((cmd != cmd2) &&
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
160 (strncasecmp(arg, cmd2->str, cmd_len) == 0)) {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
161 if (first) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
162 diag_printf("Ambiguous command '%s', choices are: %s",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
163 arg, cmd->str);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
164 first = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
165 }
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
166 diag_printf(" %s", cmd2->str);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
167 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
168 cmd2++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
169 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
170 if (!first) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
171 // At least one ambiguity found - fail the lookup
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
172 diag_printf("\n");
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
173 return (struct cmd *)0;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
174 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
175 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
176 return cmd;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
177 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
178 cmd++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
179 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
180 return (struct cmd *)0;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
181 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
182
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
183 void
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
184 cmd_usage(struct cmd *tab, struct cmd *tabend, char *prefix)
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
185 {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
186 struct cmd *cmd;
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
187
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
188 diag_printf("Usage:\n");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
189 for (cmd = tab; cmd != tabend; cmd++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
190 diag_printf(" %s%s %s\n", prefix, cmd->str, cmd->usage);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
191 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
192 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
193
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
194 //
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
195 // Handle illegal memory accesses (and other abort conditions)
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
196 //
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
197 static hal_jmp_buf error_jmpbuf;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
198 static cyg_bool redboot_exec_call = false;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
199 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
200 __externC void* volatile __mem_fault_handler;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
201
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
202 static void error_handler(void)
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
203 {
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
204 hal_longjmp(error_jmpbuf, 1);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
205 }
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
206 #endif
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
207
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
208 // Routine to allow code to invoke RedBoot commands. This is useful
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
209 // during initialization and in platform specific code.
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
210 //
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
211 // Call it like this:
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
212 //
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
213 // result = redboot_exec( "load", "-m", "file", "foo", 0 );
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
214 //
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
215 // Note the terminating zero. The result will be zero if the command
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
216 // succeeded, and <0 if something went wrong.
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
217
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
218 #define ARGV_MAX 20
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
219 int redboot_exec( char *command, ... )
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
220 {
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
221 int argc;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
222 char *argv[ARGV_MAX+1];
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
223 va_list ap;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
224 struct cmd *cmd;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
225 int result = 0;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
226
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
227 va_start(ap, command);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
228
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
229 argv[0] = command;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
230 for( argc = 1; argc < ARGV_MAX; argc++ )
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
231 {
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
232 char *arg = va_arg(ap, char *);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
233 if( arg == 0 )
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
234 break;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
235 argv[argc] = arg;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
236 }
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
237 argv[argc] = NULL;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
238
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
239 if(( cmd = cmd_search(__RedBoot_CMD_TAB__, &__RedBoot_CMD_TAB_END__, command) ))
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
240 {
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
241 // Try to handle aborts - messy because of the stack unwinding...
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
242 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
243 __mem_fault_handler = error_handler;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
244 #endif
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
245 redboot_exec_call = true;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
246 if (hal_setjmp(error_jmpbuf))
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
247 result = -1;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
248 else
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
249 (cmd->fun)(argc, argv);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
250
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
251 redboot_exec_call = false;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
252 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
253 __mem_fault_handler = 0;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
254 #endif
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
255 }
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
256 else
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
257 result = -1;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
258
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
259 va_end(ap);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
260
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
261 return result;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
262 }
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
263
2614
6cbecf3cc2e4 * src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c,
jlarmour
parents: 2257
diff changeset
264 externC void err_printf( const char *fmt, ... )
2257
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
265 {
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
266 va_list ap;
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
267
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
268 va_start(ap, fmt);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
269
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
270 diag_vprintf( fmt, ap );
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
271
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
272 va_end(ap);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
273
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
274 // If we are not in redboot_exec() just return as usual. If we are
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
275 // inside a call to redboot_exec(), longjump out to terminate the command.
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
276
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
277 if( redboot_exec_call )
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
278 {
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
279 diag_printf("err_printf: aborting command\n");
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
280 hal_longjmp(error_jmpbuf, 1);
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
281 }
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
282 }
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
283
467fd46113f3 * src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents: 1259
diff changeset
284
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
285 // Option processing
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
286
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
287 // Initialize option table entry (required because these entries
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
288 // may have dynamic contents, thus cannot be statically initialized)
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
289 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
290 void
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
291 init_opts(struct option_info *opts, char flag, bool takes_arg,
1259
13ba50dd5a8e Some cleanups from David Vrable
gthomas
parents: 210
diff changeset
292 int arg_type, void *arg, bool *arg_set, char *name)
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
293 {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
294 opts->flag = flag;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
295 opts->takes_arg = takes_arg;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
296 opts->arg_type = arg_type,
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
297 opts->arg = arg;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
298 opts->arg_set = arg_set;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
299 opts->name = name;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
300 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
301
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
302 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
303 // Scan command line arguments (argc/argv), processing options, etc.
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
304 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
305 bool
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
306 scan_opts(int argc, char *argv[], int first,
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
307 struct option_info *opts, int num_opts,
1259
13ba50dd5a8e Some cleanups from David Vrable
gthomas
parents: 210
diff changeset
308 void *def_arg, int def_arg_type, char *def_descr)
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
309 {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
310 bool ret = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
311 bool flag_ok;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
312 bool def_arg_set = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
313 int i, j;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
314 char c, *s;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
315 struct option_info *opt;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
316
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
317 if (def_arg && (def_arg_type == OPTION_ARG_TYPE_STR)) {
1259
13ba50dd5a8e Some cleanups from David Vrable
gthomas
parents: 210
diff changeset
318 *(char **)def_arg = (char *)0;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
319 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
320 opt = opts;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
321 for (j = 0; j < num_opts; j++, opt++) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
322 if (opt->arg_set) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
323 *opt->arg_set = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
324 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
325 if (!opt->takes_arg) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
326 switch (opt->arg_type) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
327 case OPTION_ARG_TYPE_NUM:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
328 *(int *)opt->arg = 0;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
329 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
330 case OPTION_ARG_TYPE_FLG:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
331 *(bool *)opt->arg = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
332 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
333 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
334 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
335 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
336 for (i = first; i < argc; i++) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
337 if (argv[i][0] == '-') {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
338 c = argv[i][1];
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
339 flag_ok = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
340 opt = opts;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
341 for (j = 0; j < num_opts; j++, opt++) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
342 if (c == opt->flag) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
343 if (opt->arg_set && *opt->arg_set) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
344 diag_printf("** Error: %s already specified\n", opt->name);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
345 ret = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
346 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
347 if (opt->takes_arg) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
348 if (argv[i][2] == '=') {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
349 s = &argv[i][3];
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
350 } else {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
351 s = argv[i+1];
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
352 i++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
353 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
354 switch (opt->arg_type) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
355 case OPTION_ARG_TYPE_NUM:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
356 if (!parse_num(s, (unsigned long *)opt->arg, 0, 0)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
357 diag_printf("** Error: invalid number '%s' for %s\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
358 s, opt->name);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
359 ret = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
360 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
361 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
362 case OPTION_ARG_TYPE_STR:
1259
13ba50dd5a8e Some cleanups from David Vrable
gthomas
parents: 210
diff changeset
363 *(char **)opt->arg = s;
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
364 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
365 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
366 *opt->arg_set = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
367 } else {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
368 switch (opt->arg_type) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
369 case OPTION_ARG_TYPE_NUM:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
370 *(int *)opt->arg = *(int *)opt->arg + 1;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
371 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
372 case OPTION_ARG_TYPE_FLG:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
373 *(bool *)opt->arg = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
374 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
375 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
376 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
377 flag_ok = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
378 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
379 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
380 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
381 if (!flag_ok) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
382 diag_printf("** Error: invalid flag '%c'\n", c);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
383 ret = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
384 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
385 } else {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
386 if (def_arg) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
387 if (def_arg_set) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
388 diag_printf("** Error: %s already specified\n", def_descr);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
389 ret = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
390 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
391 switch (def_arg_type) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
392 case OPTION_ARG_TYPE_NUM:
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
393 if (!parse_num(argv[i], (unsigned long *)def_arg, 0, 0)) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
394 diag_printf("** Error: invalid number '%s' for %s\n",
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
395 argv[i], def_descr);
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
396 ret = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
397 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
398 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
399 case OPTION_ARG_TYPE_STR:
1259
13ba50dd5a8e Some cleanups from David Vrable
gthomas
parents: 210
diff changeset
400 *(char **)def_arg = argv[i];
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
401 break;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
402 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
403 def_arg_set = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
404 } else {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
405 diag_printf("** Error: no default/non-flag arguments supported\n");
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
406 ret = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
407 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
408 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
409 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
410 return ret;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
411 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
412
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
413 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
414 // Parse (scan) a number
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
415 //
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
416 bool
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
417 parse_num(char *s, unsigned long *val, char **es, char *delim)
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
418 {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
419 bool first = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
420 int radix = 10;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
421 char c;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
422 unsigned long result = 0;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
423 int digit;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
424
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
425 while (*s == ' ') s++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
426 while (*s) {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 161
diff changeset
427 if (first && (s[0] == '0') && (_tolower(s[1]) == 'x')) {
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
428 radix = 16;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
429 s += 2;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
430 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
431 first = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
432 c = *s++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
433 if (_is_hex(c) && ((digit = _from_hex(c)) < radix)) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
434 // Valid digit
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
435 #ifdef CYGPKG_HAL_MIPS
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
436 // FIXME: tx49 compiler generates 0x2539018 for MUL which
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
437 // isn't any good.
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
438 if (16 == radix)
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
439 result = result << 4;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
440 else
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
441 result = 10 * result;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
442 result += digit;
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
443 #else
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
444 result = (result * radix) + digit;
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
445 #endif
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
446 } else {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
447 if (delim != (char *)0) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
448 // See if this character is one of the delimiters
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
449 char *dp = delim;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
450 while (*dp && (c != *dp)) dp++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
451 if (*dp) break; // Found a good delimiter
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
452 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
453 return false; // Malformatted number
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
454 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
455 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
456 *val = result;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
457 if (es != (char **)0) {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
458 *es = s;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
459 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
460 return true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
461 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
462
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
463 bool
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
464 parse_bool(char *s, bool *val)
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
465 {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
466 while (*s == ' ') s++;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
467 if ((*s == 't') || (*s == 'T')) {
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
468 char *p = "rue";
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
469 char *P = "RUE";
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
470 // check for (partial) rest of the word and no extra including the
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
471 // terminating zero. "tru" will match; "truef" will not.
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
472 while ( *++s ) {
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
473 if ( *p != *s && *P != *s ) return false;
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
474 p++; P++;
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
475 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
476 *val = true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
477 } else
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
478 if ((*s == 'f') || (*s == 'F')) {
198
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
479 char *p = "alse";
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
480 char *P = "ALSE";
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
481 while ( *++s ) {
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
482 if ( *p != *s && *P != *s ) return false;
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
483 p++; P++;
ea3f0bd33a73 Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents: 183
diff changeset
484 }
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
485 *val = false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
486 } else {
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
487 return false;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
488 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
489 return true;
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
490 }
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff changeset
491