1 | /* |
2 | Copyright (c) 2012, Broadcom Europe Ltd |
3 | All rights reserved. |
4 | |
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the following conditions are met: |
7 | * Redistributions of source code must retain the above copyright |
8 | notice, this list of conditions and the following disclaimer. |
9 | * Redistributions in binary form must reproduce the above copyright |
10 | notice, this list of conditions and the following disclaimer in the |
11 | documentation and/or other materials provided with the distribution. |
12 | * Neither the name of the copyright holder nor the |
13 | names of its contributors may be used to endorse or promote products |
14 | derived from this software without specific prior written permission. |
15 | |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ |
27 | |
28 | #if !defined( VCOS_CMD_H ) |
29 | #define VCOS_CMD_H |
30 | |
31 | /* ---- Include Files ----------------------------------------------------- */ |
32 | |
33 | #ifndef VCOS_H |
34 | #include "interface/vcos/vcos.h" |
35 | #endif |
36 | #include "interface/vcos/vcos_stdint.h" |
37 | |
38 | |
39 | /* ---- Constants and Types ---------------------------------------------- */ |
40 | |
41 | struct VCOS_CMD_S; |
42 | typedef struct VCOS_CMD_S VCOS_CMD_T; |
43 | |
44 | typedef struct |
45 | { |
46 | int argc; /* Number of arguments (includes the command/sub-command) */ |
47 | char **argv; /* Array of arguments */ |
48 | char **argv_orig; /* Original array of arguments */ |
49 | |
50 | VCOS_CMD_T *cmd_entry; |
51 | VCOS_CMD_T *cmd_parent_entry; |
52 | |
53 | int use_log; /* Output being logged? */ |
54 | size_t result_size; /* Size of result buffer. */ |
55 | char *result_ptr; /* Next place to put output. */ |
56 | char *result_buf; /* Start of the buffer. */ |
57 | |
58 | } VCOS_CMD_PARAM_T; |
59 | |
60 | typedef VCOS_STATUS_T (*VCOS_CMD_FUNC_T)( VCOS_CMD_PARAM_T *param ); |
61 | |
62 | struct VCOS_CMD_S |
63 | { |
64 | const char *name; |
65 | const char *args; |
66 | VCOS_CMD_FUNC_T cmd_fn; |
67 | VCOS_CMD_T *sub_cmd_entry; |
68 | const char *descr; |
69 | |
70 | }; |
71 | |
72 | /* ---- Variable Externs ------------------------------------------------- */ |
73 | |
74 | /* ---- Function Prototypes ---------------------------------------------- */ |
75 | |
76 | /* |
77 | * Common printing routine for generating command output. |
78 | */ |
79 | VCOSPRE_ void VCOSPOST_ vcos_cmd_error( VCOS_CMD_PARAM_T *param, const char *fmt, ... ) VCOS_FORMAT_ATTR_(printf, 2, 3); |
80 | VCOSPRE_ void VCOSPOST_ vcos_cmd_printf( VCOS_CMD_PARAM_T *param, const char *fmt, ... ) VCOS_FORMAT_ATTR_(printf, 2, 3); |
81 | VCOSPRE_ void VCOSPOST_ vcos_cmd_vprintf( VCOS_CMD_PARAM_T *param, const char *fmt, va_list args ) VCOS_FORMAT_ATTR_(printf, 2, 0); |
82 | |
83 | /* |
84 | * Cause vcos_cmd_error, printf and vprintf to always log to the provided |
85 | * category. When this call is made, the results buffer passed into |
86 | * vcos_cmd_execute is used as a line buffer and does not need to be |
87 | * output by the caller. |
88 | */ |
89 | struct VCOS_LOG_CAT_T; |
90 | VCOSPRE_ void VCOSPOST_ vcos_cmd_always_log_output( struct VCOS_LOG_CAT_T *log_category ); |
91 | |
92 | /* |
93 | * Prints command usage for the current command. |
94 | */ |
95 | VCOSPRE_ void VCOSPOST_ vcos_cmd_usage( VCOS_CMD_PARAM_T *param ); |
96 | |
97 | /* |
98 | * Register commands to be processed |
99 | */ |
100 | VCOSPRE_ VCOS_STATUS_T VCOSPOST_ vcos_cmd_register( VCOS_CMD_T *cmd_entry ); |
101 | |
102 | /* |
103 | * Registers multiple commands to be processed. The array should |
104 | * be terminated by an entry with all zeros. |
105 | */ |
106 | VCOSPRE_ VCOS_STATUS_T VCOSPOST_ vcos_cmd_register_multiple( VCOS_CMD_T *cmd_entry ); |
107 | |
108 | /* |
109 | * Executes a command based on a command line. |
110 | */ |
111 | VCOSPRE_ VCOS_STATUS_T VCOSPOST_ vcos_cmd_execute( int argc, char **argv, size_t result_size, char *result_buf ); |
112 | |
113 | /* |
114 | * Shut down the command system and free all allocated data. |
115 | * Do not call any other command functions after this. |
116 | */ |
117 | VCOSPRE_ void VCOSPOST_ vcos_cmd_shutdown( void ); |
118 | |
119 | #endif /* VCOS_CMD_H */ |
120 | |
121 | |