commit eeac6f3367a26a7905ecd06132ad4bbf7bf8d82e
parent f536ff8b6ab00a78e4f644d279675528530f416f
Author: olikru <olikru@tkruger.se>
Date: Tue, 16 Apr 2024 17:19:55 +0200
mostly reformatting
Diffstat:
| M | fmpzio.c | | | 81 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | fmpzio.h | | | 2 | ++ |
| M | tools/dbtool.c | | | 51 | ++++++++++++++++++++++++++++++++------------------- |
3 files changed, 115 insertions(+), 19 deletions(-)
diff --git a/fmpzio.c b/fmpzio.c
@@ -1,8 +1,14 @@
+#include <assert.h>
+#include <err.h>
#include <fmpz.h>
+#include <fmpz_vec.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
#include "fmpzio.h"
+#define BASE_ALLOC 1024
#define LINE_SIZE_MAX 8192
int
@@ -62,3 +68,78 @@ read_next_hex_fmpz(fmpz_t res)
return fmpz_set_str(res, buffer, 16);
}
+
+static char *
+read_all_stdin(const size_t base_alloc)
+{
+ size_t rsize, cread = 0, current_size = base_alloc;
+ char *buffer = malloc(base_alloc * sizeof(*buffer));
+
+ if (buffer == NULL)
+ return NULL;
+
+ rsize = fread(buffer, sizeof(*buffer), base_alloc, stdin);
+
+ while (rsize + cread == current_size) {
+ cread = current_size;
+ current_size <<= 1;
+ buffer = realloc(buffer, current_size * sizeof(*buffer));
+
+ if (buffer == NULL)
+ return NULL;
+
+ rsize = fread(&buffer[cread], sizeof(*buffer), cread, stdin);
+ }
+
+ buffer[rsize + cread] = '\0';
+
+ return buffer;
+}
+
+slong
+read_hex_lines(fmpz **v)
+{
+ assert(v != NULL);
+
+ slong i;
+ char *r = read_all_stdin(BASE_ALLOC);
+
+ if (r == NULL) {
+ err(EXIT_FAILURE, "reading entire stdin failed");
+ }
+
+ char *s = r;
+ slong ntokens = 0, tokens_alloc = BASE_ALLOC;
+ char **tokens = malloc(tokens_alloc * sizeof(*tokens));
+
+ while ((tokens[ntokens] = strsep(&s, " \n\t")) != NULL) {
+ ntokens++;
+
+ if (ntokens == tokens_alloc) {
+ tokens_alloc <<= 1;
+ tokens = realloc(tokens, tokens_alloc * sizeof(*tokens));
+
+ if (tokens == NULL) {
+ err(EXIT_FAILURE, "reallocating tokens failed");
+ }
+ }
+ }
+
+ *v = _fmpz_vec_init(ntokens);
+
+ if (*v == NULL) {
+ err(EXIT_FAILURE, "creating vector in read_hex_lines failed");
+ }
+
+ for (i = 0; i < ntokens; i++) {
+ if (fmpz_set_str(&(*v)[i], tokens[i], 16) != 0) {
+ errx(EXIT_FAILURE, "could not interpret \"%s\" as hex integer",
+ tokens[i]);
+ }
+ }
+
+ free(r);
+ free(tokens);
+
+ return ntokens;
+}
diff --git a/fmpzio.h b/fmpzio.h
@@ -19,4 +19,6 @@ int read_next_fmpz(fmpz_t res);
*/
int read_next_hex_fmpz(fmpz_t res);
+slong read_hex_lines(fmpz** v);
+
#endif
diff --git a/tools/dbtool.c b/tools/dbtool.c
@@ -3,12 +3,15 @@
*/
#include <err.h>
+#include <fmpz.h>
#include <sqlite3.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include "fmpzio.h"
+
enum command { INSERT, CREATE, NONE };
static void
@@ -27,12 +30,14 @@ create_tables(sqlite3 *db)
{
int rc;
// create a moduli table
- sqlite3_stmt* ppStmt;
- rc = sqlite3_prepare(db, "CREATE TABLE moduli (product_id INTEGER, modulus BLOB);", -1, &ppStmt, NULL);
+ sqlite3_stmt *ppStmt;
+ rc = sqlite3_prepare(
+ db, "CREATE TABLE moduli (product_id INTEGER, modulus BLOB);", -1,
+ &ppStmt, NULL);
if (rc != SQLITE_OK) {
errx(EXIT_FAILURE, "prepare statement error: %s\n",
- sqlite3_errmsg(db));
+ sqlite3_errmsg(db));
} else {
fprintf(stderr, "Prepared statement successfully\n");
}
@@ -43,8 +48,7 @@ create_tables(sqlite3 *db)
}
if (rc != SQLITE_DONE) {
- errx(EXIT_FAILURE, "step error: %s\n",
- sqlite3_errmsg(db));
+ errx(EXIT_FAILURE, "step error: %s\n", sqlite3_errmsg(db));
} else {
fprintf(stderr, "Created moduli table\n");
}
@@ -53,15 +57,17 @@ create_tables(sqlite3 *db)
if (rc != SQLITE_OK) {
errx(EXIT_FAILURE, "finalize prepared statement error: %s\n",
- sqlite3_errmsg(db));
+ sqlite3_errmsg(db));
}
// create a product_trees table
- rc = sqlite3_prepare(db, "CREATE TABLE product_trees (n_factors INTEGER, tree BLOB);", -1, &ppStmt, NULL);
+ rc = sqlite3_prepare(
+ db, "CREATE TABLE product_trees (n_factors INTEGER, tree BLOB);",
+ -1, &ppStmt, NULL);
if (rc != SQLITE_OK) {
errx(EXIT_FAILURE, "prepare statement error: %s\n",
- sqlite3_errmsg(db));
+ sqlite3_errmsg(db));
} else {
fprintf(stderr, "Prepared statement successfully\n");
}
@@ -72,8 +78,7 @@ create_tables(sqlite3 *db)
}
if (rc != SQLITE_DONE) {
- errx(EXIT_FAILURE, "step error: %s\n",
- sqlite3_errmsg(db));
+ errx(EXIT_FAILURE, "step error: %s\n", sqlite3_errmsg(db));
} else {
fprintf(stderr, "Created product_tree table\n");
}
@@ -82,10 +87,17 @@ create_tables(sqlite3 *db)
if (rc != SQLITE_OK) {
errx(EXIT_FAILURE, "finalize prepared statement error: %s\n",
- sqlite3_errmsg(db));
+ sqlite3_errmsg(db));
}
}
+static void
+insert(sqlite3 *db)
+{
+ fmpz *v;
+ read_hex_lines(&v);
+}
+
static enum command
get_command(char *str)
{
@@ -124,14 +136,15 @@ main(int argc, char *argv[])
}
switch (com) {
- case CREATE:
- create_tables(db);
- break;
- case INSERT:
- fprintf(stderr, "insert not implemented\n");
- break;
- default:
- break;
+ case CREATE:
+ create_tables(db);
+ break;
+ case INSERT:
+ insert(db);
+ fprintf(stderr, "insert not implemented\n");
+ break;
+ default:
+ break;
}
while (sqlite3_close(db) != SQLITE_OK) {