static int generate_product_definition(const char *filename, const harp_product_definition *product_definition) { FILE *fout; int i; int j; fout = fopen(filename, "w"); if (fout == NULL) { harp_set_error(HARP_ERROR_FILE_OPEN, "could not open file '%s' for writing", filename); return -1; } fputs(":orphan: true\n\n", fout); fputs(product_definition->name, fout); fputc('\n', fout); fnputc(strlen(product_definition->name), '=', fout); fnputc(2, '\n', fout); fputs("Variables\n", fout); fputs("---------\n", fout); fprintf(fout, "The table below lists the variables that are present in the HARP product that results from an " "ingestion of ``%s`` data.\n\n", product_definition->name); fputs(".. csv-table::\n", fout); fputs(" :widths: 25 5 15 15 40\n", fout); fputs(" :header-rows: 1\n\n", fout); fputs(" \"field name\", \"type\", \"dimensions\", \"unit\", \"description\"\n", fout); for (i = 0; i < product_definition->num_variable_definitions; i++) { harp_variable_definition *variable_definition = product_definition->variable_definition[i]; fnputc(3, ' ', fout); fputc('"', fout); fprintf(fout, "**%s**", variable_definition->name); fputc('"', fout); fputs(", ", fout); fputc('"', fout); fputs(harp_get_data_type_name(variable_definition->data_type), fout); fputc('"', fout); fputs(", ", fout); fputc('"', fout); if (variable_definition->num_dimensions > 0) { fputc('{', fout); for (j = 0; j < variable_definition->num_dimensions; j++) { if (j > 0) { fputs(", ", fout); } if (variable_definition->dimension_type[j] == harp_dimension_independent) { fprintf(fout, "%ld", variable_definition->dimension[j]); } else { fprintf(fout, "*%s*", harp_get_dimension_type_name(variable_definition->dimension_type[j])); } } fputc('}', fout); } fputc('"', fout); fputs(", ", fout); fputc('"', fout); if (variable_definition->unit != NULL && strlen(variable_definition->unit) > 0) { fputs(variable_definition->unit, fout); } fputc('"', fout); fputs(", ", fout); fputc('"', fout); if (variable_definition->description != NULL) { fputs(variable_definition->description, fout); } fputc('"', fout); fputc('\n', fout); } if (product_definition_has_mapping_description(product_definition)) { int column_width[3] = { 0 }; int span_width; fputc('\n', fout); fputs("Mapping description\n", fout); fputs("-------------------\n", fout); fputs("The table below details where and how each variable was retrieved from the input product.\n\n", fout); if (product_definition->mapping_description != NULL) { fprintf(fout, "%s\n\n", product_definition->mapping_description); } for (i = 0; i < product_definition->num_variable_definitions; i++) { harp_variable_definition *variable_definition = product_definition->variable_definition[i]; if (variable_definition->num_mappings == 0 && variable_definition->exclude == NULL) { continue; } column_width[0] = max(column_width[0], scprintf("**%s**", variable_definition->name)); if (variable_definition->exclude != NULL) { column_width[1] = max(column_width[1], strlen("*available*")); column_width[2] = max(column_width[2], strlen("optional")); } for (j = 0; j < variable_definition->num_mappings; j++) { harp_mapping_description *mapping = variable_definition->mapping[j]; if (mapping->ingestion_option != NULL || mapping->condition != NULL) { column_width[1] = max(column_width[1], strlen("*condition*")); if (mapping->ingestion_option != NULL && mapping->condition != NULL) { column_width[2] = max(column_width[2], scprintf("%s and %s", mapping->ingestion_option, mapping->condition)); } else if (mapping->ingestion_option != NULL) { column_width[2] = max(column_width[2], strlen(mapping->ingestion_option)); } else { column_width[2] = max(column_width[2], strlen(mapping->condition)); } } if (mapping->path != NULL) { column_width[1] = max(column_width[1], strlen("*path*")); column_width[2] = max(column_width[2], scprintf("**%s**", mapping->path)); } if (mapping->description != NULL) { column_width[1] = max(column_width[1], strlen("*description*")); column_width[2] = max(column_width[2], strlen(mapping->description)); } } } /* Adjust maximum column widths for the header fields. Note that the second header field spans two columns. * If the length of the second header field is larger than the maximum widths of the spanned columns combined, * the width of the last column is increased such that the combined width matches the length of the second * header field. */ column_width[0] = max(column_width[0], strlen("field name")); span_width = max(strlen("mapping description"), column_width[1] + 3 + column_width[2]); if (span_width > column_width[1] + 3 + column_width[2]) { column_width[2] = span_width - (column_width[1] + 3); } fputc('+', fout); fnputc(column_width[0] + 2, '-', fout); fputc('+', fout); fnputc(span_width + 2, '-', fout); fputc('+', fout); fputc('\n', fout); fputs("| ", fout); print_padded_string(fout, column_width[0], "%s", "field name"); fputs(" | ", fout); print_padded_string(fout, span_width, "%s", "mapping description"); fputs(" |\n", fout); fputc('+', fout); fnputc(column_width[0] + 2, '=', fout); fputc('+', fout); fnputc(column_width[1] + 2, '=', fout); fputc('+', fout); fnputc(column_width[2] + 2, '=', fout); fputc('+', fout); fputc('\n', fout); for (i = 0; i < product_definition->num_variable_definitions; i++) { harp_variable_definition *variable_definition = product_definition->variable_definition[i]; int first_row = 1; if (variable_definition->num_mappings == 0 && variable_definition->exclude == NULL) { continue; } fputs("| ", fout); print_padded_string(fout, column_width[0], "**%s**", variable_definition->name); fputs(" | ", fout); if (variable_definition->exclude != NULL) { print_padded_string(fout, column_width[1], "%s", "*available*"); fputs(" | ", fout); print_padded_string(fout, column_width[2], "%s", "optional"); fputs(" |\n", fout); first_row = 0; } for (j = 0; j < variable_definition->num_mappings; j++) { harp_mapping_description *mapping = variable_definition->mapping[j]; if (mapping->ingestion_option != NULL || mapping->condition != NULL) { if (!first_row) { fputc('+', fout); fnputc(column_width[0] + 2, ' ', fout); fputc('+', fout); fnputc(column_width[1] + 2, '-', fout); fputc('+', fout); fnputc(column_width[2] + 2, '-', fout); fputc('+', fout); fputc('\n', fout); fputs("| ", fout); fnputc(column_width[0], ' ', fout); fputs(" | ", fout); } else { first_row = 0; } print_padded_string(fout, column_width[1], "%s", "*condition*"); fputs(" | ", fout); if (mapping->ingestion_option != NULL && mapping->condition != NULL) { print_padded_string(fout, column_width[2], "%s and %s", mapping->ingestion_option, mapping->condition); } else if (mapping->ingestion_option != NULL) { print_padded_string(fout, column_width[2], "%s", mapping->ingestion_option); } else { print_padded_string(fout, column_width[2], "%s", mapping->condition); } fputs(" |\n", fout); } if (mapping->path != NULL) { if (!first_row) { fputc('+', fout); fnputc(column_width[0] + 2, ' ', fout); fputc('+', fout); fnputc(column_width[1] + 2, '-', fout); fputc('+', fout); fnputc(column_width[2] + 2, '-', fout); fputc('+', fout); fputc('\n', fout); fputs("| ", fout); fnputc(column_width[0], ' ', fout); fputs(" | ", fout); } else { first_row = 0; } print_padded_string(fout, column_width[1], "%s", "*path*"); fputs(" | ", fout); print_padded_string(fout, column_width[2], "**%s**", mapping->path); fputs(" |\n", fout); } if (mapping->description != NULL) { if (!first_row) { fputc('+', fout); fnputc(column_width[0] + 2, ' ', fout); fputc('+', fout); fnputc(column_width[1] + 2, '-', fout); fputc('+', fout); fnputc(column_width[2] + 2, '-', fout); fputc('+', fout); fputc('\n', fout); fputs("| ", fout); fnputc(column_width[0], ' ', fout); fputs(" | ", fout); } else { first_row = 0; } print_padded_string(fout, column_width[1], "%s", "*description*"); fputs(" | ", fout); print_padded_string(fout, column_width[2], "%s", mapping->description); fputs(" |\n", fout); } } fputc('+', fout); fnputc(column_width[0] + 2, '-', fout); fputc('+', fout); fnputc(column_width[1] + 2, '-', fout); fputc('+', fout); fnputc(column_width[2] + 2, '-', fout); fputc('+', fout); fputc('\n', fout); } } fclose(fout); return 0; }
void format_pretty_list (xmmsc_connection_t *conn, GList *list) { guint count = 0; GList *n; gint columns; gchar *format_header, *format_rows; columns = find_terminal_width (); format_header = make_justified_columns_format (columns, 's'); format_rows = make_justified_columns_format (columns, 'd'); print_padded_string (columns, '-', TRUE, "-[Result]-"); print_info (format_header, "Id", "Artist", "Album", "Title"); for (n = list; n; n = g_list_next (n)) { const gchar *title; xmmsc_result_t *res; xmmsv_t *propdict, *val; gint mid = XPOINTER_TO_INT (n->data); if (!mid) { print_error ("Empty result!"); } res = xmmsc_medialib_get_info (conn, mid); xmmsc_result_wait (res); propdict = xmmsc_result_get_value (res); val = xmmsv_propdict_to_dict (propdict, NULL); if (xmmsv_dict_entry_get_string (val, "title", &title)) { const gchar *artist, *album; if (!xmmsv_dict_entry_get_string (val, "artist", &artist)) { artist = "Unknown"; } if (!xmmsv_dict_entry_get_string (val, "album", &album)) { album = "Unknown"; } print_info (format_rows, mid, artist, album, title); } else { const gchar *url; xmmsv_dict_entry_get_string (val, "url", &url); if (url) { gchar *filename = g_path_get_basename (url); if (filename) { print_info ("%-5.5d| %s", mid, filename); g_free (filename); } } } count++; xmmsv_unref (val); xmmsc_result_unref (res); } print_padded_string (columns, '-', FALSE, "-[Count:%6.d]-----", count); g_free (format_header); g_free (format_rows); }