X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp.git/blobdiff_plain/4bc81323e51ac138e733c14eeb6f283ae706e904..69988dc1f60ce27d2192eb2aa579962f585fffc8:/avr/env.c diff --git a/avr/env.c b/avr/env.c index 7cf33ac..28437a4 100644 --- a/avr/env.c +++ b/avr/env.c @@ -102,6 +102,19 @@ uint16_t varname_get(char *buf, env_item_t *ep) } +static +uint16_t varval_getlen(uint16_t index) +{ + int i = 0; + char c; + + while ((c = env_get_char (index + i)) != '\0') { + i++; + }; + + return i; +} + static uint16_t varval_get(char *buf, uint16_t index, int len) { @@ -403,13 +416,17 @@ env_item_t *envlist_get(const char *name, uint_fast8_t flag) if (ep != NULL && (flag & ENV_GET_VAL)) { if (ep->flags & EF_V_EEP) { char *vp; - uint_fast8_t len; - /* TODO: function that gets len of val, - to get rid of xrealloc */ - vp = xmalloc(CONFIG_SYS_CBSIZE); - len = varval_get(vp, ep->val.eep, CONFIG_SYS_CBSIZE); - ep->val.ram = xrealloc(vp, len + 1); - ep->flags &= ~EF_V_EEP; + int len; + len = varval_getlen(ep->val.eep); + if (len > CONFIG_SYS_CBSIZE) + len = CONFIG_SYS_CBSIZE; + vp = xmalloc(len + 1); + if (vp) { + varval_get(vp, ep->val.eep, len + 1); + ep->val.ram = vp; + ep->flags &= ~EF_V_EEP; + } else + printf_P(PSTR("Out of memory!\n")); } } @@ -596,34 +613,33 @@ int env_print_ramsize(void) } -int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - int i; - int rcode = 0; + command_ret_t rc = CMD_RET_SUCCESS; (void) cmdtp; (void) flag; if (argc == 1) { /* print all env vars */ - rcode = env_print(NULL); - if (rcode < 0) - return 1; + int size = env_print(NULL); + if (size < 0) + return CMD_RET_FAILURE; printf_P(PSTR("\nEnvironment size: %d/%d bytes\n"), - rcode, ENV_SIZE); + size, ENV_SIZE); env_print_ramsize(); - return 0; + return CMD_RET_SUCCESS; } /* print selected env vars */ - for (i = 1; i < argc; ++i) { + for (int i = 1; i < argc; ++i) { int rc = env_print(argv[i]); if (rc < 0) { printf_P(PSTR("## Error: \"%s\" not defined\n"), argv[i]); - ++rcode; + rc = CMD_RET_FAILURE; } } - return rcode; + return rc; } @@ -642,7 +658,7 @@ int do_env_print(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) * @return 0 if ok, 1 on error */ static -int _do_env_set(int flag, int argc, char * const argv[]) +command_ret_t _do_env_set(int flag, int argc, char * const argv[]) { int i, len; char *name, *value, *s; @@ -657,12 +673,12 @@ int _do_env_set(int flag, int argc, char * const argv[]) if (strchr(name, '=')) { printf_P(PSTR("## Error: illegal character '='" "in variable name \"%s\"\n"), name); - return 1; + return CMD_RET_FAILURE; } if (strlen(name) > CONFIG_SYS_ENV_NAMELEN) { printf_P(PSTR("## Error: Variable name \"%s\" too long. " "(max %d characters)\n"), name, CONFIG_SYS_ENV_NAMELEN); - return 1; + return CMD_RET_FAILURE; } /* env_id++; @@ -670,7 +686,7 @@ int _do_env_set(int flag, int argc, char * const argv[]) /* Delete only ? */ if (argc < 3 || argv[2] == NULL) { int rc = envlist_delete(name); - return rc != 0; + return rc ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } /* @@ -682,7 +698,7 @@ int _do_env_set(int flag, int argc, char * const argv[]) value = xmalloc(len); if (value == NULL) { printf_P(PSTR("## Can't malloc %d bytes\n"), len); - return 1; + return CMD_RET_FAILURE; } for (i = 2, s = value; i < argc; ++i) { char *v = argv[i]; @@ -701,10 +717,10 @@ int _do_env_set(int flag, int argc, char * const argv[]) if (!ep) { printf_P(PSTR("## Error inserting \"%s\" variable.\n"), name); - return 1; + return CMD_RET_FAILURE; } - return 0; + return CMD_RET_SUCCESS; } /** @@ -723,7 +739,7 @@ int setenv(const char *varname, const char *varvalue) if (varvalue == NULL || varvalue[0] == '\0') --argc; - return _do_env_set(0, argc, (char * const *)argv); + return (int) _do_env_set(0, argc, (char * const *)argv); } #if 0 @@ -781,7 +797,7 @@ unsigned long getenv_hex(const char *varname, unsigned long default_val) return value; } -int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { (void) cmdtp; @@ -792,12 +808,12 @@ int do_env_set(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) } -int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +command_ret_t do_env_save(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { (void) cmdtp; (void) flag; (void) argc; (void) argv; printf_P(PSTR("Saving Environment ...\n")); - return saveenv() ? 1 : 0; + return saveenv() ? CMD_RET_FAILURE : CMD_RET_SUCCESS; } #if defined(CONFIG_AUTO_COMPLETE)