static void do_alias(int argc, char *argv[]) { char name[80]; char *val; struct config_option opt; switch (argc) { case 2: make_alias(name, argv[1]); if (flash_get_config(name, &val, CONFIG_STRING)) { diag_printf("'%s' = '%s'\n", argv[1], val); } else { diag_printf("'%s' not found\n", argv[1]); } break; case 3: if (strlen(argv[2]) >= MAX_STRING_LENGTH) { diag_printf("Sorry, value is too long\n"); break; } make_alias(name, argv[1]); opt.type = CONFIG_STRING; opt.enable = (char *)0; opt.enable_sense = 1; opt.key = name; opt.dflt = (CYG_ADDRESS)argv[2]; flash_add_config(&opt, true); break; default: diag_printf("usage: alias name [value]\n"); } }
// Lookup an alias. First try plain string aliases. If that fails try // other types so allowing access to all configured values. This allows // for alias (macro) expansion of normal 'fconfig' data, such as the // board IP address. char * flash_lookup_alias(char *alias, char *alias_buf) { char name[80]; char *val; unsigned char * dp; void *val_ptr; int type; bool hold_bool_val; long hold_long_val; #ifdef CYGPKG_REDBOOT_NETWORKING int esa_ptr; #endif make_alias(name, alias); if (flash_get_config(name, &val, CONFIG_STRING)) { return val; } else { dp = flash_lookup_config(alias); if (dp) { val_ptr = (void *)CONFIG_OBJECT_VALUE(dp); switch (type = CONFIG_OBJECT_TYPE(dp)) { case CONFIG_BOOL: memcpy(&hold_bool_val, val_ptr, sizeof(bool)); diag_sprintf(alias_buf, "%s", hold_bool_val ? "true" : "false"); break; case CONFIG_INT: memcpy(&hold_long_val, val_ptr, sizeof(unsigned long)); diag_sprintf(alias_buf,"%ld", hold_long_val); break; #ifdef CYGPKG_REDBOOT_NETWORKING case CONFIG_IP: diag_sprintf(alias_buf,"%s", inet_ntoa((in_addr_t *)val_ptr)); break; case CONFIG_ESA: for (esa_ptr = 0; esa_ptr < sizeof(enet_addr_t); esa_ptr++) { diag_sprintf(alias_buf+(3*esa_ptr), "0x%02X", ((unsigned char *)val_ptr)[esa_ptr]); if (esa_ptr < (sizeof(enet_addr_t)-1)) diag_printf(":"); } break; #endif case CONFIG_SCRIPT: return (char *) val_ptr; break; default: return (char *)NULL; } return alias_buf; } return (char *)NULL; } }
static ERL_NIF_TERM process_events(ErlNifEnv* env, events_t **events, yaml_parser_t *parser, int flags) { ERL_NIF_TERM els, el; yaml_event_t *event; els = enif_make_list(env, 0); if (events) { while (*events) { event = hd(events); if (event) { switch (event->type) { case YAML_SEQUENCE_END_EVENT: el = process_events(env, events, parser, flags); els = enif_make_list_cell(env, el, els); break; case YAML_MAPPING_END_EVENT: el = process_events(env, events, parser, flags); els = enif_make_list_cell(env, el, els); break; case YAML_MAPPING_START_EVENT: yaml_event_delete(event); enif_free(event); return zip(env, els); case YAML_SEQUENCE_START_EVENT: yaml_event_delete(event); enif_free(event); return els; case YAML_SCALAR_EVENT: el = make_scalar(env, event, flags); els = enif_make_list_cell(env, el, els); break; case YAML_ALIAS_EVENT: el = make_alias(env, event); els = enif_make_list_cell(env, el, els); break; default: break; } yaml_event_delete(event); enif_free(event); } else { break; } } } return els; }