Code for our FYDP -only one IMU works right now -RTOS is working
bt_shell/shell/tinyshell/tinysh.c@0:964eb6a2ef00, 2015-03-18 (annotated)
- Committer:
- majik
- Date:
- Wed Mar 18 22:23:48 2015 +0000
- Revision:
- 0:964eb6a2ef00
This is our FYDP code, but only one IMU works with the RTOS.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
majik | 0:964eb6a2ef00 | 1 | /* |
majik | 0:964eb6a2ef00 | 2 | * tinysh.c |
majik | 0:964eb6a2ef00 | 3 | * |
majik | 0:964eb6a2ef00 | 4 | * Minimal portable shell |
majik | 0:964eb6a2ef00 | 5 | * |
majik | 0:964eb6a2ef00 | 6 | * Copyright (C) 2001 Michel Gutierrez <mig@nerim.net> |
majik | 0:964eb6a2ef00 | 7 | * |
majik | 0:964eb6a2ef00 | 8 | * This library is free software; you can redistribute it and/or |
majik | 0:964eb6a2ef00 | 9 | * modify it under the terms of the GNU Lesser General Public |
majik | 0:964eb6a2ef00 | 10 | * License as published by the Free Software Foundation; either |
majik | 0:964eb6a2ef00 | 11 | * version 2.1 of the License, or (at your option) any later version. |
majik | 0:964eb6a2ef00 | 12 | * |
majik | 0:964eb6a2ef00 | 13 | * This library is distributed in the hope that it will be useful, |
majik | 0:964eb6a2ef00 | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
majik | 0:964eb6a2ef00 | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
majik | 0:964eb6a2ef00 | 16 | * Lesser General Public License for more details. |
majik | 0:964eb6a2ef00 | 17 | * |
majik | 0:964eb6a2ef00 | 18 | * You should have received a copy of the GNU Lesser General Public |
majik | 0:964eb6a2ef00 | 19 | * License along with this library; if not, write to the Free |
majik | 0:964eb6a2ef00 | 20 | * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
majik | 0:964eb6a2ef00 | 21 | */ |
majik | 0:964eb6a2ef00 | 22 | |
majik | 0:964eb6a2ef00 | 23 | #include "tinysh.h" |
majik | 0:964eb6a2ef00 | 24 | |
majik | 0:964eb6a2ef00 | 25 | #ifndef BUFFER_SIZE |
majik | 0:964eb6a2ef00 | 26 | #define BUFFER_SIZE 64 |
majik | 0:964eb6a2ef00 | 27 | #endif |
majik | 0:964eb6a2ef00 | 28 | #ifndef HISTORY_DEPTH |
majik | 0:964eb6a2ef00 | 29 | #define HISTORY_DEPTH 3 |
majik | 0:964eb6a2ef00 | 30 | #endif |
majik | 0:964eb6a2ef00 | 31 | #ifndef MAX_ARGS |
majik | 0:964eb6a2ef00 | 32 | #define MAX_ARGS 4 |
majik | 0:964eb6a2ef00 | 33 | #endif |
majik | 0:964eb6a2ef00 | 34 | #ifndef PROMPT_SIZE |
majik | 0:964eb6a2ef00 | 35 | #define PROMPT_SIZE 4 |
majik | 0:964eb6a2ef00 | 36 | #endif |
majik | 0:964eb6a2ef00 | 37 | #ifndef TOPCHAR |
majik | 0:964eb6a2ef00 | 38 | #define TOPCHAR '/' |
majik | 0:964eb6a2ef00 | 39 | #endif |
majik | 0:964eb6a2ef00 | 40 | |
majik | 0:964eb6a2ef00 | 41 | |
majik | 0:964eb6a2ef00 | 42 | typedef unsigned char uchar; |
majik | 0:964eb6a2ef00 | 43 | /* redefine some useful and maybe missing utilities to avoid conflicts */ |
majik | 0:964eb6a2ef00 | 44 | #define strlen tinysh_strlen |
majik | 0:964eb6a2ef00 | 45 | #define puts tinysh_puts |
majik | 0:964eb6a2ef00 | 46 | #define putchar tinysh_char_out |
majik | 0:964eb6a2ef00 | 47 | |
majik | 0:964eb6a2ef00 | 48 | static void help_fnt(int argc, char **argv); |
majik | 0:964eb6a2ef00 | 49 | |
majik | 0:964eb6a2ef00 | 50 | static tinysh_cmd_t help_cmd={ |
majik | 0:964eb6a2ef00 | 51 | 0,"help","display help","<cr>",help_fnt,0,0,0 }; |
majik | 0:964eb6a2ef00 | 52 | |
majik | 0:964eb6a2ef00 | 53 | static uchar input_buffers[HISTORY_DEPTH][BUFFER_SIZE+1]={0}; |
majik | 0:964eb6a2ef00 | 54 | static uchar trash_buffer[BUFFER_SIZE+1]={0}; |
majik | 0:964eb6a2ef00 | 55 | static int cur_buf_index=0; |
majik | 0:964eb6a2ef00 | 56 | static uchar context_buffer[BUFFER_SIZE+1]={0}; |
majik | 0:964eb6a2ef00 | 57 | static int cur_context=0; |
majik | 0:964eb6a2ef00 | 58 | static int cur_index=0; |
majik | 0:964eb6a2ef00 | 59 | int echo=1; |
majik | 0:964eb6a2ef00 | 60 | static char prompt[PROMPT_SIZE+1]="$ "; |
majik | 0:964eb6a2ef00 | 61 | static tinysh_cmd_t *root_cmd=&help_cmd; |
majik | 0:964eb6a2ef00 | 62 | static tinysh_cmd_t *cur_cmd_ctx=0; |
majik | 0:964eb6a2ef00 | 63 | static void *tinysh_arg=0; |
majik | 0:964eb6a2ef00 | 64 | |
majik | 0:964eb6a2ef00 | 65 | /* few useful utilities that may be missing */ |
majik | 0:964eb6a2ef00 | 66 | |
majik | 0:964eb6a2ef00 | 67 | static int strlen(uchar *s) |
majik | 0:964eb6a2ef00 | 68 | { |
majik | 0:964eb6a2ef00 | 69 | int i; |
majik | 0:964eb6a2ef00 | 70 | for(i=0;*s;s++,i++); |
majik | 0:964eb6a2ef00 | 71 | return i; |
majik | 0:964eb6a2ef00 | 72 | } |
majik | 0:964eb6a2ef00 | 73 | |
majik | 0:964eb6a2ef00 | 74 | static void puts(char *s) |
majik | 0:964eb6a2ef00 | 75 | { |
majik | 0:964eb6a2ef00 | 76 | while(*s) |
majik | 0:964eb6a2ef00 | 77 | putchar(*s++); |
majik | 0:964eb6a2ef00 | 78 | } |
majik | 0:964eb6a2ef00 | 79 | |
majik | 0:964eb6a2ef00 | 80 | /* callback for help function |
majik | 0:964eb6a2ef00 | 81 | */ |
majik | 0:964eb6a2ef00 | 82 | static void help_fnt(int argc, char **argv) |
majik | 0:964eb6a2ef00 | 83 | { |
majik | 0:964eb6a2ef00 | 84 | puts("? display help on given or available commands\r\n"); |
majik | 0:964eb6a2ef00 | 85 | puts("<TAB> auto-completion\r\n"); |
majik | 0:964eb6a2ef00 | 86 | puts("<cr> execute command line\r\n"); |
majik | 0:964eb6a2ef00 | 87 | puts("CTRL-P recall previous input line\r\n"); |
majik | 0:964eb6a2ef00 | 88 | puts("CTRL-N recall next input line\r\n"); |
majik | 0:964eb6a2ef00 | 89 | puts("<any> treat as input character\r\n"); |
majik | 0:964eb6a2ef00 | 90 | } |
majik | 0:964eb6a2ef00 | 91 | |
majik | 0:964eb6a2ef00 | 92 | /* |
majik | 0:964eb6a2ef00 | 93 | */ |
majik | 0:964eb6a2ef00 | 94 | |
majik | 0:964eb6a2ef00 | 95 | enum { NULLMATCH,FULLMATCH,PARTMATCH,UNMATCH,MATCH,AMBIG }; |
majik | 0:964eb6a2ef00 | 96 | |
majik | 0:964eb6a2ef00 | 97 | /* verify if the non-spaced part of s2 is included at the begining |
majik | 0:964eb6a2ef00 | 98 | * of s1. |
majik | 0:964eb6a2ef00 | 99 | * return FULLMATCH if s2 equal to s1, PARTMATCH if s1 starts with s2 |
majik | 0:964eb6a2ef00 | 100 | * but there are remaining chars in s1, UNMATCH if s1 does not start with |
majik | 0:964eb6a2ef00 | 101 | * s2 |
majik | 0:964eb6a2ef00 | 102 | */ |
majik | 0:964eb6a2ef00 | 103 | int strstart(uchar *s1, uchar *s2) |
majik | 0:964eb6a2ef00 | 104 | { |
majik | 0:964eb6a2ef00 | 105 | while(*s1 && *s1==*s2) { s1++; s2++; } |
majik | 0:964eb6a2ef00 | 106 | |
majik | 0:964eb6a2ef00 | 107 | if(*s2==' ' || *s2==0) |
majik | 0:964eb6a2ef00 | 108 | { |
majik | 0:964eb6a2ef00 | 109 | if(*s1==0) |
majik | 0:964eb6a2ef00 | 110 | return FULLMATCH; /* full match */ |
majik | 0:964eb6a2ef00 | 111 | else |
majik | 0:964eb6a2ef00 | 112 | return PARTMATCH; /* partial match */ |
majik | 0:964eb6a2ef00 | 113 | } |
majik | 0:964eb6a2ef00 | 114 | else |
majik | 0:964eb6a2ef00 | 115 | return UNMATCH; /* no match */ |
majik | 0:964eb6a2ef00 | 116 | } |
majik | 0:964eb6a2ef00 | 117 | |
majik | 0:964eb6a2ef00 | 118 | /* |
majik | 0:964eb6a2ef00 | 119 | * check commands at given level with input string. |
majik | 0:964eb6a2ef00 | 120 | * _cmd: point to first command at this level, return matched cmd |
majik | 0:964eb6a2ef00 | 121 | * _str: point to current unprocessed input, return next unprocessed |
majik | 0:964eb6a2ef00 | 122 | */ |
majik | 0:964eb6a2ef00 | 123 | static int parse_command(tinysh_cmd_t **_cmd, uchar **_str) |
majik | 0:964eb6a2ef00 | 124 | { |
majik | 0:964eb6a2ef00 | 125 | uchar *str=*_str; |
majik | 0:964eb6a2ef00 | 126 | tinysh_cmd_t *cmd; |
majik | 0:964eb6a2ef00 | 127 | int matched_len=0; |
majik | 0:964eb6a2ef00 | 128 | tinysh_cmd_t *matched_cmd=0; |
majik | 0:964eb6a2ef00 | 129 | |
majik | 0:964eb6a2ef00 | 130 | /* first eliminate first blanks */ |
majik | 0:964eb6a2ef00 | 131 | while(*str==' ') str++; |
majik | 0:964eb6a2ef00 | 132 | if(!*str) |
majik | 0:964eb6a2ef00 | 133 | { |
majik | 0:964eb6a2ef00 | 134 | *_str=str; |
majik | 0:964eb6a2ef00 | 135 | return NULLMATCH; /* end of input */ |
majik | 0:964eb6a2ef00 | 136 | } |
majik | 0:964eb6a2ef00 | 137 | |
majik | 0:964eb6a2ef00 | 138 | /* first pass: count matches */ |
majik | 0:964eb6a2ef00 | 139 | for(cmd=*_cmd;cmd;cmd=cmd->next) |
majik | 0:964eb6a2ef00 | 140 | { |
majik | 0:964eb6a2ef00 | 141 | int ret=strstart(cmd->name,str); |
majik | 0:964eb6a2ef00 | 142 | |
majik | 0:964eb6a2ef00 | 143 | if(ret==FULLMATCH) |
majik | 0:964eb6a2ef00 | 144 | { |
majik | 0:964eb6a2ef00 | 145 | /* found full match */ |
majik | 0:964eb6a2ef00 | 146 | while(*str && *str!=' ') str++; |
majik | 0:964eb6a2ef00 | 147 | while(*str==' ') str++; |
majik | 0:964eb6a2ef00 | 148 | *_str=str; |
majik | 0:964eb6a2ef00 | 149 | *_cmd=cmd; |
majik | 0:964eb6a2ef00 | 150 | return MATCH; |
majik | 0:964eb6a2ef00 | 151 | } |
majik | 0:964eb6a2ef00 | 152 | else if (ret==PARTMATCH) |
majik | 0:964eb6a2ef00 | 153 | { |
majik | 0:964eb6a2ef00 | 154 | if(matched_cmd) |
majik | 0:964eb6a2ef00 | 155 | { |
majik | 0:964eb6a2ef00 | 156 | *_cmd=matched_cmd; |
majik | 0:964eb6a2ef00 | 157 | return AMBIG; |
majik | 0:964eb6a2ef00 | 158 | } |
majik | 0:964eb6a2ef00 | 159 | else |
majik | 0:964eb6a2ef00 | 160 | { |
majik | 0:964eb6a2ef00 | 161 | matched_cmd=cmd; |
majik | 0:964eb6a2ef00 | 162 | } |
majik | 0:964eb6a2ef00 | 163 | } |
majik | 0:964eb6a2ef00 | 164 | else /* UNMATCH */ |
majik | 0:964eb6a2ef00 | 165 | { |
majik | 0:964eb6a2ef00 | 166 | } |
majik | 0:964eb6a2ef00 | 167 | } |
majik | 0:964eb6a2ef00 | 168 | if(matched_cmd) |
majik | 0:964eb6a2ef00 | 169 | { |
majik | 0:964eb6a2ef00 | 170 | while(*str && *str!=' ') str++; |
majik | 0:964eb6a2ef00 | 171 | while(*str==' ') str++; |
majik | 0:964eb6a2ef00 | 172 | *_cmd=matched_cmd; |
majik | 0:964eb6a2ef00 | 173 | *_str=str; |
majik | 0:964eb6a2ef00 | 174 | return MATCH; |
majik | 0:964eb6a2ef00 | 175 | } |
majik | 0:964eb6a2ef00 | 176 | else |
majik | 0:964eb6a2ef00 | 177 | return UNMATCH; |
majik | 0:964eb6a2ef00 | 178 | } |
majik | 0:964eb6a2ef00 | 179 | |
majik | 0:964eb6a2ef00 | 180 | /* create a context from current input line |
majik | 0:964eb6a2ef00 | 181 | */ |
majik | 0:964eb6a2ef00 | 182 | static void do_context(tinysh_cmd_t *cmd, uchar *str) |
majik | 0:964eb6a2ef00 | 183 | { |
majik | 0:964eb6a2ef00 | 184 | while(*str) |
majik | 0:964eb6a2ef00 | 185 | context_buffer[cur_context++]=*str++; |
majik | 0:964eb6a2ef00 | 186 | context_buffer[cur_context]=0; |
majik | 0:964eb6a2ef00 | 187 | cur_cmd_ctx=cmd; |
majik | 0:964eb6a2ef00 | 188 | } |
majik | 0:964eb6a2ef00 | 189 | |
majik | 0:964eb6a2ef00 | 190 | /* execute the given command by calling callback with appropriate |
majik | 0:964eb6a2ef00 | 191 | * arguments |
majik | 0:964eb6a2ef00 | 192 | */ |
majik | 0:964eb6a2ef00 | 193 | static void exec_command(tinysh_cmd_t *cmd, uchar *str) |
majik | 0:964eb6a2ef00 | 194 | { |
majik | 0:964eb6a2ef00 | 195 | char *argv[MAX_ARGS]; |
majik | 0:964eb6a2ef00 | 196 | int argc=0; |
majik | 0:964eb6a2ef00 | 197 | int i; |
majik | 0:964eb6a2ef00 | 198 | |
majik | 0:964eb6a2ef00 | 199 | /* copy command line to preserve it for history */ |
majik | 0:964eb6a2ef00 | 200 | for(i=0;i<BUFFER_SIZE;i++) |
majik | 0:964eb6a2ef00 | 201 | trash_buffer[i]=str[i]; |
majik | 0:964eb6a2ef00 | 202 | str=trash_buffer; |
majik | 0:964eb6a2ef00 | 203 | |
majik | 0:964eb6a2ef00 | 204 | /* cut into arguments */ |
majik | 0:964eb6a2ef00 | 205 | argv[argc++]=cmd->name; |
majik | 0:964eb6a2ef00 | 206 | while(*str && argc<MAX_ARGS) |
majik | 0:964eb6a2ef00 | 207 | { |
majik | 0:964eb6a2ef00 | 208 | while(*str==' ') str++; |
majik | 0:964eb6a2ef00 | 209 | if(*str==0) |
majik | 0:964eb6a2ef00 | 210 | break; |
majik | 0:964eb6a2ef00 | 211 | argv[argc++]=str; |
majik | 0:964eb6a2ef00 | 212 | while(*str!=' ' && *str) str++; |
majik | 0:964eb6a2ef00 | 213 | if(!*str) break; |
majik | 0:964eb6a2ef00 | 214 | *str++=0; |
majik | 0:964eb6a2ef00 | 215 | } |
majik | 0:964eb6a2ef00 | 216 | /* call command function if present */ |
majik | 0:964eb6a2ef00 | 217 | if(cmd->function) |
majik | 0:964eb6a2ef00 | 218 | { |
majik | 0:964eb6a2ef00 | 219 | tinysh_arg=cmd->arg; |
majik | 0:964eb6a2ef00 | 220 | cmd->function(argc,&argv[0]); |
majik | 0:964eb6a2ef00 | 221 | } |
majik | 0:964eb6a2ef00 | 222 | } |
majik | 0:964eb6a2ef00 | 223 | |
majik | 0:964eb6a2ef00 | 224 | /* try to execute the current command line |
majik | 0:964eb6a2ef00 | 225 | */ |
majik | 0:964eb6a2ef00 | 226 | static int exec_command_line(tinysh_cmd_t *cmd, uchar *_str) |
majik | 0:964eb6a2ef00 | 227 | { |
majik | 0:964eb6a2ef00 | 228 | uchar *str=_str; |
majik | 0:964eb6a2ef00 | 229 | |
majik | 0:964eb6a2ef00 | 230 | while(1) |
majik | 0:964eb6a2ef00 | 231 | { |
majik | 0:964eb6a2ef00 | 232 | int ret; |
majik | 0:964eb6a2ef00 | 233 | ret=parse_command(&cmd,&str); |
majik | 0:964eb6a2ef00 | 234 | if(ret==MATCH) /* found unique match */ |
majik | 0:964eb6a2ef00 | 235 | { |
majik | 0:964eb6a2ef00 | 236 | if(cmd) |
majik | 0:964eb6a2ef00 | 237 | { |
majik | 0:964eb6a2ef00 | 238 | if(!cmd->child) /* no sub-command, execute */ |
majik | 0:964eb6a2ef00 | 239 | { |
majik | 0:964eb6a2ef00 | 240 | exec_command(cmd,str); |
majik | 0:964eb6a2ef00 | 241 | return 0; |
majik | 0:964eb6a2ef00 | 242 | } |
majik | 0:964eb6a2ef00 | 243 | else |
majik | 0:964eb6a2ef00 | 244 | { |
majik | 0:964eb6a2ef00 | 245 | if(*str==0) /* no more input, this is a context */ |
majik | 0:964eb6a2ef00 | 246 | { |
majik | 0:964eb6a2ef00 | 247 | do_context(cmd,_str); |
majik | 0:964eb6a2ef00 | 248 | return 0; |
majik | 0:964eb6a2ef00 | 249 | } |
majik | 0:964eb6a2ef00 | 250 | else /* process next command word */ |
majik | 0:964eb6a2ef00 | 251 | { |
majik | 0:964eb6a2ef00 | 252 | cmd=cmd->child; |
majik | 0:964eb6a2ef00 | 253 | } |
majik | 0:964eb6a2ef00 | 254 | } |
majik | 0:964eb6a2ef00 | 255 | } |
majik | 0:964eb6a2ef00 | 256 | else /* cmd == 0 */ |
majik | 0:964eb6a2ef00 | 257 | { |
majik | 0:964eb6a2ef00 | 258 | return 0; |
majik | 0:964eb6a2ef00 | 259 | } |
majik | 0:964eb6a2ef00 | 260 | } |
majik | 0:964eb6a2ef00 | 261 | else if(ret==AMBIG) |
majik | 0:964eb6a2ef00 | 262 | { |
majik | 0:964eb6a2ef00 | 263 | puts("ambiguity: "); |
majik | 0:964eb6a2ef00 | 264 | puts(str); |
majik | 0:964eb6a2ef00 | 265 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 266 | return 0; |
majik | 0:964eb6a2ef00 | 267 | } |
majik | 0:964eb6a2ef00 | 268 | else if(ret==UNMATCH) /* UNMATCH */ |
majik | 0:964eb6a2ef00 | 269 | { |
majik | 0:964eb6a2ef00 | 270 | puts("no match: "); |
majik | 0:964eb6a2ef00 | 271 | puts(str); |
majik | 0:964eb6a2ef00 | 272 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 273 | return 0; |
majik | 0:964eb6a2ef00 | 274 | } |
majik | 0:964eb6a2ef00 | 275 | else /* NULLMATCH */ |
majik | 0:964eb6a2ef00 | 276 | return 0; |
majik | 0:964eb6a2ef00 | 277 | } |
majik | 0:964eb6a2ef00 | 278 | } |
majik | 0:964eb6a2ef00 | 279 | |
majik | 0:964eb6a2ef00 | 280 | /* display help for list of commands |
majik | 0:964eb6a2ef00 | 281 | */ |
majik | 0:964eb6a2ef00 | 282 | static void display_child_help(tinysh_cmd_t *cmd) |
majik | 0:964eb6a2ef00 | 283 | { |
majik | 0:964eb6a2ef00 | 284 | tinysh_cmd_t *cm; |
majik | 0:964eb6a2ef00 | 285 | int len=0; |
majik | 0:964eb6a2ef00 | 286 | |
majik | 0:964eb6a2ef00 | 287 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 288 | for(cm=cmd;cm;cm=cm->next) |
majik | 0:964eb6a2ef00 | 289 | if(len<strlen(cm->name)) |
majik | 0:964eb6a2ef00 | 290 | len=strlen(cm->name); |
majik | 0:964eb6a2ef00 | 291 | for(cm=cmd;cm;cm=cm->next) |
majik | 0:964eb6a2ef00 | 292 | if(cm->help) |
majik | 0:964eb6a2ef00 | 293 | { |
majik | 0:964eb6a2ef00 | 294 | int i; |
majik | 0:964eb6a2ef00 | 295 | puts(cm->name); |
majik | 0:964eb6a2ef00 | 296 | for(i=strlen(cm->name);i<len+2;i++) |
majik | 0:964eb6a2ef00 | 297 | putchar(' '); |
majik | 0:964eb6a2ef00 | 298 | puts(cm->help); |
majik | 0:964eb6a2ef00 | 299 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 300 | } |
majik | 0:964eb6a2ef00 | 301 | } |
majik | 0:964eb6a2ef00 | 302 | |
majik | 0:964eb6a2ef00 | 303 | /* try to display help for current comand line |
majik | 0:964eb6a2ef00 | 304 | */ |
majik | 0:964eb6a2ef00 | 305 | static int help_command_line(tinysh_cmd_t *cmd, uchar *_str) |
majik | 0:964eb6a2ef00 | 306 | { |
majik | 0:964eb6a2ef00 | 307 | uchar *str=_str; |
majik | 0:964eb6a2ef00 | 308 | |
majik | 0:964eb6a2ef00 | 309 | while(1) |
majik | 0:964eb6a2ef00 | 310 | { |
majik | 0:964eb6a2ef00 | 311 | int ret; |
majik | 0:964eb6a2ef00 | 312 | ret=parse_command(&cmd,&str); |
majik | 0:964eb6a2ef00 | 313 | if(ret==MATCH && *str==0) /* found unique match or empty line */ |
majik | 0:964eb6a2ef00 | 314 | { |
majik | 0:964eb6a2ef00 | 315 | tinysh_cmd_t *cm; |
majik | 0:964eb6a2ef00 | 316 | int len=0; |
majik | 0:964eb6a2ef00 | 317 | |
majik | 0:964eb6a2ef00 | 318 | if(cmd->child) /* display sub-commands help */ |
majik | 0:964eb6a2ef00 | 319 | { |
majik | 0:964eb6a2ef00 | 320 | display_child_help(cmd->child); |
majik | 0:964eb6a2ef00 | 321 | return 0; |
majik | 0:964eb6a2ef00 | 322 | } |
majik | 0:964eb6a2ef00 | 323 | else /* no sub-command, show single help */ |
majik | 0:964eb6a2ef00 | 324 | { |
majik | 0:964eb6a2ef00 | 325 | if(*(str-1)!=' ') |
majik | 0:964eb6a2ef00 | 326 | putchar(' '); |
majik | 0:964eb6a2ef00 | 327 | if(cmd->usage) |
majik | 0:964eb6a2ef00 | 328 | puts(cmd->usage); |
majik | 0:964eb6a2ef00 | 329 | puts(": "); |
majik | 0:964eb6a2ef00 | 330 | if(cmd->help) |
majik | 0:964eb6a2ef00 | 331 | puts(cmd->help); |
majik | 0:964eb6a2ef00 | 332 | else |
majik | 0:964eb6a2ef00 | 333 | puts("no help available"); |
majik | 0:964eb6a2ef00 | 334 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 335 | } |
majik | 0:964eb6a2ef00 | 336 | return 0; |
majik | 0:964eb6a2ef00 | 337 | } |
majik | 0:964eb6a2ef00 | 338 | else if(ret==MATCH && *str) |
majik | 0:964eb6a2ef00 | 339 | { /* continue processing the line */ |
majik | 0:964eb6a2ef00 | 340 | cmd=cmd->child; |
majik | 0:964eb6a2ef00 | 341 | } |
majik | 0:964eb6a2ef00 | 342 | else if(ret==AMBIG) |
majik | 0:964eb6a2ef00 | 343 | { |
majik | 0:964eb6a2ef00 | 344 | puts("\r\nambiguity: "); |
majik | 0:964eb6a2ef00 | 345 | puts(str); |
majik | 0:964eb6a2ef00 | 346 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 347 | return 0; |
majik | 0:964eb6a2ef00 | 348 | } |
majik | 0:964eb6a2ef00 | 349 | else if(ret==UNMATCH) |
majik | 0:964eb6a2ef00 | 350 | { |
majik | 0:964eb6a2ef00 | 351 | puts("\r\nno match: "); |
majik | 0:964eb6a2ef00 | 352 | puts(str); |
majik | 0:964eb6a2ef00 | 353 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 354 | return 0; |
majik | 0:964eb6a2ef00 | 355 | } |
majik | 0:964eb6a2ef00 | 356 | else /* NULLMATCH */ |
majik | 0:964eb6a2ef00 | 357 | { |
majik | 0:964eb6a2ef00 | 358 | if(cur_cmd_ctx) |
majik | 0:964eb6a2ef00 | 359 | display_child_help(cur_cmd_ctx->child); |
majik | 0:964eb6a2ef00 | 360 | else |
majik | 0:964eb6a2ef00 | 361 | display_child_help(root_cmd); |
majik | 0:964eb6a2ef00 | 362 | return 0; |
majik | 0:964eb6a2ef00 | 363 | } |
majik | 0:964eb6a2ef00 | 364 | } |
majik | 0:964eb6a2ef00 | 365 | } |
majik | 0:964eb6a2ef00 | 366 | |
majik | 0:964eb6a2ef00 | 367 | /* try to complete current command line |
majik | 0:964eb6a2ef00 | 368 | */ |
majik | 0:964eb6a2ef00 | 369 | static int complete_command_line(tinysh_cmd_t *cmd, uchar *_str) |
majik | 0:964eb6a2ef00 | 370 | { |
majik | 0:964eb6a2ef00 | 371 | uchar *str=_str; |
majik | 0:964eb6a2ef00 | 372 | |
majik | 0:964eb6a2ef00 | 373 | while(1) |
majik | 0:964eb6a2ef00 | 374 | { |
majik | 0:964eb6a2ef00 | 375 | int ret; |
majik | 0:964eb6a2ef00 | 376 | int common_len=BUFFER_SIZE; |
majik | 0:964eb6a2ef00 | 377 | int _str_len; |
majik | 0:964eb6a2ef00 | 378 | int i; |
majik | 0:964eb6a2ef00 | 379 | uchar *__str=str; |
majik | 0:964eb6a2ef00 | 380 | |
majik | 0:964eb6a2ef00 | 381 | tinysh_cmd_t *_cmd=cmd; |
majik | 0:964eb6a2ef00 | 382 | ret=parse_command(&cmd,&str); |
majik | 0:964eb6a2ef00 | 383 | for(_str_len=0;__str[_str_len]&&__str[_str_len]!=' ';_str_len++); |
majik | 0:964eb6a2ef00 | 384 | if(ret==MATCH && *str) |
majik | 0:964eb6a2ef00 | 385 | { |
majik | 0:964eb6a2ef00 | 386 | cmd=cmd->child; |
majik | 0:964eb6a2ef00 | 387 | } |
majik | 0:964eb6a2ef00 | 388 | else if(ret==AMBIG || ret==MATCH || ret==NULLMATCH) |
majik | 0:964eb6a2ef00 | 389 | { |
majik | 0:964eb6a2ef00 | 390 | tinysh_cmd_t *cm; |
majik | 0:964eb6a2ef00 | 391 | tinysh_cmd_t *matched_cmd=0; |
majik | 0:964eb6a2ef00 | 392 | int nb_match=0; |
majik | 0:964eb6a2ef00 | 393 | |
majik | 0:964eb6a2ef00 | 394 | for(cm=cmd;cm;cm=cm->next) |
majik | 0:964eb6a2ef00 | 395 | { |
majik | 0:964eb6a2ef00 | 396 | int r=strstart(cm->name,__str); |
majik | 0:964eb6a2ef00 | 397 | if(r==FULLMATCH) |
majik | 0:964eb6a2ef00 | 398 | { |
majik | 0:964eb6a2ef00 | 399 | for(i=_str_len;cmd->name[i];i++) |
majik | 0:964eb6a2ef00 | 400 | tinysh_char_in(cmd->name[i]); |
majik | 0:964eb6a2ef00 | 401 | if(*(str-1)!=' ') |
majik | 0:964eb6a2ef00 | 402 | tinysh_char_in(' '); |
majik | 0:964eb6a2ef00 | 403 | if(!cmd->child) |
majik | 0:964eb6a2ef00 | 404 | { |
majik | 0:964eb6a2ef00 | 405 | if(cmd->usage) |
majik | 0:964eb6a2ef00 | 406 | { |
majik | 0:964eb6a2ef00 | 407 | puts(cmd->usage); |
majik | 0:964eb6a2ef00 | 408 | putchar('\n'); |
majik | 0:964eb6a2ef00 | 409 | return 1; |
majik | 0:964eb6a2ef00 | 410 | } |
majik | 0:964eb6a2ef00 | 411 | else |
majik | 0:964eb6a2ef00 | 412 | return 0; |
majik | 0:964eb6a2ef00 | 413 | } |
majik | 0:964eb6a2ef00 | 414 | else |
majik | 0:964eb6a2ef00 | 415 | { |
majik | 0:964eb6a2ef00 | 416 | cmd=cmd->child; |
majik | 0:964eb6a2ef00 | 417 | break; |
majik | 0:964eb6a2ef00 | 418 | } |
majik | 0:964eb6a2ef00 | 419 | } |
majik | 0:964eb6a2ef00 | 420 | else if(r==PARTMATCH) |
majik | 0:964eb6a2ef00 | 421 | { |
majik | 0:964eb6a2ef00 | 422 | nb_match++; |
majik | 0:964eb6a2ef00 | 423 | if(!matched_cmd) |
majik | 0:964eb6a2ef00 | 424 | { |
majik | 0:964eb6a2ef00 | 425 | matched_cmd=cm; |
majik | 0:964eb6a2ef00 | 426 | common_len=strlen(cm->name); |
majik | 0:964eb6a2ef00 | 427 | } |
majik | 0:964eb6a2ef00 | 428 | else |
majik | 0:964eb6a2ef00 | 429 | { |
majik | 0:964eb6a2ef00 | 430 | for(i=_str_len;cm->name[i] && i<common_len && |
majik | 0:964eb6a2ef00 | 431 | cm->name[i]==matched_cmd->name[i];i++); |
majik | 0:964eb6a2ef00 | 432 | if(i<common_len) |
majik | 0:964eb6a2ef00 | 433 | common_len=i; |
majik | 0:964eb6a2ef00 | 434 | } |
majik | 0:964eb6a2ef00 | 435 | } |
majik | 0:964eb6a2ef00 | 436 | } |
majik | 0:964eb6a2ef00 | 437 | if(cm) |
majik | 0:964eb6a2ef00 | 438 | continue; |
majik | 0:964eb6a2ef00 | 439 | if(matched_cmd) |
majik | 0:964eb6a2ef00 | 440 | { |
majik | 0:964eb6a2ef00 | 441 | if(_str_len==common_len) |
majik | 0:964eb6a2ef00 | 442 | { |
majik | 0:964eb6a2ef00 | 443 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 444 | for(cm=cmd;cm;cm=cm->next) |
majik | 0:964eb6a2ef00 | 445 | { |
majik | 0:964eb6a2ef00 | 446 | int r=strstart(cm->name,__str); |
majik | 0:964eb6a2ef00 | 447 | if(r==FULLMATCH || r==PARTMATCH) |
majik | 0:964eb6a2ef00 | 448 | { |
majik | 0:964eb6a2ef00 | 449 | puts(cm->name); |
majik | 0:964eb6a2ef00 | 450 | puts("\r\n"); |
majik | 0:964eb6a2ef00 | 451 | } |
majik | 0:964eb6a2ef00 | 452 | } |
majik | 0:964eb6a2ef00 | 453 | return 1; |
majik | 0:964eb6a2ef00 | 454 | } |
majik | 0:964eb6a2ef00 | 455 | else |
majik | 0:964eb6a2ef00 | 456 | { |
majik | 0:964eb6a2ef00 | 457 | for(i=_str_len;i<common_len;i++) |
majik | 0:964eb6a2ef00 | 458 | tinysh_char_in(matched_cmd->name[i]); |
majik | 0:964eb6a2ef00 | 459 | if(nb_match==1) |
majik | 0:964eb6a2ef00 | 460 | tinysh_char_in(' '); |
majik | 0:964eb6a2ef00 | 461 | } |
majik | 0:964eb6a2ef00 | 462 | } |
majik | 0:964eb6a2ef00 | 463 | return 0; |
majik | 0:964eb6a2ef00 | 464 | } |
majik | 0:964eb6a2ef00 | 465 | else /* UNMATCH */ |
majik | 0:964eb6a2ef00 | 466 | { |
majik | 0:964eb6a2ef00 | 467 | return 0; |
majik | 0:964eb6a2ef00 | 468 | } |
majik | 0:964eb6a2ef00 | 469 | } |
majik | 0:964eb6a2ef00 | 470 | } |
majik | 0:964eb6a2ef00 | 471 | |
majik | 0:964eb6a2ef00 | 472 | /* start a new line |
majik | 0:964eb6a2ef00 | 473 | */ |
majik | 0:964eb6a2ef00 | 474 | static void start_of_line() |
majik | 0:964eb6a2ef00 | 475 | { |
majik | 0:964eb6a2ef00 | 476 | /* display start of new line */ |
majik | 0:964eb6a2ef00 | 477 | puts(prompt); |
majik | 0:964eb6a2ef00 | 478 | if(cur_context) |
majik | 0:964eb6a2ef00 | 479 | { |
majik | 0:964eb6a2ef00 | 480 | puts(context_buffer); |
majik | 0:964eb6a2ef00 | 481 | puts("> "); |
majik | 0:964eb6a2ef00 | 482 | } |
majik | 0:964eb6a2ef00 | 483 | cur_index=0; |
majik | 0:964eb6a2ef00 | 484 | } |
majik | 0:964eb6a2ef00 | 485 | |
majik | 0:964eb6a2ef00 | 486 | /* character input |
majik | 0:964eb6a2ef00 | 487 | */ |
majik | 0:964eb6a2ef00 | 488 | static void _tinysh_char_in(uchar c) |
majik | 0:964eb6a2ef00 | 489 | { |
majik | 0:964eb6a2ef00 | 490 | uchar *line=input_buffers[cur_buf_index]; |
majik | 0:964eb6a2ef00 | 491 | |
majik | 0:964eb6a2ef00 | 492 | if(c=='\n' || c=='\r') /* validate command */ |
majik | 0:964eb6a2ef00 | 493 | { |
majik | 0:964eb6a2ef00 | 494 | tinysh_cmd_t *cmd; |
majik | 0:964eb6a2ef00 | 495 | int context=0; |
majik | 0:964eb6a2ef00 | 496 | |
majik | 0:964eb6a2ef00 | 497 | /* first, echo the newline */ |
majik | 0:964eb6a2ef00 | 498 | if(echo) |
majik | 0:964eb6a2ef00 | 499 | putchar(c); |
majik | 0:964eb6a2ef00 | 500 | |
majik | 0:964eb6a2ef00 | 501 | while(*line && *line==' ') line++; |
majik | 0:964eb6a2ef00 | 502 | if(*line) /* not empty line */ |
majik | 0:964eb6a2ef00 | 503 | { |
majik | 0:964eb6a2ef00 | 504 | cmd=cur_cmd_ctx?cur_cmd_ctx->child:root_cmd; |
majik | 0:964eb6a2ef00 | 505 | exec_command_line(cmd,line); |
majik | 0:964eb6a2ef00 | 506 | cur_buf_index=(cur_buf_index+1)%HISTORY_DEPTH; |
majik | 0:964eb6a2ef00 | 507 | cur_index=0; |
majik | 0:964eb6a2ef00 | 508 | input_buffers[cur_buf_index][0]=0; |
majik | 0:964eb6a2ef00 | 509 | } |
majik | 0:964eb6a2ef00 | 510 | start_of_line(); |
majik | 0:964eb6a2ef00 | 511 | } |
majik | 0:964eb6a2ef00 | 512 | else if(c==TOPCHAR) /* return to top level */ |
majik | 0:964eb6a2ef00 | 513 | { |
majik | 0:964eb6a2ef00 | 514 | if(echo) |
majik | 0:964eb6a2ef00 | 515 | putchar(c); |
majik | 0:964eb6a2ef00 | 516 | |
majik | 0:964eb6a2ef00 | 517 | cur_context=0; |
majik | 0:964eb6a2ef00 | 518 | cur_cmd_ctx=0; |
majik | 0:964eb6a2ef00 | 519 | |
majik | 0:964eb6a2ef00 | 520 | } |
majik | 0:964eb6a2ef00 | 521 | else if(c==8 || c==127) /* backspace */ |
majik | 0:964eb6a2ef00 | 522 | { |
majik | 0:964eb6a2ef00 | 523 | if(cur_index>0) |
majik | 0:964eb6a2ef00 | 524 | { |
majik | 0:964eb6a2ef00 | 525 | puts("\b \b"); |
majik | 0:964eb6a2ef00 | 526 | cur_index--; |
majik | 0:964eb6a2ef00 | 527 | line[cur_index]=0; |
majik | 0:964eb6a2ef00 | 528 | } |
majik | 0:964eb6a2ef00 | 529 | } |
majik | 0:964eb6a2ef00 | 530 | else if(c==16) /* CTRL-P: back in history */ |
majik | 0:964eb6a2ef00 | 531 | { |
majik | 0:964eb6a2ef00 | 532 | int prevline=(cur_buf_index+HISTORY_DEPTH-1)%HISTORY_DEPTH; |
majik | 0:964eb6a2ef00 | 533 | |
majik | 0:964eb6a2ef00 | 534 | if(input_buffers[prevline][0]) |
majik | 0:964eb6a2ef00 | 535 | { |
majik | 0:964eb6a2ef00 | 536 | line=input_buffers[prevline]; |
majik | 0:964eb6a2ef00 | 537 | /* fill the rest of the line with spaces */ |
majik | 0:964eb6a2ef00 | 538 | while(cur_index-->strlen(line)) |
majik | 0:964eb6a2ef00 | 539 | puts("\b \b"); |
majik | 0:964eb6a2ef00 | 540 | putchar('\r'); |
majik | 0:964eb6a2ef00 | 541 | start_of_line(); |
majik | 0:964eb6a2ef00 | 542 | puts(line); |
majik | 0:964eb6a2ef00 | 543 | cur_index=strlen(line); |
majik | 0:964eb6a2ef00 | 544 | cur_buf_index=prevline; |
majik | 0:964eb6a2ef00 | 545 | } |
majik | 0:964eb6a2ef00 | 546 | } |
majik | 0:964eb6a2ef00 | 547 | else if(c==14) /* CTRL-N: next in history */ |
majik | 0:964eb6a2ef00 | 548 | { |
majik | 0:964eb6a2ef00 | 549 | int nextline=(cur_buf_index+1)%HISTORY_DEPTH; |
majik | 0:964eb6a2ef00 | 550 | |
majik | 0:964eb6a2ef00 | 551 | if(input_buffers[nextline][0]) |
majik | 0:964eb6a2ef00 | 552 | { |
majik | 0:964eb6a2ef00 | 553 | line=input_buffers[nextline]; |
majik | 0:964eb6a2ef00 | 554 | /* fill the rest of the line with spaces */ |
majik | 0:964eb6a2ef00 | 555 | while(cur_index-->strlen(line)) |
majik | 0:964eb6a2ef00 | 556 | puts("\b \b"); |
majik | 0:964eb6a2ef00 | 557 | putchar('\r'); |
majik | 0:964eb6a2ef00 | 558 | start_of_line(); |
majik | 0:964eb6a2ef00 | 559 | puts(line); |
majik | 0:964eb6a2ef00 | 560 | cur_index=strlen(line); |
majik | 0:964eb6a2ef00 | 561 | cur_buf_index=nextline; |
majik | 0:964eb6a2ef00 | 562 | } |
majik | 0:964eb6a2ef00 | 563 | } |
majik | 0:964eb6a2ef00 | 564 | else if(c=='?') /* display help */ |
majik | 0:964eb6a2ef00 | 565 | { |
majik | 0:964eb6a2ef00 | 566 | tinysh_cmd_t *cmd; |
majik | 0:964eb6a2ef00 | 567 | cmd=cur_cmd_ctx?cur_cmd_ctx->child:root_cmd; |
majik | 0:964eb6a2ef00 | 568 | help_command_line(cmd,line); |
majik | 0:964eb6a2ef00 | 569 | start_of_line(); |
majik | 0:964eb6a2ef00 | 570 | puts(line); |
majik | 0:964eb6a2ef00 | 571 | cur_index=strlen(line); |
majik | 0:964eb6a2ef00 | 572 | } |
majik | 0:964eb6a2ef00 | 573 | else if(c==9 || c=='!') /* TAB: autocompletion */ |
majik | 0:964eb6a2ef00 | 574 | { |
majik | 0:964eb6a2ef00 | 575 | tinysh_cmd_t *cmd; |
majik | 0:964eb6a2ef00 | 576 | cmd=cur_cmd_ctx?cur_cmd_ctx->child:root_cmd; |
majik | 0:964eb6a2ef00 | 577 | if(complete_command_line(cmd,line)) |
majik | 0:964eb6a2ef00 | 578 | { |
majik | 0:964eb6a2ef00 | 579 | start_of_line(); |
majik | 0:964eb6a2ef00 | 580 | puts(line); |
majik | 0:964eb6a2ef00 | 581 | } |
majik | 0:964eb6a2ef00 | 582 | cur_index=strlen(line); |
majik | 0:964eb6a2ef00 | 583 | } |
majik | 0:964eb6a2ef00 | 584 | else /* any input character */ |
majik | 0:964eb6a2ef00 | 585 | { |
majik | 0:964eb6a2ef00 | 586 | if(cur_index<BUFFER_SIZE) |
majik | 0:964eb6a2ef00 | 587 | { |
majik | 0:964eb6a2ef00 | 588 | if(echo) |
majik | 0:964eb6a2ef00 | 589 | putchar(c); |
majik | 0:964eb6a2ef00 | 590 | line[cur_index++]=c; |
majik | 0:964eb6a2ef00 | 591 | line[cur_index]=0; |
majik | 0:964eb6a2ef00 | 592 | } |
majik | 0:964eb6a2ef00 | 593 | } |
majik | 0:964eb6a2ef00 | 594 | } |
majik | 0:964eb6a2ef00 | 595 | |
majik | 0:964eb6a2ef00 | 596 | /* new character input */ |
majik | 0:964eb6a2ef00 | 597 | void tinysh_char_in(uchar c) |
majik | 0:964eb6a2ef00 | 598 | { |
majik | 0:964eb6a2ef00 | 599 | /* |
majik | 0:964eb6a2ef00 | 600 | * filter characters here |
majik | 0:964eb6a2ef00 | 601 | */ |
majik | 0:964eb6a2ef00 | 602 | _tinysh_char_in(c); |
majik | 0:964eb6a2ef00 | 603 | } |
majik | 0:964eb6a2ef00 | 604 | |
majik | 0:964eb6a2ef00 | 605 | /* add a new command */ |
majik | 0:964eb6a2ef00 | 606 | void tinysh_add_command(tinysh_cmd_t *cmd) |
majik | 0:964eb6a2ef00 | 607 | { |
majik | 0:964eb6a2ef00 | 608 | tinysh_cmd_t *cm; |
majik | 0:964eb6a2ef00 | 609 | |
majik | 0:964eb6a2ef00 | 610 | if(cmd->parent) |
majik | 0:964eb6a2ef00 | 611 | { |
majik | 0:964eb6a2ef00 | 612 | cm=cmd->parent->child; |
majik | 0:964eb6a2ef00 | 613 | if(!cm) |
majik | 0:964eb6a2ef00 | 614 | { |
majik | 0:964eb6a2ef00 | 615 | cmd->parent->child=cmd; |
majik | 0:964eb6a2ef00 | 616 | } |
majik | 0:964eb6a2ef00 | 617 | else |
majik | 0:964eb6a2ef00 | 618 | { |
majik | 0:964eb6a2ef00 | 619 | while(cm->next) cm=cm->next; |
majik | 0:964eb6a2ef00 | 620 | cm->next=cmd; |
majik | 0:964eb6a2ef00 | 621 | } |
majik | 0:964eb6a2ef00 | 622 | } |
majik | 0:964eb6a2ef00 | 623 | else if(!root_cmd) |
majik | 0:964eb6a2ef00 | 624 | { |
majik | 0:964eb6a2ef00 | 625 | root_cmd=cmd; |
majik | 0:964eb6a2ef00 | 626 | } |
majik | 0:964eb6a2ef00 | 627 | else |
majik | 0:964eb6a2ef00 | 628 | { |
majik | 0:964eb6a2ef00 | 629 | cm=root_cmd; |
majik | 0:964eb6a2ef00 | 630 | while(cm->next) cm=cm->next; |
majik | 0:964eb6a2ef00 | 631 | cm->next=cmd; |
majik | 0:964eb6a2ef00 | 632 | } |
majik | 0:964eb6a2ef00 | 633 | } |
majik | 0:964eb6a2ef00 | 634 | |
majik | 0:964eb6a2ef00 | 635 | /* modify shell prompt |
majik | 0:964eb6a2ef00 | 636 | */ |
majik | 0:964eb6a2ef00 | 637 | void tinysh_set_prompt(char *str) |
majik | 0:964eb6a2ef00 | 638 | { |
majik | 0:964eb6a2ef00 | 639 | int i; |
majik | 0:964eb6a2ef00 | 640 | for(i=0;str[i] && i<PROMPT_SIZE;i++) |
majik | 0:964eb6a2ef00 | 641 | prompt[i]=str[i]; |
majik | 0:964eb6a2ef00 | 642 | prompt[i]=0; |
majik | 0:964eb6a2ef00 | 643 | /* force prompt display by generating empty command */ |
majik | 0:964eb6a2ef00 | 644 | tinysh_char_in('\r'); |
majik | 0:964eb6a2ef00 | 645 | } |
majik | 0:964eb6a2ef00 | 646 | |
majik | 0:964eb6a2ef00 | 647 | /* return current command argument |
majik | 0:964eb6a2ef00 | 648 | */ |
majik | 0:964eb6a2ef00 | 649 | void *tinysh_get_arg() |
majik | 0:964eb6a2ef00 | 650 | { |
majik | 0:964eb6a2ef00 | 651 | return tinysh_arg; |
majik | 0:964eb6a2ef00 | 652 | } |
majik | 0:964eb6a2ef00 | 653 | |
majik | 0:964eb6a2ef00 | 654 | /* string to decimal/hexadecimal conversion |
majik | 0:964eb6a2ef00 | 655 | */ |
majik | 0:964eb6a2ef00 | 656 | unsigned long tinysh_atoxi(char *s) |
majik | 0:964eb6a2ef00 | 657 | { |
majik | 0:964eb6a2ef00 | 658 | int ishex=0; |
majik | 0:964eb6a2ef00 | 659 | unsigned long res=0; |
majik | 0:964eb6a2ef00 | 660 | int sign = 1; |
majik | 0:964eb6a2ef00 | 661 | |
majik | 0:964eb6a2ef00 | 662 | if(*s==0) return 0; |
majik | 0:964eb6a2ef00 | 663 | |
majik | 0:964eb6a2ef00 | 664 | if(*s=='0' && *(s+1)=='x') |
majik | 0:964eb6a2ef00 | 665 | { |
majik | 0:964eb6a2ef00 | 666 | ishex=1; |
majik | 0:964eb6a2ef00 | 667 | s+=2; |
majik | 0:964eb6a2ef00 | 668 | } |
majik | 0:964eb6a2ef00 | 669 | |
majik | 0:964eb6a2ef00 | 670 | while(*s) |
majik | 0:964eb6a2ef00 | 671 | { |
majik | 0:964eb6a2ef00 | 672 | if(ishex) |
majik | 0:964eb6a2ef00 | 673 | res*=16; |
majik | 0:964eb6a2ef00 | 674 | else |
majik | 0:964eb6a2ef00 | 675 | res*=10; |
majik | 0:964eb6a2ef00 | 676 | |
majik | 0:964eb6a2ef00 | 677 | if(*s>='0' && *s<='9') |
majik | 0:964eb6a2ef00 | 678 | res+=*s-'0'; |
majik | 0:964eb6a2ef00 | 679 | else if(ishex && *s>='a' && *s<='f') |
majik | 0:964eb6a2ef00 | 680 | res+=*s+10-'a'; |
majik | 0:964eb6a2ef00 | 681 | else if(ishex && *s>='A' && *s<='F') |
majik | 0:964eb6a2ef00 | 682 | res+=*s+10-'A'; |
majik | 0:964eb6a2ef00 | 683 | else if(*s=='-') |
majik | 0:964eb6a2ef00 | 684 | sign=-1; |
majik | 0:964eb6a2ef00 | 685 | else |
majik | 0:964eb6a2ef00 | 686 | break; |
majik | 0:964eb6a2ef00 | 687 | |
majik | 0:964eb6a2ef00 | 688 | s++; |
majik | 0:964eb6a2ef00 | 689 | } |
majik | 0:964eb6a2ef00 | 690 | |
majik | 0:964eb6a2ef00 | 691 | return sign*res; |
majik | 0:964eb6a2ef00 | 692 | } |
majik | 0:964eb6a2ef00 | 693 |