Code for our FYDP -only one IMU works right now -RTOS is working

Dependencies:   mbed

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?

UserRevisionLine numberNew 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