agileRTOS (zrtos)  Version 0.8.0 (ghostbuster)
shell.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 ykat UG (haftungsbeschraenkt) - All Rights Reserved
3  *
4  * Permission for non-commercial use is hereby granted,
5  * free of charge, without warranty of any kind.
6  */
7 #ifndef ZRTOS_SHELL_H
8 #define ZRTOS_SHELL_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 
14 #include <zrtos/zrtos.h>
15 #include <zrtos/types.h>
16 #include <zrtos/str.h>
17 
18 #ifndef ZRTOS_SHELL__CFG_LINE_BUFFER_LENGTH
19 #define ZRTOS_SHELL__CFG_LINE_BUFFER_LENGTH 80
20 #endif
21 #ifndef ZRTOS_SHELL__CFG_MAX_ARG_COUNT
22 #define ZRTOS_SHELL__CFG_MAX_ARG_COUNT 8
23 #endif
24 
25 typedef enum{
32 
33 struct _zrtos_shell_t;
34 
35 typedef struct{
36  char *name;
37  zrtos_error_t (*callback)(struct _zrtos_shell_t *thiz,size_t argc,char **argv);
39 
40 typedef struct{
44 
45 typedef struct _zrtos_shell_t{
48  void *data;
50 
52  zrtos_shell_t *thiz
55  ,void *data
56 ){
57  thiz->files = files;
58  thiz->fn = fn;
59  thiz->data = data;
60 
61  return true;
62 }
63 
65  zrtos_shell_t *thiz
66  ,size_t *argc
67  ,char **argv
68  ,char *line
69 ){
71  size_t pos = 0;
72  char *arg;
73  size_t offset;
74 
75  line += zrtos_str__spn(line," \t\r\n");
76  offset = zrtos_str__cspn(line,"\r\n");
77  if(offset){
78  line[offset] = 0;
79  while((arg = zrtos_str__tok_r(line," \t", &line))){
81  argv[pos++] = arg;
82  continue;
83  }else{
84  ret = ZRTOS_ERROR__2BIG;
85  break;
86  }
87  }
88  *argc = pos;
89  }else{
90  *argc = 0;
91  }
92 
93  return ret;
94 }
95 
97  zrtos_shell_t *thiz
98  ,size_t argc
99  ,char **argv
100 ){
102  zrtos_shell_fn_t **fn = thiz->fn;
103 
104  for(;*fn;fn++){
105  if(zrtos_str__cmp(argv[0],fn->name) == 0){
106  ret = fn->callback(thiz,argc,argv);
107  break;
108  }
109  }
110 
111  return ret;
112 }
113 
115  zrtos_shell_t *thiz
116  ,char *line
117 ){
118  size_t argc;
119  char *argv[ZRTOS_SHELL__CFG_MAX_ARG_COUNT];
121  thiz
122  ,&argc
123  ,argv
124  ,line
125  );
127  && argc > 0){
128  ret = zrtos_shell__execute(thiz,argc,argv);
129  }
130 
131  return ret;
132 }
133 
134 #ifdef __cplusplus
135 }
136 #endif
137 #endif
size_t zrtos_str__spn(const char *s1, const char *s2)
Definition: str.h:207
zrtos_error_t zrtos_shell__parse_line(zrtos_shell_t *thiz, size_t *argc, char **argv, char *line)
Definition: shell.h:64
bool zrtos_shell__init(zrtos_shell_t *thiz, zrtos_shell_fd_array_t files, zrtos_shell_fn_t **fn, void *data)
Definition: shell.h:51
zrtos_error_t(* callback)(struct _zrtos_shell_t *thiz, size_t argc, char **argv)
Definition: shell.h:37
zrtos_error_t zrtos_shell__run(zrtos_shell_t *thiz, char *line)
Definition: shell.h:114
Arg list too long.
Definition: error.h:31
bool zrtos_error__is_success(zrtos_error_t thiz)
Definition: error.h:152
size_t zrtos_str__cspn(const char *s1, const char *s2)
Definition: str.h:224
Successful program execution status.
Definition: error.h:22
int zrtos_str__cmp(char *a, char *b)
Definition: str.h:33
Function not implemented.
Definition: error.h:62
char * zrtos_str__tok_r(char *s, const char *delim, char **save_ptr)
Definition: str.h:254
zrtos_error_t zrtos_shell__execute(zrtos_shell_t *thiz, size_t argc, char **argv)
Definition: shell.h:96
#define ZRTOS_SHELL__CFG_MAX_ARG_COUNT
Definition: shell.h:22
char * name
Definition: shell.h:36
zrtos_vfs_fd_t cwd
Definition: shell.h:41
zrtos_shell_fd_t
Definition: shell.h:25
struct _zrtos_shell_t zrtos_shell_t
zrtos_shell_fn_t ** fn
Definition: shell.h:47
zrtos_error_t
Definition: error.h:20
void * data
Definition: shell.h:48
zrtos_shell_fd_array_t files
Definition: shell.h:46