Add .gitattributes
[skeinsum.git] / skein_cli.c
index e95f4b60844f9e90db443def874a87c9e453d678..bb8235483aa91b11309102a1b26055d34436ed3e 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 2015 Jason Self <j@jxself.org>
+/* Copyright (C) 2014 2015 2019 Jason Self <j@jxself.org>
 
 This file is part of skeinsum.
 
@@ -29,7 +29,7 @@ along with skeinsum. If not, see <http://www.gnu.org/licenses/>.
 #include <glob.h>
 #include <sys/stat.h>
 #include <errno.h>
-#include "SHA3api_ref.h"
+#include "skeinapi_ref.h"
 
 #define WARN(msg, ...) fprintf(stderr, "skein%dsum: " msg, hashbitlen, ##__VA_ARGS__)
 
@@ -166,7 +166,7 @@ int HashFile(const char file_name[], char MsgDigest[], char mode)
        }
 
        unsigned char output[hashbitlen/4];
-       Hash(hashbitlen, (unsigned char*) readbuf, total_readed, output);
+       Hash(hashbitlen, (unsigned char*) readbuf, total_readed * 8, output);
 
        free(readbuf);
 
@@ -366,9 +366,18 @@ int VerifyHashesFromFile(FILE *fp, int status, int warn, int quiet)
        return (NotProper || NoMatch) ? -1 : 1;
 }
 
+void PrintStringHash(const char *s)
+{
+       unsigned char output[hashbitlen/4];
+       char digest[hashbitlen/4 + 1];
+       Hash(hashbitlen, s, strlen(s) * 8, output);
+       hash2hexstr(output, digest);
+       printf("%s -%s\n", digest, s);
+}
+
 void print_version(void)
 {
-       printf("skein%dsum 1.0\n", hashbitlen);
+       printf("skein%dsum %s\n", hashbitlen, VERSION);
        printf("License GPLv3+: GNU GPL version 3 or later\n");
        printf("<http://gnu.org/licenses/gpl.html>\n");
        printf("This is free software: you are free to change and redistribute it.\n");
@@ -378,6 +387,7 @@ void print_version(void)
 
 void print_usage(void)
 {
+
        printf("Usage: skein%dsum [OPTION]... [FILE]...\n",hashbitlen);
        printf("Print or check skein (%d-bit) checksums.\n",hashbitlen);
        printf("With no FILE, or when FILE is -, read standard input.\n"
@@ -397,11 +407,13 @@ void print_usage(void)
               "-h, --help       display this help and exit\n"
               "-V, --version    output version information and exit\n"
               "\n"
-              "The sums are computed as described in version 1.3 of the Skein\n"
+              "The sums are computed as described in version %s of the Skein\n"
               "specification. When checking, the input should be a former output of\n"
               "this program. The default mode is to print a line with checksum, a\n"
               "character indicating input mode ('*' for binary, space for text), and\n"
-              "name for each FILE.\n");
+              "name for each FILE.\n", skeinVersion);
+       printf("%s home page: %s\n", PACKAGE_NAME, PACKAGE_URL);
+        printf("Report bugs to: %s\n", PACKAGE_BUGREPORT);
        exit(1);
 }
 
@@ -432,6 +444,27 @@ int is_goodfile(const char filename[])
        return 1;  /* try it as good */
 }
 
+int warn_check_opts(int quiet, int warn, int status)
+{
+       int n = 0;
+       if(quiet == 1)
+               n = WARN("the --quiet option is meaningful only when verifying checksums\n");
+       if(status ==1)
+               n = WARN("the --status option is meaningful only when verifying checksums\n");
+       if(warn == 1)
+               n = WARN("the --warn option is meaningful only when verifying checksums\n");
+       return n;
+}
+
+int warn_gen_opts(int tag, int binary)
+{
+       int n = 0;
+       if (tag == 1)
+               n = WARN("the --tag option is meaningful only when calculating file checksums\n");
+       if (binary >= 0)
+               n = WARN("the --text and --binary options are meaningful only when calculating file checksums\n");
+       return n;
+}
 
 int main(int argc, char** argv)
 {
@@ -476,33 +509,23 @@ int main(int argc, char** argv)
 
        if (hashString > 0)
        {
+               if (warn_check_opts(quiet, warn, status) + warn_gen_opts(tag, binary))
+                       TRYHELP_GOODBYE();
+
                int n = first_file;
                if (n >= argc) {
                        WARN("command line should contain strings for hashing\n");
                        TRYHELP_GOODBYE();
                }
-               for( ; n < argc; n++) {
-                       unsigned char output[hashbitlen/4];
-                       char digest[hashbitlen/4 + 1];
-                       Hash(hashbitlen, argv[n], strlen(argv[n]), output);
-                       hash2hexstr(output, digest);
-                       printf("%s -%s\n", digest, argv[n]);
-               }
+               while (n < argc)
+                       PrintStringHash(argv[n++]);
                return 0;
        }
 
        if (check < 0)   /* READ FILES, GENERATE CHECKSUMS AND PRINT TO STDOUT.. */
        {
-               if (quiet == 1 || warn == 1 || status == 1)
-               {
-                       if(quiet == 1)
-                               WARN("the --quiet option is meaningful only when verifying checksums\n");
-                       if(status ==1)
-                               WARN("the --status option is meaningful only when verifying checksums\n");
-                       if(warn == 1)
-                               WARN("the --warn option is meaningful only when verifying checksums\n");
+               if (warn_check_opts(quiet, warn, status))
                        TRYHELP_GOODBYE();
-               }
 
                char mode = binary > 0 ? 'b' : 't';
 
@@ -533,14 +556,8 @@ int main(int argc, char** argv)
 
        if (check == 1)   /* READ LISTFILES, GENERATE HASHES, COMPARE WITH STORED, PRINT RESULT */
        {
-               if (tag == 1 || binary >= 0)
-               {
-                       if (tag == 1)
-                               WARN("the --tag option is meaningless when verifying checksums\n");
-                       if (binary >= 0)
-                               WARN("the --text and --binary options are meaningless when verifying checksums\n");
+               if (warn_gen_opts(tag, binary))
                        TRYHELP_GOODBYE();
-               }
 
                int file_index;
                for (file_index = first_file; file_index < argc; file_index++)