diff options
Diffstat (limited to 'src/util')
| -rw-r--r-- | src/util/random.c | 10 | ||||
| -rw-r--r-- | src/util/random.h | 8 | ||||
| -rw-r--r-- | src/util/str.c | 38 | ||||
| -rw-r--r-- | src/util/str.h | 19 |
4 files changed, 71 insertions, 4 deletions
diff --git a/src/util/random.c b/src/util/random.c index 860cff0..eaeceaf 100644 --- a/src/util/random.c +++ b/src/util/random.c @@ -62,6 +62,16 @@ GEN random_int(unsigned long bits) { return gerepilecopy(ltop, genrand(range)); } +GEN random_range(GEN lower, GEN upper) { + pari_sp ltop = avma; + if (gequal(lower, upper)) { + return gcopy(lower); + } + + GEN range = mkvec2(lower, subis(upper, 1)); + return gerepilecopy(ltop, genrand(range)); +} + GEN random_field_element(GEN field) { switch (typ(field)) { case t_INT: diff --git a/src/util/random.h b/src/util/random.h index 56e2efd..f5844da 100644 --- a/src/util/random.h +++ b/src/util/random.h @@ -30,6 +30,14 @@ bool random_init(void); GEN random_prime(unsigned long bits); /** + * @brief + * @param lower + * @param upper + * @return + */ +GEN random_range(GEN lower, GEN upper); + +/** * @brief Generate random <code>bits</code> sized integer. * @param bits the size of the integer to generate * @return a random integer in range [2^(bits - 1), 2^bits] diff --git a/src/util/str.c b/src/util/str.c index f213c99..8b1bf92 100644 --- a/src/util/str.c +++ b/src/util/str.c @@ -5,6 +5,7 @@ #include "str.h" #include <ctype.h> #include <string.h> +#include <stdarg.h> #include "util/memory.h" const char *str_is_hex(const char *hex_str) { @@ -22,16 +23,47 @@ const char *str_is_hex(const char *hex_str) { return str_start; } -char *str_join(char *strings[], size_t len) { - size_t total = 0; +char *str_join(char *separator, char **strings, size_t len) { + size_t total = 1; for (size_t i = 0; i < len; ++i) { if (strings[i]) total += strlen(strings[i]); } + if (separator) + total += (len - 1) * strlen(separator); char *result = try_calloc(total); for (size_t i = 0; i < len; ++i) { if (strings[i]) { strcat(result, strings[i]); } + if (separator && i != len - 1) { + strcat(result, separator); + } + } + return result; +} + +char *str_joinv(char *separator, ...) { + va_list valist; + va_start(valist, separator); + + size_t len = 5; + char **strings = try_malloc(len * sizeof(char *)); + char *next; + size_t i = 0; + while ((next = va_arg(valist, char *)) != NULL) { + if (i == len) { + strings = try_realloc(strings, (len * 2) * sizeof(char *)); + } + strings[i++] = next; } + + va_end(valist); + char *result = str_join(separator, strings, i); + try_free(strings); return result; -}
\ No newline at end of file +} + +char *str_concat(char **strings, size_t len) { + return str_join(NULL, strings, len); +} + diff --git a/src/util/str.h b/src/util/str.h index 8fd2540..fb828da 100644 --- a/src/util/str.h +++ b/src/util/str.h @@ -19,10 +19,27 @@ const char *str_is_hex(const char *hex_str); /** * @brief + * @param separator * @param strings * @param len * @return */ -char *str_join(char *strings[], size_t len); +char *str_join(char *separator, char **strings, size_t len); + +/** + * @brief + * @param separator + * @param ... + * @return + */ +char *str_joinv(char *separator, ...); + +/** + * @brief + * @param strings + * @param len + * @return + */ +char *str_concat(char **strings, size_t len); #endif // ECGEN_STR_H |
