diff options
Diffstat (limited to 'src/io/output.c')
| -rw-r--r-- | src/io/output.c | 135 |
1 files changed, 120 insertions, 15 deletions
diff --git a/src/io/output.c b/src/io/output.c index 1b4b16b..7b3e8a1 100644 --- a/src/io/output.c +++ b/src/io/output.c @@ -5,17 +5,23 @@ #include "output.h" #include <parson/parson.h> +#include "math/field.h" +#include "math/curve.h" + FILE *out; FILE *debug; -char *output_scsv(const char *format, char delim, GEN vector) { - long len = lg(vector) - 1; +char *output_scsv(curve_t *curve, config_t *config) { + pari_sp ltop = avma; + GEN vector = curve_params(curve); + + long len = glength(vector); char *params[len]; size_t lengths[len]; size_t total = 0; for (long i = 0; i < len; ++i) { - params[i] = pari_sprintf(format, gel(vector, i + 1)); + params[i] = pari_sprintf("%P#x", gel(vector, i + 1)); lengths[i] = strlen(params[i]); total += lengths[i]; } @@ -33,34 +39,111 @@ char *output_scsv(const char *format, char delim, GEN vector) { offset += lengths[i]; if (i != len - 1) { - result[offset] = delim; + result[offset] = ','; offset++; } } memset(result + offset, 0, 1); + avma = ltop; return result; } -void output_csv(FILE *out, const char *format, char delim, GEN vector) { - char *string = output_scsv(format, delim, vector); +void output_fcsv(FILE *out, curve_t *curve, config_t *config) { + char *string = output_scsv(curve, config); fprintf(out, "%s\n", string); free(string); } +void output_csv(curve_t *curve, config_t *config) { + output_fcsv(out, curve, config); +} -char *output_sjson(curve_t *curve) { - /* +JSON_Value *output_jjson(curve_t *curve, config_t *config) { + pari_sp ltop = avma; + // root object/value is curve JSON_Value *root_value = json_value_init_object(); JSON_Object *root_object = json_value_get_object(root_value); - char *result = NULL; - */ - //TODO implement - return NULL; + + switch (config->field) { + case FIELD_PRIME: { + char *prime = pari_sprintf("%P#x", curve->field); + json_object_dotset_string(root_object, "field.p", prime); + pari_free(prime); + break; + } + case FIELD_BINARY: { + GEN field = field_params(curve->field); + char *e1 = pari_sprintf("%P#x", gel(field, 1)); + char *e2 = pari_sprintf("%P#x", gel(field, 2)); + char *e3 = pari_sprintf("%P#x", gel(field, 3)); + char *m = pari_sprintf("%#lx", config->bits); // maybe not? + json_object_dotset_string(root_object, "field.m", m); + json_object_dotset_string(root_object, "field.e1", e1); + json_object_dotset_string(root_object, "field.e2", e2); + json_object_dotset_string(root_object, "field.e3", e3); + pari_free(m); + pari_free(e1); + pari_free(e2); + pari_free(e3); + break; + } + default: + fprintf(stderr, "Error, field has unknown amount of elements.\n"); + exit(1); + } + + char *a = pari_sprintf("%P#x", field_elementi(curve->a)); + json_object_set_string(root_object, "a", a); + pari_free(a); + char *b = pari_sprintf("%P#x", field_elementi(curve->b)); + json_object_set_string(root_object, "b", b); + pari_free(b); + char *order = pari_sprintf("%P#x", curve->order); + json_object_set_string(root_object, "order", order); + pari_free(order); + if (curve->npoints) { + JSON_Value *points_value = json_value_init_array(); + JSON_Array *points_array = json_value_get_array(points_value); + + for (size_t i = 0; i < curve->npoints; ++i) { + JSON_Value *point_value = json_value_init_object(); + JSON_Object *point_object = json_value_get_object(point_value); + + char *x = pari_sprintf("%P#x", field_elementi(gel(curve->points[i]->point, 1))); + json_object_set_string(point_object, "x", x); + pari_free(x); + char *y = pari_sprintf("%P#x", field_elementi(gel(curve->points[i]->point, 2))); + json_object_set_string(point_object, "y", y); + pari_free(y); + char *p_order = pari_sprintf("%P#x", curve->points[i]->order); + json_object_set_string(point_object, "order", p_order); + pari_free(p_order); + json_array_append_value(points_array, point_value); + } + + json_object_set_value(root_object, "points", points_value); + } + avma = ltop; + return root_value; } -void output_json(FILE *out, GEN vector) { - //TODO implement +char *output_sjson(curve_t *curve, config_t *config) { + JSON_Value *root_value = output_jjson(curve, config); + char *result = json_serialize_to_string_pretty(root_value); + json_value_free(root_value); + + return result; +} + +void output_fjson(FILE *out, curve_t *curve, config_t *config) { + char *s = output_sjson(curve, config); + fprintf(out, "%s", s); + json_free_serialized_string(s); +} + +void output_json(curve_t *curve, config_t *config) { + output_fjson(out, curve, config); } void output_init(config_t *cfg) { @@ -76,10 +159,32 @@ void output_init(config_t *cfg) { } else { out = stdout; } + if (cfg->debug) { + debug = fopen(cfg->debug, "w"); + if (!debug) { + debug = stdout; + perror("Failed to open verbose output file."); + } + } else { + debug = stdout; + } + + switch (cfg->format) { + case FORMAT_JSON: + output_s = &output_sjson; + output_f = &output_fjson; + output_o = &output_json; + break; + case FORMAT_CSV: + output_s = &output_scsv; + output_f = &output_fcsv; + output_o = &output_csv; + break; + } } void output_quit(void) { if (out != NULL && out != stdout) { fclose(out); } -}
\ No newline at end of file +} |
