source: mainline/uspace/app/bdsh/cmds/mod_cmds.c@ 92fd52d7

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 92fd52d7 was 92fd52d7, checked in by Jiri Svoboda <jirik.svoboda@…>, 16 years ago

Nuke strcpy() and strcmp().

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/* Copyright (c) 2008, Tim Post <tinkertim@gmail.com>
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of the original program's authors nor the names of its
15 * contributors may be used to endorse or promote products derived from this
16 * software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
31/* NOTES:
32 * module_* functions are pretty much identical to builtin_* functions at this
33 * point. On the surface, it would appear that making each function dual purpose
34 * would be economical.
35 *
36 * These are kept separate because the structures (module_t and builtin_t) may
37 * grow apart and become rather different, even though they're identical at this
38 * point.
39 *
40 * To keep things easy to hack, everything is separated. In reality this only adds
41 * 6 - 8 extra functions, but keeps each function very easy to read and modify. */
42
43/* TODO:
44 * Many of these could be unsigned, provided the modules and builtins themselves
45 * can follow suit. Long term goal. */
46
47#include <stdio.h>
48#include <stdlib.h>
49#include <string.h>
50#include "errors.h"
51#include "cmds.h"
52#include "module_aliases.h"
53
54extern volatile unsigned int cli_interactive;
55
56/* Checks if an entry function matching command exists in modules[], if so
57 * its position in the array is returned */
58int is_module(const char *command)
59{
60 module_t *mod;
61 unsigned int i = 0;
62
63 if (NULL == command)
64 return -2;
65
66 for (mod = modules; mod->name != NULL; mod++, i++) {
67 if (!str_cmp(mod->name, command))
68 return i;
69 }
70
71 return -1;
72}
73
74/* Checks if a module is an alias (sharing an entry point with another
75 * module). Returns 1 if so */
76int is_module_alias(const char *command)
77{
78 unsigned int i = 0;
79
80 if (NULL == command)
81 return -1;
82
83 for(i=0; mod_aliases[i] != NULL; i+=2) {
84 if (!str_cmp(mod_aliases[i], command))
85 return 1;
86 }
87
88 return 0;
89}
90
91/* Returns the name of the module that an alias points to */
92char *alias_for_module(const char *command)
93{
94 unsigned int i = 0;
95
96 if (NULL == command)
97 return (char *)NULL;
98
99 for(i=0; mod_aliases[i] != NULL; i++) {
100 if (!str_cmp(mod_aliases[i], command))
101 return (char *)mod_aliases[++i];
102 i++;
103 }
104
105 return (char *)NULL;
106}
107
108
109/* Invokes the 'help' entry function for the module at position (int) module,
110 * which wants an unsigned int to determine brief or extended display. */
111int help_module(int module, unsigned int extended)
112{
113 module_t *mod = modules;
114
115 mod += module;
116
117 if (NULL != mod->help) {
118 mod->help(extended);
119 return CL_EOK;
120 } else
121 return CL_ENOENT;
122}
123
124/* Invokes the module entry point modules[module], passing argv[] as an argument
125 * stack. */
126int run_module(int module, char *argv[])
127{
128 module_t *mod = modules;
129
130 mod += module;
131
132 if (NULL != mod->entry)
133 return ((int)mod->entry(argv));
134
135 return CL_ENOENT;
136}
Note: See TracBrowser for help on using the repository browser.