X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/0c728c8de88d86247d2a75348e71f5af37838c28..292f0519ea34caacfd03d3c752fd830056f1b342:/avr/env.c?ds=sidebyside diff --git a/avr/env.c b/avr/env.c index a947583..b2b4e6f 100644 --- a/avr/env.c +++ b/avr/env.c @@ -1,20 +1,16 @@ /* * (C) Copyright 2014 Leo C. * - * SPDX-License-Identifier: GPL-2.0+ + * SPDX-License-Identifier: GPL-2.0 */ -#include "common.h" -#include -#include +#include "env.h" #include #include "config.h" #include "debug.h" -#include "xmalloc.h" #include "crc.h" -#include "command.h" -#include "env.h" +#include "getopt-min.h" #define ENV_SIZE (CONFIG_ENV_SIZE - sizeof(uint16_t) -1) @@ -33,11 +29,12 @@ const FLASH char default_env[] = { ENV_BAUDRATE "=" "115200" DELIM ENV_BOOTDELAY "=" "3" DELIM - ENV_BOOTCMD "=" "reset; loadf; go ${startaddr}" DELIM - ENV_PATH_CPM3SYS "=" CONFIG_PATH_CPM3SYS DELIM + ENV_BOOTCMD "=" "pin ${pins}; loadcpm3; go ${startaddress}" DELIM + ENV_CPM3_SYSFILE "=" CONFIG_CPM3_SYSFILE DELIM ENV_PINALIAS "=" "0:PG5,1:PG4,2:PB4,3:PB5,4:PB6,5:PB7," "6:PG3,7:PG2,8:PG1,9:PG0,10:PE7" DELIM ENV_STARTADDRESS "=" "0" DELIM + "pins" "=" "2,8 low 9 high 3 2" DELIM DELIM }; @@ -197,7 +194,7 @@ int envlist_import(uint8_t flags) return -1; } - np = (char *) xmalloc(len+1); + np = (char *) malloc(len+1); if (np == NULL) { printf_P(PSTR("## Can't malloc %d bytes\n"), len+1); return 1; @@ -316,7 +313,7 @@ int env_init(void) } -char *getenv(const MEMX char *name) +char *getenv_str(const MEMX char *name) { env_item_t *ep; char *ret = NULL; @@ -396,14 +393,18 @@ int saveenv(void) static -int env_item_print(env_item_t *ep) +int env_item_print(env_item_t *ep, bool mode) { int len; char *ev = ep->envvar; + if (mode) { + len = printf_P(PSTR("setenv %s "), ev) - 7; + len += printf_P(PSTR("'%s'\n"), ev + len) - 2; + } else { len = printf_P(PSTR("%s="), ev); len += printf_P(PSTR("%s\n"), ev + len); - + } return len; } @@ -414,7 +415,7 @@ int env_item_print(env_item_t *ep) * Returns -1 in case of error, or length of printed string */ static -int env_print(const MEMX char *name) +int env_print(const MEMX char *name, bool mode) { int len = -1; @@ -422,12 +423,12 @@ int env_print(const MEMX char *name) env_item_t *ep = envlist_search(name); if (ep != NULL) - len = env_item_print(ep); + len = env_item_print(ep, mode); } else { /* print whole list */ len = 0; for (int i = 0 ; i < entrycount; i++) { - len += env_item_print(&env_list[i]); + len += env_item_print(&env_list[i], mode); } } return len; @@ -449,7 +450,7 @@ int env_print(const MEMX char *name) * @return 0 if ok, 1 on error */ static -command_ret_t _do_env_set(int flag, int argc, char * const argv[]) +command_ret_t _do_env_set(uint_fast8_t flag, int argc, char * const argv[]) { int i, len; char *name, *value, *valp, *p; @@ -486,7 +487,7 @@ command_ret_t _do_env_set(int flag, int argc, char * const argv[]) for (i = 2, len += 1; i < argc; ++i) len += strlen(argv[i]) + 1; - value = xmalloc(len); + value = malloc(len); if (value == NULL) { printf_P(PSTR("## Can't malloc %d bytes\n"), len); return CMD_RET_FAILURE; @@ -624,36 +625,71 @@ unsigned long getenv_ulong(const MEMX char *name, int base, unsigned long defaul } -command_ret_t do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +/* + * Read an environment variable as a boolean + */ +bool getenv_yesno(const MEMX char *name) { - command_ret_t rc = CMD_RET_SUCCESS; + char *s = getenv_str(name); + + if (s == NULL) + return false; + + return strchr_P(PSTR("1yYtT"), *s) != NULL; + +/* + return *s == '1' || *s == 'y' || *s == 'Y' || *s == 't' || *s == 'T' ? + 1 : 0; +*/ +} +command_ret_t do_env_print(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) +{ (void) cmdtp; (void) flag; - if (argc == 1) { + bool mode = 0; + command_ret_t rc = CMD_RET_SUCCESS; + + /* reset getopt() */ + optind = 0; + + int opt; + while ((opt = getopt(argc, argv, PSTR("s"))) != -1) { + switch (opt) { + case 's': + mode = 1; + break; + default: /* '?' */ + return CMD_RET_USAGE; + } + } + + if (optind == argc) { /* print all env vars */ - int size = env_print(NULL); + int size = env_print(NULL, mode); if (size < 0) return CMD_RET_FAILURE; - printf_P(PSTR("\nEnvironment size: %d/%d bytes\n"), - size, ENV_SIZE); + if (mode == 0) + printf_P(PSTR("\nEnvironment size: %d/%d bytes\n"), + size, ENV_SIZE); return CMD_RET_SUCCESS; } /* print selected env vars */ - for (int i = 1; i < argc; ++i) { - int rc = env_print(argv[i]); + while (optind < argc) { + int rc = env_print(argv[optind], mode); if (rc < 0) { - printf_P(PSTR("## Error: \"%s\" not defined\n"), argv[i]); + printf_P(PSTR("## Error: \"%s\" not defined\n"), argv[optind]); rc = CMD_RET_FAILURE; } + optind++; } return rc; } -command_ret_t do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_env_set(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { (void) cmdtp; @@ -664,7 +700,7 @@ command_ret_t do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv } -command_ret_t do_env_default(cmd_tbl_t *cmdtp, int flag, +command_ret_t do_env_default(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { (void) cmdtp; (void) flag; (void) argc; (void) argv; @@ -682,7 +718,7 @@ command_ret_t do_env_default(cmd_tbl_t *cmdtp, int flag, } -command_ret_t do_env_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_env_save(cmd_tbl_t *cmdtp, uint_fast8_t flag, int argc, char * const argv[]) { (void) cmdtp; (void) flag; (void) argc; (void) argv;