20 if((*cp)->init != 0) {
24 if((*cp)->sublist != 0) {
48 init_history(&shell->
his);
76 static int token_str(
struct st_shell *shell,
uchar *str,
int nullterm)
80 static const char nstr[] =
"";
87 for(i=0; i<GSC_SHELL_MAX_COM_ARGV; i++) {
91 for(i=0; i<GSC_SHELL_MAX_COM_ARGV; i++) {
96 if((*tk == 0) || (*tk == ASCII_CR)) {
101 }
else if(*tk ==
'\\') {
104 while((*(p+1)) != 0) {
113 }
else if(*tk !=
' ') {
126 while(tk < &str[GSC_SHELL_MAX_LINE_COLUMS]) {
127 if((*tk == 0) || (*tk == ASCII_CR) || (*tk == ASCII_LF)) {
132 }
else if(*tk ==
'\\') {
136 while((*(p+1)) != 0) {
144 }
else if(*tk ==
' ') {
167 for(i=0; i<shell->
argc; i++) {
179 uchar *argv[],
int *arg_top)
185 if(
strcomp((*cp)->name, argv[*arg_top]) == 0) {
186 if((*cp)->sublist == 0) {
187 if((*cp)->command != 0) {
196 if((*cp)->command != 0) {
242 if(token_str(shell, str, 1) == 0) {
248 argc = shell->
argc - arg_top;
250 if(com->
attr & CMDATTR_CONT) {
251 if(com->
attr & CMDATTR_ARGLESS) {
263 for(i=0; i<arg_top; i++) {
266 tprintf(
"%s\" command not found.\n", shell->
argv[i]);
282 static int strcomps(
const uchar *s1,
const uchar *s2)
298 }
else if(s1t < s2t) {
303 }
while((s1t != 0) || (s2t != 0));
309 static long strlengs(
const char *str)
313 while((*str != 0) && (*str !=
' ')) {
322 static unsigned int str_match_len(
uchar *s1,
uchar *s2)
324 unsigned int len = 0;
334 }
while((*s1 != 0) || (*s2 != 0));
342 #define MATCH_NO 0 // 補完不要、不可 343 #define MATCH_PART 1 // 部分補完 344 #define MATCH_COMP 2 // 完全一致 353 int match = MATCH_NO;
357 if(strcomps(shell->
argv[arg], (*cp)->name) == 0) {
361 *comstr = (
uchar *)null;
363 }
else if((*cp)->sublist) {
366 tprintf(
"\n %s ->", (*cp)->name);
368 return match_command((
struct st_shell_command *
const *)(*cp)->sublist, shell, arg,
372 *comstr = (
uchar *)null;
381 if(match == MATCH_NO) {
382 unsigned int comlen, arglen;
387 if(comlen > arglen) {
388 *len = comlen - arglen;
393 unsigned int tmp = str_match_len((
uchar *)(*comstr), strp);
415 static void complement_command(
struct st_shell *shell)
418 static const uchar *space = (
const uchar *)
" ";
421 unsigned int len = 0;
426 token_str(shell, str, 0);
428 match = match_command(shell->
shell_coms, shell, 0,
438 insert_str_lineedit(&shell->
comLine, comstr, len);
442 insert_str_lineedit(&shell->
comLine, comstr, len);
443 insert_str_lineedit(&shell->
comLine, (
uchar *)space, 1);
461 if(ch == ASCII_CTRL_C) {
465 }
else if(ch == ASCII_HT) {
467 complement_command(shell);
512 while((*sstr) != 0) {
513 if((*sstr ==
' ') || (*sstr ==
'\\')) {
unsigned char uchar
GadgetSeedの文字(列)は unsigned char 型となる
void(* init)(void)
コマンド初期化関数
int exec_shell_command(struct st_shell *shell, uchar *str)
str文字列のコマンドを実行する
struct st_shell_command *const * shell_coms
各シェルコマンド配列
unsigned int cur_pos
カーソル位置
uchar lastCom[GSC_SHELL_MAX_LINE_COLUMS+1]
最後に実行したコマンド
uchar buf[GSC_SHELL_MAX_LINE_COLUMS+1]
編集中文字列
const uchar * prompt
コマンドプロンプト文字列
int strncomp(const uchar *s1, const uchar *s2, unsigned int n)
文字列比較(長さ指定あり)
int escaped_str(uchar *dstr, uchar *sstr)
文字列をshellで処理可能なようにエスケープシーケンスを追加する
struct st_lineedit comLine
コマンドライン
int do_lineedit(struct st_lineedit *le, uchar ch)
リターンを受けるまでの1行編集を行う 1文字づつデータを入れる
int(* command)(int argc, uchar *argv[])
コマンド実行関数
void draw_lineedit(struct st_lineedit *le)
表示する
struct st_history his
コマンドヒストリ
void new_lineedit(struct st_lineedit *le)
編集中のエディタを初期化(コマンド実行後にバッファ破棄)
int strcomp(const uchar *s1, const uchar *s2)
文字列比較
int task_shell(struct st_shell *shell, uchar ch)
文字列編集タスク
unsigned int strleng(const uchar *str)
文字列長
unsigned short attr
コマンド属性
int eprintf(const char *fmt,...)
エラー出力用簡易printf
int tprintf(const char *fmt,...)
簡易printf
void print_prompt(struct st_shell *shell)
プロンプトを表示する
void init_lineedit(struct st_lineedit *le)
lineeditを初期化する
uchar * strncopy(uchar *dest, const uchar *src, unsigned int n)
文字列コピー
uchar * argv[GSC_SHELL_MAX_COM_ARGV]
コマンド引数文字列
#define GSC_SHELL_MAX_LINE_COLUMS
$gsc shellコマンドラインの最大文字数
void init_shell(struct st_shell *shell, struct st_shell_command *const *coms, const uchar *prompt)
シェルを初期化する
void dispose_shell_line(struct st_shell *shell)
編集中のコマンドラインを破棄する