Mercurial > ecos-v3_0-branch
annotate packages/redboot/current/src/parse.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
| author | jlarmour |
|---|---|
| date | Thu, 29 Jan 2009 17:47:46 +0000 |
| parents | 6cbecf3cc2e4 |
| children |
| 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 //========================================================================== |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
8 // ####ECOSGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
12 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
16 // version. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
17 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
21 // for more details. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
22 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
23 // You should have received a copy of the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
24 // along with eCos; if not, write to the Free Software Foundation, Inc., |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
26 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
28 // macros or inline functions from this file, or you compile this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
29 // and link it with other works to produce a work based on this file, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
30 // this file does not by itself cause the resulting work to be covered by |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
31 // the GNU General Public License. However the source code for this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
32 // must still be made available in accordance with section (3) of the GNU |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
33 // General Public License v2. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
198
diff
changeset
|
34 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
35 // This exception does not invalidate any other reasons why a work based |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
36 // on this file might be covered by the GNU General Public License. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
37 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2614
diff
changeset
|
38 // ####ECOSGPLCOPYRIGHTEND#### |
|
130
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 //#####DESCRIPTIONBEGIN#### |
|
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 // Author(s): gthomas |
|
2257
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
43 // Contributors: gthomas, eCosCentric |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
44 // Date: 2000-07-14 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
45 // Purpose: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
46 // Description: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
47 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
48 // 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
|
49 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
50 //####DESCRIPTIONEND#### |
|
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 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
54 #include <redboot.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
55 #include <cyg/hal/hal_arch.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
56 #include <cyg/hal/hal_intr.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
57 #include <cyg/hal/hal_cache.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
58 #include CYGHWR_MEMORY_LAYOUT_H |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
59 #include <cyg/hal/hal_tables.h> |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
60 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
61 // Define table boundaries |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
62 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
|
63 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
64 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
65 // 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
|
66 // 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
|
67 // 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
|
68 // 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
|
69 // 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
|
70 // 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
|
71 // 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
|
72 // 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
|
73 // 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
|
74 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
75 struct cmd * |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
76 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
|
77 { |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
78 char *cp = *line; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
79 char *pp; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
80 int indx = 0; |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
81 int semi = 0; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
82 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
83 while (*cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
84 // Skip leading spaces |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
85 while (*cp && *cp == ' ') cp++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
86 if (!*cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
87 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
|
88 } |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
89 if (*cp == ';') { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
90 *cp = '\0'; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
91 semi=1; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
92 break; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
93 } |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
94 if (indx < MAX_ARGV) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
95 argv[indx++] = cp; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
143
diff
changeset
|
96 } else { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
97 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
|
98 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
99 while (*cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
100 if (*cp == ' ') { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
101 *cp++ = '\0'; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
102 break; |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
103 } else if (*cp == ';') { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
104 break; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
105 } else if (*cp == '"') { |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
106 // Swallow quote, scan till following one |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
107 if (argv[indx-1] == cp) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
108 argv[indx-1] = ++cp; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
109 } |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
110 pp = cp; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
111 while (*cp && *cp != '"') { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
112 if (*cp == '\\') { |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
113 // 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
|
114 cp++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
115 } |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
116 // Move string to swallow escapes |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
117 *pp++ = *cp++; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
118 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
119 if (!*cp) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
120 diag_printf("Unbalanced string!\n"); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
121 } else { |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
122 if (pp != cp) *pp = '\0'; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
123 *cp++ = '\0'; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
124 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
125 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
126 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
127 cp++; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
130 } |
|
183
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
131 if (semi) { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
132 *line = cp + 1; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
133 } else { |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
134 *line = cp; |
|
9160a8005d76
Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents:
182
diff
changeset
|
135 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
136 *argc = indx; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
137 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
|
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 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
141 // Search through a list of commands |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
142 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
143 struct cmd * |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
144 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
|
145 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
146 int cmd_len; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
147 struct cmd *cmd, *cmd2; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
148 // Search command table |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
149 cmd_len = strlen(arg); |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
150 cmd = tab; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
151 while (cmd != tabend) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
152 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
|
153 if (strlen(cmd->str) > cmd_len) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
154 // Check for ambiguous commands here |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
155 // 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
|
156 // 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
|
157 bool first = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
158 cmd2 = tab; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
159 while (cmd2 != tabend) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
160 if ((cmd != cmd2) && |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
161 (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
|
162 if (first) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
163 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
|
164 arg, cmd->str); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
165 first = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
166 } |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
167 diag_printf(" %s", cmd2->str); |
|
130
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 cmd2++; |
|
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 if (!first) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
172 // 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
|
173 diag_printf("\n"); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
174 return (struct cmd *)0; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
177 return cmd; |
|
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 cmd++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
180 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
181 return (struct cmd *)0; |
|
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 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
184 void |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
185 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
|
186 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
187 struct cmd *cmd; |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
188 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
189 diag_printf("Usage:\n"); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
190 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
|
191 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
|
192 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
193 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
194 |
|
2257
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
195 // |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
196 // 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
|
197 // |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
198 static hal_jmp_buf error_jmpbuf; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
199 static cyg_bool redboot_exec_call = false; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
200 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
201 __externC void* volatile __mem_fault_handler; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
202 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
203 static void error_handler(void) |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
204 { |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
205 hal_longjmp(error_jmpbuf, 1); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
206 } |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
207 #endif |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
208 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
209 // 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
|
210 // during initialization and in platform specific code. |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
211 // |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
212 // Call it like this: |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
213 // |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
214 // 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
|
215 // |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
216 // 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
|
217 // succeeded, and <0 if something went wrong. |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
218 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
219 #define ARGV_MAX 20 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
220 int redboot_exec( char *command, ... ) |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
221 { |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
222 int argc; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
223 char *argv[ARGV_MAX+1]; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
224 va_list ap; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
225 struct cmd *cmd; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
226 int result = 0; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
227 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
228 va_start(ap, command); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
229 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
230 argv[0] = command; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
231 for( argc = 1; argc < ARGV_MAX; argc++ ) |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
232 { |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
233 char *arg = va_arg(ap, char *); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
234 if( arg == 0 ) |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
235 break; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
236 argv[argc] = arg; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
237 } |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
238 argv[argc] = NULL; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
239 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
240 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
|
241 { |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
242 // 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
|
243 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
244 __mem_fault_handler = error_handler; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
245 #endif |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
246 redboot_exec_call = true; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
247 if (hal_setjmp(error_jmpbuf)) |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
248 result = -1; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
249 else |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
250 (cmd->fun)(argc, argv); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
251 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
252 redboot_exec_call = false; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
253 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
254 __mem_fault_handler = 0; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
255 #endif |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
256 } |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
257 else |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
258 result = -1; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
259 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
260 va_end(ap); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
261 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
262 return result; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
263 } |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
264 |
|
2614
6cbecf3cc2e4
* src/fconfig.c, src/flash.c, src/io.c, src/load.c, src/main.c,
jlarmour
parents:
2257
diff
changeset
|
265 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
|
266 { |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
267 va_list ap; |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
268 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
269 va_start(ap, fmt); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
270 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
271 diag_vprintf( fmt, ap ); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
272 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
273 va_end(ap); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
274 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
275 // 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
|
276 // 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
|
277 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
278 if( redboot_exec_call ) |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
279 { |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
280 diag_printf("err_printf: aborting command\n"); |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
281 hal_longjmp(error_jmpbuf, 1); |
|
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 |
|
467fd46113f3
* src/fs/fileio.c (do_list): Use getcwd for current directory,
jlarmour
parents:
1259
diff
changeset
|
285 |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
286 // Option processing |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
287 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
288 // 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
|
289 // 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
|
290 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
291 void |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
292 init_opts(struct option_info *opts, char flag, bool takes_arg, |
| 1259 | 293 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
|
294 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
295 opts->flag = flag; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
296 opts->takes_arg = takes_arg; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
297 opts->arg_type = arg_type, |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
298 opts->arg = arg; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
299 opts->arg_set = arg_set; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
300 opts->name = name; |
|
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 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
304 // 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
|
305 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
306 bool |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
307 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
|
308 struct option_info *opts, int num_opts, |
| 1259 | 309 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
|
310 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
311 bool ret = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
312 bool flag_ok; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
313 bool def_arg_set = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
314 int i, j; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
315 char c, *s; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
316 struct option_info *opt; |
|
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 if (def_arg && (def_arg_type == OPTION_ARG_TYPE_STR)) { |
| 1259 | 319 *(char **)def_arg = (char *)0; |
|
130
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 opt = opts; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
322 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
|
323 if (opt->arg_set) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
324 *opt->arg_set = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
325 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
326 if (!opt->takes_arg) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
327 switch (opt->arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
328 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
329 *(int *)opt->arg = 0; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
330 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
331 case OPTION_ARG_TYPE_FLG: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
332 *(bool *)opt->arg = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
333 break; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
337 for (i = first; i < argc; i++) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
338 if (argv[i][0] == '-') { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
339 c = argv[i][1]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
340 flag_ok = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
341 opt = opts; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
342 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
|
343 if (c == opt->flag) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
344 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
|
345 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
|
346 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
347 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
348 if (opt->takes_arg) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
349 if (argv[i][2] == '=') { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
350 s = &argv[i][3]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
351 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
352 s = argv[i+1]; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
353 i++; |
|
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 switch (opt->arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
356 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
357 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
|
358 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
|
359 s, opt->name); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
360 ret = false; |
|
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 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
363 case OPTION_ARG_TYPE_STR: |
| 1259 | 364 *(char **)opt->arg = s; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
365 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
366 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
367 *opt->arg_set = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
368 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
369 switch (opt->arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
370 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
371 *(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
|
372 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
373 case OPTION_ARG_TYPE_FLG: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
374 *(bool *)opt->arg = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
375 break; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
378 flag_ok = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
379 break; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
382 if (!flag_ok) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
383 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
|
384 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
385 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
386 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
387 if (def_arg) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
388 if (def_arg_set) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
389 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
|
390 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
391 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
392 switch (def_arg_type) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
393 case OPTION_ARG_TYPE_NUM: |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
394 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
|
395 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
|
396 argv[i], def_descr); |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
397 ret = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
398 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
399 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
400 case OPTION_ARG_TYPE_STR: |
| 1259 | 401 *(char **)def_arg = argv[i]; |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
402 break; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
403 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
404 def_arg_set = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
405 } else { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
406 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
|
407 ret = false; |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
411 return ret; |
|
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 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
415 // Parse (scan) a number |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
416 // |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
417 bool |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
418 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
|
419 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
420 bool first = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
421 int radix = 10; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
422 char c; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
423 unsigned long result = 0; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
424 int digit; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
425 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
426 while (*s == ' ') s++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
427 while (*s) { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
161
diff
changeset
|
428 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
|
429 radix = 16; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
430 s += 2; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
431 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
432 first = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
433 c = *s++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
434 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
|
435 // Valid digit |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
436 #ifdef CYGPKG_HAL_MIPS |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
437 // 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
|
438 // isn't any good. |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
439 if (16 == radix) |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
440 result = result << 4; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
441 else |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
442 result = 10 * result; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
443 result += digit; |
|
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
444 #else |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
445 result = (result * radix) + digit; |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
130
diff
changeset
|
446 #endif |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
447 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
448 if (delim != (char *)0) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
449 // 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
|
450 char *dp = delim; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
451 while (*dp && (c != *dp)) dp++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
452 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
|
453 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
454 return false; // Malformatted number |
|
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 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
457 *val = result; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
458 if (es != (char **)0) { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
459 *es = s; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
460 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
461 return true; |
|
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 |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
464 bool |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
465 parse_bool(char *s, bool *val) |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
466 { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
467 while (*s == ' ') s++; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
468 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
|
469 char *p = "rue"; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
470 char *P = "RUE"; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
471 // 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
|
472 // 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
|
473 while ( *++s ) { |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
474 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
|
475 p++; P++; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
476 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
477 *val = true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
478 } else |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
479 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
|
480 char *p = "alse"; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
481 char *P = "ALSE"; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
482 while ( *++s ) { |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
483 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
|
484 p++; P++; |
|
ea3f0bd33a73
Merge from eCos master repository on 2001-12-07-11:40:47-GMT
jlarmour
parents:
183
diff
changeset
|
485 } |
|
130
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
486 *val = false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
487 } else { |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
488 return false; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
489 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
490 return true; |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
491 } |
|
eb9fd8c04db3
Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents:
diff
changeset
|
492 |
