void zzjson_free(ZZJSON_CONFIG *config, ZZJSON *zzjson) { while (zzjson) { ZZJSON *next; switch(zzjson->type) { case ZZJSON_OBJECT: config->free(zzjson->value.object.label); zzjson_free(config, zzjson->value.object.val); break; case ZZJSON_ARRAY: zzjson_free(config, zzjson->value.array.val); break; case ZZJSON_STRING: config->free(zzjson->value.string.string); break; default: break; } next = zzjson->next; config->free(zzjson); zzjson = next; } }
void show_disk(struct s_hardware *hardware, ZZJSON_CONFIG *conf, ZZJSON **it, int drive) { config=conf; item=it; int i = drive - 0x80; struct driveinfo *d = &hardware->disk_info[i]; char mbr_name[50]={0}; char disk_size[11]={0}; get_mbr_string(hardware->mbr_ids[i], &mbr_name,sizeof(mbr_name)); if ((int)d->edd_params.sectors > 0) sectors_to_size((int)d->edd_params.sectors, disk_size); char disk[5]={0}; char edd_version[5]={0}; snprintf(disk,sizeof(disk),"0x%X",d->disk); snprintf(edd_version,sizeof(edd_version),"%X",d->edd_version); zzjson_print(config, *item); zzjson_free(config, *item); CREATE_ARRAY add_as("disk->number",disk) add_ai("disk->cylinders",d->legacy_max_cylinder +1) add_ai("disk->heads",d->legacy_max_head +1) add_ai("disk->sectors_per_track",d->legacy_sectors_per_track) add_as("disk->edd_version",edd_version) add_as("disk->size",disk_size) add_ai("disk->bytes_per_sector",(int)d->edd_params.bytes_per_sector) add_ai("disk->sectors_per_track",(int)d->edd_params.sectors_per_track) add_as("disk->host_bus",remove_spaces((char *)d->edd_params.host_bus_type)) add_as("disk->interface_type",remove_spaces((char *)d->edd_params.interface_type)) add_as("disk->mbr_name",mbr_name) add_ai("disk->mbr_id",hardware->mbr_ids[i]) END_OF_ARRAY; if (parse_partition_table(d, &show_partition_information)) { if (errno_disk) { APPEND_ARRAY add_as("disk->error", "IO Error") END_OF_APPEND; } else { APPEND_ARRAY add_as("disk->error", "Unrecognized Partition Layout") END_OF_APPEND; } } }
ZZJSON *zzjson_parse(ZZJSON_CONFIG *config) { ZZJSON *retval; int c; SKIPWS(); c = GETC(); UNGETC(c); if (c == '[') retval = parse_array(config); else if (c == '{') retval = parse_object(config); else { ERROR("expected '[' or '{'"); return NULL; } if (!retval) return NULL; SKIPWS(); c = GETC(); if (c >= 0 && !ALLOW_GARBAGE_AT_END) { ERROR("parse: garbage at end of file"); zzjson_free(config, retval); return NULL; } return retval; }
static ZZJSON *parse_object(ZZJSON_CONFIG *config) { ZZJSON *retval = NULL; int c; ZZJSON **next = &retval; SKIPWS(); c = GETC(); if (c != '{') { ERROR("object: expected '{'"); return NULL; } SKIPWS(); c = GETC(); while (c > 0 && c != '}') { ZZJSON *zzjson = NULL, *val = NULL; char *str; UNGETC(c); str = parse_string(config); if (!str) { ERROR("object: expected string"); errout_with_str: config->free(str); goto errout; } SKIPWS(); c = GETC(); if (c != ':') { ERROR("object: expected ':'"); goto errout_with_str; } SKIPWS(); val = parse_value(config); if (!val) { ERROR("object: value expected"); goto errout_with_str; } SKIPWS(); c = GETC(); if (c != ',' && c != '}') { ERROR("object: expected ',' or '}'"); errout_with_str_and_val: zzjson_free(config, val); goto errout_with_str; } if (c == ',') { SKIPWS(); c = GETC(); if (c == '}' && !ALLOW_EXTRA_COMMA) { ERROR("object: expected pair after ','"); goto errout_with_str_and_val; } } UNGETC(c); zzjson = config->calloc(1, sizeof(ZZJSON)); if (!zzjson) { MEMERROR(); goto errout_with_str_and_val; } zzjson->type = ZZJSON_OBJECT; zzjson->value.object.label = str; zzjson->value.object.val = val; *next = zzjson; next = &zzjson->next; c = GETC(); } if (c != '}') { ERROR("object: expected '}'"); goto errout; } if (!retval) { /* empty object, { } */ retval = config->calloc(1, sizeof(ZZJSON)); if (!retval) { MEMERROR(); return NULL; } retval->type = ZZJSON_OBJECT; } return retval; errout: zzjson_free(config, retval); return NULL; }
static ZZJSON *parse_array(ZZJSON_CONFIG *config) { ZZJSON *retval = NULL, **next = &retval; int c; SKIPWS(); c = GETC(); if (c != '[') { ERROR("array: expected '['"); return NULL; } SKIPWS(); c = GETC(); while (c > 0 && c != ']') { ZZJSON *zzjson = NULL, *val = NULL; UNGETC(c); SKIPWS(); val = parse_value(config); if (!val) { ERROR("array: value expected"); goto errout; } SKIPWS(); c = GETC(); if (c != ',' && c != ']') { ERROR("array: expected ',' or ']'"); errout_with_val: zzjson_free(config, val); goto errout; } if (c == ',') { SKIPWS(); c = GETC(); if (c == ']' && !ALLOW_EXTRA_COMMA) { ERROR("array: expected value after ','"); goto errout_with_val; } } UNGETC(c); zzjson = config->calloc(1, sizeof(ZZJSON)); if (!zzjson) { MEMERROR(); zzjson_free(config, val); goto errout_with_val; } zzjson->type = ZZJSON_ARRAY; zzjson->value.array.val = val; *next = zzjson; next = &zzjson->next; c = GETC(); } if (c != ']') { ERROR("array: expected ']'"); goto errout; } if (!retval) { /* empty array, [ ] */ retval = config->calloc(1, sizeof(ZZJSON)); if (!retval) { MEMERROR(); return NULL; } retval->type = ZZJSON_ARRAY; } return retval; errout: zzjson_free(config, retval); return NULL; }
void flush (ZZJSON_CONFIG *config, ZZJSON ** item) { zzjson_print(config, *item); zzjson_free(config, *item); *item=NULL; }