Mercurial > ecos
annotate packages/redboot/current/src/parse.c @ 183:9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
| author | jlarmour |
|---|---|
| date | Wed, 12 Sep 2001 04:21:13 +0000 |
| parents | f62680ef1804 |
| children | ea3f0bd33a73 |
| 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 //========================================================================== |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
8 //####COPYRIGHTBEGIN#### |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
9 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
10 // ------------------------------------------- |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
11 // The contents of this file are subject to the Red Hat eCos Public License |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
12 // Version 1.1 (the "License"); you may not use this file except in |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
13 // compliance with the License. You may obtain a copy of the License at |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
14 // http://www.redhat.com/ |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
15 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
18 // License for the specific language governing rights and limitations under |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
19 // the License. |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
20 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
21 // The Original Code is eCos - Embedded Configurable Operating System, |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
22 // released September 30, 1998. |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
23 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
24 // The Initial Developer of the Original Code is Red Hat. |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
25 // Portions created by Red Hat are |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
27 // All Rights Reserved. |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
28 // ------------------------------------------- |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
29 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
30 //####COPYRIGHTEND#### |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
31 //========================================================================== |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
32 //#####DESCRIPTIONBEGIN#### |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
33 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
34 // Author(s): gthomas |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
35 // Contributors: gthomas |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
36 // Date: 2000-07-14 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
37 // Purpose: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
38 // Description: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
39 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
40 // 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
|
41 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
42 //####DESCRIPTIONEND#### |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
43 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
44 //========================================================================== |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
45 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
46 #include <redboot.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
47 #include <cyg/hal/hal_arch.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
48 #include <cyg/hal/hal_intr.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
49 #include <cyg/hal/hal_cache.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
50 #include CYGHWR_MEMORY_LAYOUT_H |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
51 #include <cyg/hal/hal_tables.h> |
|
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 // Define table boundaries |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
54 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
|
55 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
56 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
57 // 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
|
58 // 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
|
59 // 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
|
60 // 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
|
61 // 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
|
62 // 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
|
63 // 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
|
64 // 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
|
65 // 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
|
66 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
67 struct cmd * |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
68 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
|
69 { |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
70 char *cp = *line; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
71 char *pp; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
72 int indx = 0; |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
73 int semi = 0; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
74 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
75 while (*cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
76 // Skip leading spaces |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
77 while (*cp && *cp == ' ') cp++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
78 if (!*cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
79 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
|
80 } |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
81 if (*cp == ';') { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
82 *cp = '\0'; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
83 semi=1; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
84 break; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
85 } |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
86 if (indx < MAX_ARGV) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
87 argv[indx++] = cp; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
88 } else { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
89 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
|
90 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
91 while (*cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
92 if (*cp == ' ') { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
93 *cp++ = '\0'; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
94 break; |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
95 } else if (*cp == ';') { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
96 break; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
97 } else if (*cp == '"') { |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
98 // Swallow quote, scan till following one |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
99 if (argv[indx-1] == cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
100 argv[indx-1] = ++cp; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
101 } |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
102 pp = cp; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
103 while (*cp && *cp != '"') { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
104 if (*cp == '\\') { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
105 // 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
|
106 cp++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
107 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
108 // Move string to swallow escapes |
|
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 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
111 if (!*cp) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
112 diag_printf("Unbalanced string!\n"); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
113 } else { |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
114 if (pp != cp) *pp = '\0'; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
115 *cp++ = '\0'; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
116 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
117 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
118 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
119 cp++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
120 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
121 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
122 } |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
123 if (semi) { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
124 *line = cp + 1; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
125 } else { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
126 *line = cp; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
127 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
128 *argc = indx; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
129 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
|
130 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
131 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
132 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
133 // Search through a list of commands |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
134 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
135 struct cmd * |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
136 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
|
137 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
138 int cmd_len; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
139 struct cmd *cmd, *cmd2; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
140 // Search command table |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
141 cmd_len = strlen(arg); |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
142 cmd = tab; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
143 while (cmd != tabend) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
144 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
|
145 if (strlen(cmd->str) > cmd_len) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
146 // Check for ambiguous commands here |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
147 // 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
|
148 // 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
|
149 bool first = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
150 cmd2 = tab; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
151 while (cmd2 != tabend) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
152 if ((cmd != cmd2) && |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
153 (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
|
154 if (first) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
155 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
|
156 arg, cmd->str); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
157 first = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
158 } |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
159 diag_printf(" %s", cmd2->str); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
160 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
161 cmd2++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
162 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
163 if (!first) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
164 // 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
|
165 diag_printf("\n"); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
166 return (struct cmd *)0; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
169 return cmd; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
170 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
171 cmd++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
172 } |
|
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 void |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
177 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
|
178 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
179 struct cmd *cmd; |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
180 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
181 diag_printf("Usage:\n"); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
182 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
|
183 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
|
184 } |
|
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 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
187 // Option processing |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
188 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
189 // 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
|
190 // 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
|
191 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
192 void |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
193 init_opts(struct option_info *opts, char flag, bool takes_arg, |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
194 int arg_type, void **arg, bool *arg_set, char *name) |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
195 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
196 opts->flag = flag; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
197 opts->takes_arg = takes_arg; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
198 opts->arg_type = arg_type, |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
199 opts->arg = arg; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
200 opts->arg_set = arg_set; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
201 opts->name = name; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
202 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
203 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
204 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
205 // 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
|
206 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
207 bool |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
208 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
|
209 struct option_info *opts, int num_opts, |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
210 void **def_arg, int def_arg_type, char *def_descr) |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
211 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
212 bool ret = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
213 bool flag_ok; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
214 bool def_arg_set = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
215 int i, j; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
216 char c, *s; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
217 struct option_info *opt; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
218 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
219 if (def_arg && (def_arg_type == OPTION_ARG_TYPE_STR)) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
220 *def_arg = (char *)0; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
221 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
222 opt = opts; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
223 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
|
224 if (opt->arg_set) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
225 *opt->arg_set = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
226 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
227 if (!opt->takes_arg) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
228 switch (opt->arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
229 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
230 *(int *)opt->arg = 0; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
231 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
232 case OPTION_ARG_TYPE_FLG: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
233 *(bool *)opt->arg = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
234 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
235 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
236 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
237 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
238 for (i = first; i < argc; i++) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
239 if (argv[i][0] == '-') { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
240 c = argv[i][1]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
241 flag_ok = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
242 opt = opts; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
243 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
|
244 if (c == opt->flag) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
245 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
|
246 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
|
247 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
248 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
249 if (opt->takes_arg) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
250 if (argv[i][2] == '=') { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
251 s = &argv[i][3]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
252 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
253 s = argv[i+1]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
254 i++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
255 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
256 switch (opt->arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
257 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
258 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
|
259 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
|
260 s, opt->name); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
261 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
262 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
263 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
264 case OPTION_ARG_TYPE_STR: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
265 *opt->arg = s; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
266 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
267 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
268 *opt->arg_set = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
269 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
270 switch (opt->arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
271 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
272 *(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
|
273 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
274 case OPTION_ARG_TYPE_FLG: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
275 *(bool *)opt->arg = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
276 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
277 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
278 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
279 flag_ok = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
280 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
281 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
282 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
283 if (!flag_ok) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
284 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
|
285 ret = false; |
|
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 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
288 if (def_arg) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
289 if (def_arg_set) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
290 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
|
291 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
292 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
293 switch (def_arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
294 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
295 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
|
296 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
|
297 argv[i], def_descr); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
298 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
299 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
300 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
301 case OPTION_ARG_TYPE_STR: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
302 *def_arg = argv[i]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
303 break; |
|
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 def_arg_set = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
306 } else { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
307 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
|
308 ret = false; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
311 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
312 return ret; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
313 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
314 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
315 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
316 // Parse (scan) a number |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
317 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
318 bool |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
319 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
|
320 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
321 bool first = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
322 int radix = 10; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
323 char c; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
324 unsigned long result = 0; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
325 int digit; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
326 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
327 while (*s == ' ') s++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
328 while (*s) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
329 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
|
330 radix = 16; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
331 s += 2; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
332 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
333 first = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
334 c = *s++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
335 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
|
336 // Valid digit |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
337 #ifdef CYGPKG_HAL_MIPS |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
338 // 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
|
339 // isn't any good. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
340 if (16 == radix) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
341 result = result << 4; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
342 else |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
343 result = 10 * result; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
344 result += digit; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
345 #else |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
346 result = (result * radix) + digit; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
347 #endif |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
348 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
349 if (delim != (char *)0) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
350 // 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
|
351 char *dp = delim; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
352 while (*dp && (c != *dp)) dp++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
353 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
|
354 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
355 return false; // Malformatted number |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
356 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
357 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
358 *val = result; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
359 if (es != (char **)0) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
360 *es = s; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
361 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
362 return true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
363 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
364 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
365 bool |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
366 parse_bool(char *s, bool *val) |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
367 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
368 while (*s == ' ') s++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
369 if ((*s == 't') || (*s == 'T')) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
370 *val = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
371 } else |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
372 if ((*s == 'f') || (*s == 'F')) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
373 *val = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
374 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
375 return false; |
|
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 return true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
378 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
379 |
