From 5833e532a1dd6084bc5775f4672886b9b7e7658e Mon Sep 17 00:00:00 2001 From: crunchy Date: Thu, 12 Sep 2002 18:49:34 +0000 Subject: mpiosh: some internal changes and support for command sequences --- mpiosh/Makefile.am | 8 ++ mpiosh/mpiosh.c | 402 +++++++++++++++++++++++++++++++++++++++++++++++++++++ mpiosh/mpiosh.h | 71 ++++++++++ 3 files changed, 481 insertions(+) create mode 100644 mpiosh/Makefile.am create mode 100644 mpiosh/mpiosh.c create mode 100644 mpiosh/mpiosh.h (limited to 'mpiosh') diff --git a/mpiosh/Makefile.am b/mpiosh/Makefile.am new file mode 100644 index 0000000..bb38b8a --- /dev/null +++ b/mpiosh/Makefile.am @@ -0,0 +1,8 @@ +INCLUDES=-I.. + +bin_PROGRAMS=mpiosh + +mpiosh_SOURCES=mpiosh.c callback.c +mpiosh_LDADD=../libmpio/libmpio.la -lreadline -lncurses + +noinst_HEADERS=mpiosh.h callback.h \ No newline at end of file diff --git a/mpiosh/mpiosh.c b/mpiosh/mpiosh.c new file mode 100644 index 0000000..5e24b87 --- /dev/null +++ b/mpiosh/mpiosh.c @@ -0,0 +1,402 @@ +/* -*- linux-c -*- */ + +/* + * + * $Id: mpiosh.c,v 1.1 2002/09/12 18:49:36 crunchy Exp $ + * + * Author: Andreas Büsching + * + * mpiosh - user interface of the mpio library, providing access to + * some model of the MPIO mp3 players. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + * */ + +#include +#include +#include +#include + +#include +#include + +#include "libmpio/debug.h" +#include "libmpio/mpio.h" + +#include "callback.h" +#include "mpiosh.h" + +mpiosh_t mpiosh; + +const char *PROMPT_INT = "\033[;1mmpio \033[m "; +const char *PROMPT_EXT = "\033[;1mmpio \033[m "; + +mpiosh_cmd_t commands[] = { + { "debug", "[level|file|on|off] ", + "modify debugging options", + mpiosh_cmd_debug }, + { "ver", NULL, + "version of mpio package", + mpiosh_cmd_version }, + { "help", NULL, + "show known commands", + mpiosh_cmd_help }, + { "dir", NULL, + "list content of current memory card", + mpiosh_cmd_dir }, + { "info", NULL, + "show information about MPIO player", + mpiosh_cmd_info }, + { "mem", "[i|e]", + "set current memory card. 'i' selects the internal and 'e' " + "selects the external memory card (smart media card)", + mpiosh_cmd_mem }, + { "open", NULL, + "open connect to MPIO player", + mpiosh_cmd_open }, + { "close", NULL, + "close connect to MPIO player", + mpiosh_cmd_close }, + { "quit", " or exit", + "exit mpiosh and close the device", + mpiosh_cmd_quit }, + { "exit", NULL, NULL, mpiosh_cmd_quit }, + { "get", "", + "read from memory card", + mpiosh_cmd_get }, + { "mget", "", + "read all files matching the regular expression " + "from the selected memory card", + mpiosh_cmd_mget }, + { "put", "", + "write to memory card", + mpiosh_cmd_put }, + { "mput", "", + "write all local files matching the regular expression " + "to the selected memory card", + mpiosh_cmd_mput }, + { "del", "", + "deletes from memory card", + mpiosh_cmd_del }, + { "mdel", "", + "deletes all files matching the regular expression " + "from the selected memory card", + mpiosh_cmd_mdel }, + { "dump", NULL, + "get all files of current memory card", + mpiosh_cmd_dump }, + { "free", NULL, + "display amount of available bytes of current memory card", + mpiosh_cmd_free }, + { "format", NULL, + "format current memory card", + mpiosh_cmd_format }, + { "switch", " ", + "switches the order of two files", + mpiosh_cmd_switch }, + { "ldir", NULL, + "list local directory", + mpiosh_cmd_ldir }, + { "lcd", NULL, + "change the current working directory", + mpiosh_cmd_lcd }, + { "lmkdir", NULL, + "create a local directory", + mpiosh_cmd_lmkdir }, + { NULL, NULL, NULL, NULL } +}; + +/* readline extensaions */ +void +mpiosh_readline_init(void) +{ + rl_readline_name = "mpio"; + rl_attempted_completion_function = mpiosh_readline_completion; +} + +char * +mpiosh_readline_comp_cmd(const char *text, int state) +{ + static mpiosh_cmd_t *cmd = NULL; + char *cmd_text = NULL; + + if (state == 0) { + cmd = commands; + } + + while (cmd->cmd) { + if ((*text == '\0') || (strstr(cmd->cmd, text) == cmd->cmd)) { + cmd_text = strdup(cmd->cmd); + cmd++; + break; + } + cmd++; + } + + return cmd_text; +} + +char ** +mpiosh_readline_completion(const char *text, int start, int end) +{ + char **matches = (char**)NULL; + + UNUSED(end); + + if (start == 0) + matches = rl_completion_matches(text, mpiosh_readline_comp_cmd); + else { + + } + + return matches; +} + +/* helper functions */ +void +mpiosh_init(void) +{ + mpiosh.dev = NULL; + mpiosh.card = MPIO_INTERNAL_MEM; + mpiosh.prompt = PROMPT_INT; +} + +char ** +mpiosh_command_split(char *line) +{ + char **cmds, *cmd; + int count = 1; + char *help, *copy = strdup(line); + + help = copy; + + while (*help) + if ((*help++ == ';') && (*(help) != '\0')) count++; + cmds = malloc(sizeof(char *) * (count + 1)); + + cmd = help = copy, count = 0; + while (*cmd == ' ') cmd++; + while (help) { + if (*help == '"') { + help++; + while (*help != '\0' && *help != '"') help++; + } + + if (*help == '\0') break; + if (*help == ';') { + *help++ = '\0'; + if (*help == '\0') break; + cmds[count++] = strdup(cmd); + while (*help == ' ') help++; + cmd = help; + } + help++; + } + if (cmd != '\0') { + cmds[count++] = strdup(cmd); + } + + cmds[count] = NULL; + free(copy); + + return cmds; +} + +mpiosh_cmd_t * +mpiosh_command_find(char *line) +{ + mpiosh_cmd_t *cmd = commands; + + while (cmd->cmd) { + if (strstr(line, cmd->cmd) == line) { + if (line[strlen(cmd->cmd)] == ' ' || + line[strlen(cmd->cmd)] == '\0') + return cmd; + } + cmd++; + } + + return NULL; +} + +char ** +mpiosh_command_get_args(char *line) +{ + char **args; + char *arg_start, *copy, *help, *prev; + int count = 0, i = 0, go = 1, in_quote = 0; + + copy = strdup(line); + arg_start = strchr(copy, ' '); + + if (arg_start == NULL) { + args = malloc(sizeof(char *)); + args[0] = NULL; + return args; + } + + while (*arg_start == ' ') arg_start++; + + help = arg_start; + while (help <= (copy + strlen(copy))) { + if (*help == '"') { + help++;count++; + + while (*help != '\0' && *help != '"') + help++; + help++; + while (*help == ' ') help++; + if (*help == '\0') break; + in_quote = 1; + } else if (((help > arg_start) && (*help == '\0')) || + (*help == ' ' && (*(help + 1) != '\0') && (*(help + 1) != ' '))) { + count++; + in_quote = 0; + help++; + } else + help++; + } + + args = malloc(sizeof(char *) * (count + 1)); + + help = prev = arg_start; + in_quote = 0; + while (go) { + if (*help == '"') in_quote = !in_quote, help++; + if (((*help == ' ') && !in_quote) || (in_quote && *help == '"') || + (*help == '\0')) { + if (*help == '\0') { + go = 0; + if (*prev == '\0') break; + } + + if (*prev == '"') { + if (*(help - 1) == '"') + *(help - 1) = '\0'; + else + *help = '\0'; + + args[i++] = strdup(prev + 1); + } else { + *help = '\0'; + args[i++] = strdup(prev); + } + + if (go) { + help++; + if (in_quote) { + while (*help != '"') help++; + help++; + in_quote = 0; + } else + while (*help == ' ') help++; + prev = help; + } + } else + help++; + } + args[i] = NULL; + + free(copy); + + return args; +} + +void +mpiosh_command_free_args(char **args) +{ + char **arg = args; + + while (*arg) free(*arg++); + + free(args); +} + + +int +main(int argc, char *argv[]) { + char * line; + char ** cmds, **walk; + mpiosh_cmd_t *cmd; + int idx; + + UNUSED(argc); + UNUSED(argv); + + setenv("mpio_debug", "", 0); + setenv("mpio_color", "", 0); + + /* no unwanted interruption anymore */ + signal(SIGINT, SIG_IGN); + + /* init readline and history */ + rl_readline_name = "mpio"; + using_history(); + + debug_init(); + mpiosh_readline_init(); + + mpiosh_init(); + mpiosh.dev = mpio_init(); + + if (!mpiosh.dev) { + printf("could not find MPIO player.\n"); + } + + if (mpiosh.card == MPIO_INTERNAL_MEM) + mpiosh.prompt = PROMPT_INT; + else + mpiosh.prompt = PROMPT_EXT; + + while ((line = readline(mpiosh.prompt))) { + if (*line == '\0') continue; + + cmds = mpiosh_command_split(line); + + if (cmds[0][0] == '\0') { + free(cmds); + continue; + } + + walk = cmds; + while (*walk) { + cmd = mpiosh_command_find(*walk); + + if (cmd) { + char ** help, **args = mpiosh_command_get_args(*walk); + help = args; + + cmd->func(args); + mpiosh_command_free_args(args); + } else + printf("unknown command: '%s'\n", *walk); + +/* if ((idx = history_search(line, -1)) != -1) */ +/* history_set_pos(idx); */ +/* else */ + add_history(line); + free(*walk); + walk++; + } + free(cmds); + } + + mpiosh_cmd_quit(NULL); + + return 0; +} + + diff --git a/mpiosh/mpiosh.h b/mpiosh/mpiosh.h new file mode 100644 index 0000000..2916cbb --- /dev/null +++ b/mpiosh/mpiosh.h @@ -0,0 +1,71 @@ +/* mpiosh.h + * + * Author: Andreas Büsching + * + * $Id: mpiosh.h,v 1.1 2002/09/12 18:49:36 crunchy Exp $ + * + * Copyright (C) 2002 Andreas Büsching + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef _MPIOSH_H_ +#define _MPIOSH_H_ + +#if !defined TRUE +# define TRUE 1 +#endif + +#if !defined FALSE +# define FALSE 1 +#endif + +typedef void(*cmd_callback)(char *args[]); + +typedef struct { + mpio_t * dev; + mpio_mem_t card; + const char * prompt; +} mpiosh_t; + +typedef struct { + char * cmd; + char * args; + char * info; + cmd_callback func; +} mpiosh_cmd_t; + +/* readline extensions */ +void mpiosh_readline_init(void); +char **mpiosh_readline_completion(const char *text, int start, int end); +char *mpiosh_readline_comp_cmd(const char *text, int state); + +/* helper functions */ +void mpiosh_init(void); +mpiosh_cmd_t *mpiosh_command_find(char *line); +char **mpiosh_command_split(char *line); +char **mpiosh_command_get_args(char *line); +void mpiosh_command_free_args(char **args); + +/* global structure for device information */ +extern mpiosh_t mpiosh; +extern mpiosh_cmd_t commands[]; + +extern const char *PROMPT_INT; +extern const char *PROMPT_EXT; + +#endif // _MPIOSH_H_ + +/* end of mpiosh.h */ -- cgit v1.2.3