This is the very beginnings of an XML style for the output library. It still needs a lot of work. There is no quoting, and the layout still needs designing. At this point the main purpose of this code is to exercise the frontend/backend API in a different way from JSON. Signed-off-by: Julian Phillips <julian@xxxxxxxxxxxxxxxxx> --- Makefile | 1 + output-xml.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ output.c | 4 +++ output.h | 3 +- 4 files changed, 75 insertions(+), 1 deletions(-) create mode 100644 output-xml.c diff --git a/Makefile b/Makefile index dc38730..c84d7de 100644 --- a/Makefile +++ b/Makefile @@ -579,6 +579,7 @@ LIB_OBJS += object.o LIB_OBJS += output.o LIB_OBJS += output-json.o LIB_OBJS += output-normal.o +LIB_OBJS += output-xml.o LIB_OBJS += output-zero.o LIB_OBJS += pack-check.o LIB_OBJS += pack-refs.o diff --git a/output-xml.c b/output-xml.c new file mode 100644 index 0000000..9c98ac9 --- /dev/null +++ b/output-xml.c @@ -0,0 +1,68 @@ +#include "git-compat-util.h" +#include "output.h" + +static void xml_obj_start(FILE *file, const char *name) +{ + fprintf(file, "<object name=\"%s\">\n", name); +} + +static void xml_obj_end(FILE *file, const char *name) +{ + fprintf(file, "</object>\n"); +} + +static void xml_obj_item_start(FILE *file, const char *name, int first) +{ + fprintf(file, "<%s>", name); +} + +static void xml_obj_item_end(FILE *file, const char *name, int first) +{ + fprintf(file, "</%s>\n", name); +} + +static void xml_bool(FILE *file, int value) +{ + if (value) + fprintf(file, "true"); + else + fprintf(file, "false"); +} + +static void xml_str(FILE *file, const char *value) +{ + fprintf(file, "\"%s\"", value); +} + +static void xml_int(FILE *file, int64_t value) +{ + fprintf(file, "%lld", value); +} + +static void xml_uint(FILE *file, uint64_t value) +{ + fprintf(file, "%llu", value); +} + +static void xml_double(FILE *file, double value, int precision) +{ + fprintf(file, "%.*f", precision, value); +} + +struct output_ops output_xml_ops = { + xml_obj_start, + xml_obj_end, + xml_obj_item_start, + xml_obj_item_end, + + NULL, + NULL, + NULL, + NULL, + + xml_bool, + xml_str, + xml_int, + xml_uint, + xml_double, +}; diff --git a/output.c b/output.c index ac8feb1..3be1560 100644 --- a/output.c +++ b/output.c @@ -7,11 +7,13 @@ extern struct output_ops output_normal_ops; extern struct output_ops output_zero_ops; extern struct output_ops output_json_ops; +extern struct output_ops output_xml_ops; struct output_ops *output_ops[] = { &output_normal_ops, &output_zero_ops, &output_json_ops, + &output_xml_ops, }; enum output_style handle_output_arg(char *s) @@ -24,6 +26,8 @@ enum output_style handle_output_arg(char *s) return OUTPUT_ZERO; else if (!strcmp(s, "json")) return OUTPUT_JSON; + else if (!strcmp(s, "xml")) + return OUTPUT_XML; else die("Invalid output style '%s'", s); } diff --git a/output.h b/output.h index c1a09d0..cc0b921 100644 --- a/output.h +++ b/output.h @@ -5,6 +5,7 @@ enum output_style { OUTPUT_NORMAL, OUTPUT_ZERO, OUTPUT_JSON, + OUTPUT_XML, }; struct output_ops { @@ -58,7 +59,7 @@ extern struct option OUTPUT_OPTION; #define OPT_OUTPUT(s, l, v) { OPTION_STRING, (s), (l), (v), "style", \ "Use a structured output style, options: " \ - "no, zero, json (Default: zero)", \ + "no, zero, json, xml (Default: zero)", \ PARSE_OPT_OPTARG, NULL, (intptr_t)"zero" } enum output_style handle_output_arg(char *s); -- 1.7.0.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html