+int env_item_save(env_item_t *ep, uint16_t offset, int space_left)
+{
+ char buf[CONFIG_SYS_ENV_NAMELEN+1];
+ int len;
+ env_item_t e = *ep;
+
+debug("-- env_item_save(%04x, %04x, %d)\n",
+ ep, offset, space_left);
+
+ len = ee_name_get(buf, ep);
+ if (len == 0)
+ return 0;
+ buf[len++] = '=';
+ space_left -= len;
+
+if ((unsigned) len < sizeof(buf))
+ buf[len] = '\0'; /* terminate for debugging */
+debug(" len: %d, buf: '%s', space_left: %d\n", len, buf, space_left);
+
+ if (space_left <= 0)
+ return 0;
+
+ eeprom_update_block(buf, (uint8_t *) offset, len);
+ offset += len;
+
+ if (e.val.ram != NULL) {
+ char c;
+ do {
+ if (e.flags & EF_V_EEP)
+ c = env_get_char(e.val.eep++);
+ else
+ c = *e.val.ram++;
+
+ eeprom_update_byte((uint8_t *) offset, c);
+ offset++;
+ space_left--;
+ len++;
+ } while ((c != '\0') && space_left );
+ }
+ return len;
+}
+
+
+/*
+ * Update
+ *
+ */
+int env_item_update(env_item_t *ep)
+{
+ char buf[CONFIG_SYS_ENV_NAMELEN+1];
+ uint_fast8_t len;
+ char c;
+ unsigned pos = 0;
+
+ /* get name from old loc. (eeprom or ram */
+ len = ee_name_get(buf, ep);
+ buf[len++] = '=';
+
+debug("-- env_item_update(%04x)\n", ep);
+if (len < sizeof(buf))
+ buf[len] = '\0'; /* terminate for debugging */
+debug(" len: %d, buf: '%s'\n", len, buf);
+
+ /* search this name in new eeprom env */
+ /* TODO: eliminate this ugly hack */
+ uint8_t save_env_valid = env_valid;
+ env_valid = (env_valid == 2) ? 1 : 2;
+
+debug(" len: %d, buf: '%s', env_valid: %d\n", len, buf, env_valid);
+
+ while ((c = env_get_char(pos)) != '\0' && pos < (ENV_SIZE - len)) {
+ uint_fast8_t i = 0;
+
+debug(" while: c: %02x, pos: %d\n ", c, pos);
+
+ while (c == buf[i] && i <= len) {
+
+debug("%02x ", c);
+
+ ++i;
+ c = env_get_char(pos + i);
+ }
+
+debug("\n c: %02x, i: %d, pos: %d\n", c, i, pos);
+
+ if (i == len) {
+ if ((ep->flags & EF_N_EEP) == 0)
+ free(ep->name.ram);
+ ep->name.eep = pos;
+ if ((ep->flags & EF_V_EEP) == 0)
+ free(ep->val.ram);
+ ep->val.eep = pos + i;
+ ep->flags &= ~EF_DIRTY;
+ ep->flags |= EF_N_EEP | EF_V_EEP;
+
+ /* TODO: */
+ env_valid = save_env_valid;
+ return 0;
+ }
+ pos += i + 1;
+ while (((c = env_get_char(pos++)) != '\0') && pos < (ENV_SIZE - len))
+ ;
+
+debug("\n c: %02x, i: %d, pos: %d\n", c, i, pos);
+
+ }
+ /* TODO: */
+ env_valid = save_env_valid;
+
+ /* name not found */
+ return -1;
+}
+
+
+int envlist_import(void)
+{
+ char name[CONFIG_SYS_ENV_NAMELEN+1];
+ uint16_t idx = 0;
+ int nlen;
+ env_item_t e;
+
+ e.flags = EF_N_EEP | EF_V_EEP;
+ e.name.eep = idx;
+ while ((nlen = ee_name_get(name, &e)) != 0 && idx < ENV_SIZE) {
+
+ if (entrycount <= CONFIG_ENVVAR_MAX) {
+ e.val.eep = idx + nlen + 1;
+
+ env_list[entrycount++] = e;
+
+ idx += nlen + 1;
+ while (env_get_char(idx++) != 0 && idx < ENV_SIZE)
+ ;
+ e.name.eep = idx;
+ } else {
+ debug("** Too many environment variables!\n");
+ break;
+ }
+ }
+ qsort(env_list, entrycount, sizeof(env_item_t), comp_env_items);
+
+ return 0;
+}
+