diff options
| author | J08nY | 2018-03-28 19:15:54 +0200 |
|---|---|---|
| committer | J08nY | 2018-03-28 19:15:54 +0200 |
| commit | ee5faa5ee336d90733d7ccb1e82497901b86637a (patch) | |
| tree | 36d30b5caf5970dfbb8eaf4f3da3577a97d22ff0 /src/obj/curve.c | |
| parent | 72f2a5d4fb0aaa054fb73e30944c10a41c830727 (diff) | |
| parent | f75446e573fb7d06be668b1dcdeb418f89b81af1 (diff) | |
| download | ecgen-ee5faa5ee336d90733d7ccb1e82497901b86637a.tar.gz ecgen-ee5faa5ee336d90733d7ccb1e82497901b86637a.tar.zst ecgen-ee5faa5ee336d90733d7ccb1e82497901b86637a.zip | |
Diffstat (limited to 'src/obj/curve.c')
| -rw-r--r-- | src/obj/curve.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/obj/curve.c b/src/obj/curve.c new file mode 100644 index 0000000..4821442 --- /dev/null +++ b/src/obj/curve.c @@ -0,0 +1,65 @@ + +#include "curve.h" +#include "gen/seed.h" +#include "obj/subgroup.h" + +OBJ(curve, curve_t, curve_copy, curve_clone) + +curve_t *curve_copy(const curve_t *src, curve_t *dest) { + if (src->seed) dest->seed = seed_new_copy(src->seed); + if (src->field) dest->field = gcopy(src->field); + if (src->a) dest->a = gcopy(src->a); + if (src->b) dest->b = gcopy(src->b); + if (src->curve) dest->curve = gcopy(src->curve); + if (src->order) dest->order = gcopy(src->order); + if (src->generators) { + dest->generators = subgroups_new_copy(src->generators, src->ngens); + dest->ngens = src->ngens; + } + return dest; +} + +curve_t *curve_clone(const curve_t *src, curve_t *dest) { + if (src->seed) dest->seed = seed_new_clone(src->seed); + if (src->field) dest->field = gclone(src->field); + if (src->a) dest->a = gclone(src->a); + if (src->b) dest->b = gclone(src->b); + if (src->curve) dest->curve = gclone(src->curve); + if (src->order) dest->order = gclone(src->order); + if (src->generators) { + dest->generators = subgroups_new_clone(src->generators, src->ngens); + dest->ngens = src->ngens; + } + return dest; +} + +void curve_free(curve_t **curve) { + if (*curve) { + seed_free(&(*curve)->seed); + subgroups_free_deep(&(*curve)->generators, (*curve)->ngens); + + if ((*curve)->curve) { + // TODO, this is possibly dangerous... + obj_free((*curve)->curve); + if (isclone((*curve)->curve)) { + gunclone((*curve)->curve); + } + } + + if ((*curve)->field && isclone((*curve)->field)) { + gunclone((*curve)->field); + } + if ((*curve)->a && isclone((*curve)->a)) { + gunclone((*curve)->a); + } + if ((*curve)->b && isclone((*curve)->b)) { + gunclone((*curve)->b); + } + if ((*curve)->order && isclone((*curve)->order)) { + gunclone((*curve)->order); + } + + try_free(*curve); + *curve = NULL; + } +}
\ No newline at end of file |
