Example #1
0
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;
}
Example #2
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);
}