diff options
Diffstat (limited to 'src/gen/seed.c')
| -rw-r--r-- | src/gen/seed.c | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/gen/seed.c b/src/gen/seed.c index 505493a..49a33ff 100644 --- a/src/gen/seed.c +++ b/src/gen/seed.c @@ -4,6 +4,7 @@ */ #include "seed.h" +#include <io/config.h> #include "io/output.h" #include "util/memory.h" @@ -41,33 +42,34 @@ void seed_free(seed_t **seed) { static GEN seed_stoi(const char *cstr) { pari_sp ltop = avma; - GEN seed = gen_0; size_t len = strlen(cstr); - for (size_t i = 0; i < len; ++i) { - pari_sp btop = avma; - GEN s = stoi(cstr[i]); - s = shifti(s, (len - i - 1) * 8); - seed = addii(seed, s); - gerepileall(btop, 1, &seed); + char *seed_str; + if (len <= 3 || !(cstr[0] == '0' && (cstr[1] == 'x' || cstr[1] == 'X'))) { + seed_str = try_malloc((size_t)(len + 3)); + strncpy(seed_str + 2, cstr, len); + seed_str[0] = '0'; + seed_str[1] = 'x'; + seed_str[len + 2] = 0; + } else { + seed_str = try_malloc(len + 1); + strncpy(seed_str, cstr, len); } + GEN i = strtoi(seed_str); - return gerepilecopy(ltop, seed); + return gerepilecopy(ltop, i); } static char *seed_itos(GEN seed) { pari_sp ltop = avma; - GEN bits = binary_zv(seed); + char *result = pari_sprintf("%Px", seed); - long len = glength(bits); - long bytes = (len / 8) + (len % 8 == 0 ? 0 : 1); - char *result = try_malloc((size_t)bytes); + size_t seed_len = strlen(result); + char *seed_str = try_malloc(seed_len + 1); + strcpy(seed_str, result); - for (long i = 0; i < len; ++i) { - // TODO - } avma = ltop; - return result; + return seed_str; } GENERATOR(seed_gen_random) { @@ -81,8 +83,13 @@ GENERATOR(seed_gen_random) { GENERATOR(seed_gen_argument) { curve->seed = seed_new(); curve->seed->seed = seed_stoi(cfg->seed); - curve->seed->raw = cfg->seed; - curve->seed->raw_len = strlen(cfg->seed); + + size_t seed_len = strlen(cfg->seed); + char *seed = try_malloc(seed_len + 1); + strcpy(seed, cfg->seed); + + curve->seed->raw = seed; + curve->seed->raw_len = seed_len; return 1; } @@ -96,10 +103,16 @@ GENERATOR(seed_gen_input) { avma = ltop; return 0; } - GEN seed = seed_stoi(cstr); curve->seed = seed_new(); curve->seed->seed = gerepilecopy(ltop, seed); + + size_t seed_len = strlen(cstr); + char *seed_str = try_malloc(seed_len + 1); + strcpy(seed_str, cfg->seed); + + curve->seed->raw = seed_str; + curve->seed->raw_len = seed_len; return 1; } |
