aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/common.c19
-rw-r--r--src/common.h3
-rw-r--r--src/keccaksum.c46
3 files changed, 62 insertions, 6 deletions
diff --git a/src/common.c b/src/common.c
index a1afe28..f75657a 100644
--- a/src/common.c
+++ b/src/common.c
@@ -42,6 +42,11 @@
+static char* restrict hashsum = NULL;
+static char* restrict hexsum = NULL;
+
+
+
/**
* Print the checksum of a file
*
@@ -62,8 +67,6 @@ int print_checksum(const char* restrict filename, libkeccak_generalised_spec_t*
libkeccak_spec_t spec;
libkeccak_state_t state;
int r, fd;
- static char* restrict hashsum = NULL;
- static char* restrict hexsum = NULL;
size_t length;
if (r = libkeccak_degeneralise_spec(gspec, &spec), r)
@@ -120,6 +123,9 @@ int print_checksum(const char* restrict filename, libkeccak_generalised_spec_t*
return USER_ERROR("unknown error in algorithm parameters");
}
+ if (squeezes <= 0)
+ return USER_ERROR("the squeeze count be be positive");
+
if (verbose)
{
fprintf(stderr, "rate: %li\n", gspec->bitrate);
@@ -175,9 +181,12 @@ int print_checksum(const char* restrict filename, libkeccak_generalised_spec_t*
}
}
- free(hashsum);
- free(hexsum);
-
return 0;
}
+
+void cleanup(void)
+{
+ free(hashsum), hashsum = NULL;
+ free(hexsum), hexsum = NULL;
+}
diff --git a/src/common.h b/src/common.h
index 36582a8..76cd4da 100644
--- a/src/common.h
+++ b/src/common.h
@@ -59,5 +59,8 @@ int print_checksum(const char* restrict filename, libkeccak_generalised_spec_t*
const char* restrict execname);
+void cleanup(void);
+
+
#endif
diff --git a/src/keccaksum.c b/src/keccaksum.c
index 94013e0..f323852 100644
--- a/src/keccaksum.c
+++ b/src/keccaksum.c
@@ -18,12 +18,56 @@
*/
#include "common.h"
+#include <stdlib.h>
+
+#include <argparser.h>
+
+
+#define ADD(arg, desc, ...) \
+ args_add_option(args_new_argumented(NULL, arg, 0, __VA_ARGS__, NULL), desc)
+
int main(int argc, char* argv[])
{
libkeccak_generalised_spec_t spec;
+ long squeezes = 1;
+ int r, verbose = 1;
+ size_t i;
libkeccak_generalised_spec_initialise(&spec);
- return print_checksum(argv[1], &spec, 1, "", REPRESENTATION_UPPER_CASE, 1, argv[0]);
+
+ args_init("Keccak checksum calculator",
+ "keccaksum [options...] [--] [files...]", NULL,
+ NULL, 1, 0, args_standard_abbreviations);
+
+ ADD("RATE", "Select rate", "-r", "--bitrate", "--rate");
+ ADD("CAPACITY", "Select capacity", "-c", "--capacity");
+ ADD("SIZE", "Select output size", "-n", "-o", "--output-size", "--output");
+ ADD("SIZE", "Select state size", "-s", "-b", "--state-size", "--state");
+ ADD("SIZE", "Select word size", "-w", "--word-size", "--word");
+ ADD("COUNT", "Select squeeze count", "-z", "--squeezes");
+ /* TODO more options */
+
+ args_parse(argc, argv);
+
+ /* TODO stricter parsing */
+
+ if (args_opts_used("-r")) spec.bitrate = atol(*(args_opts_get("-r")));
+ if (args_opts_used("-c")) spec.capacity = atol(*(args_opts_get("-c")));
+ if (args_opts_used("-n")) spec.output = atol(*(args_opts_get("-n")));
+ if (args_opts_used("-s")) spec.state_size = atol(*(args_opts_get("-s")));
+ if (args_opts_used("-w")) spec.word_size = atol(*(args_opts_get("-w")));
+ if (args_opts_used("-z")) squeezes = atol(*(args_opts_get("-z")));
+
+ if (args_files_count == 0)
+ r = print_checksum("-", &spec, squeezes, "", REPRESENTATION_UPPER_CASE, verbose, *argv);
+ else
+ for (i = 0; i < args_files_count; i++, verbose = 0)
+ if ((r = print_checksum(args_files[i], &spec, squeezes, "", REPRESENTATION_UPPER_CASE, verbose, *argv)))
+ break;
+
+ args_dispose();
+ cleanup();
+ return r;
}