Catcrypt tools: Roll out progress indicator stuff from hashsum.
[u/mdw/catacomb] / cc.h
diff --git a/cc.h b/cc.h
index f7b12d0..6f92978 100644 (file)
--- a/cc.h
+++ b/cc.h
 
 /*----- Header files ------------------------------------------------------*/
 
+#if _FILE_OFFSET_BITS != 64
+#  error "Must set _FILE_OFFSET_BITS to 64."
+#endif
+
 #include <stdio.h>
 #include <string.h>
+#include <time.h>
 
 #include <mLib/dstr.h>
 
 
 /*----- Data structures ---------------------------------------------------*/
 
+/* --- Progress indicators --- */
+
+typedef struct fprogress {
+  const char *bp;
+  off_t o, sz, olast;
+  time_t start, last;
+  char name[24];
+} fprogress;
+
 /* --- Key encapsulation --- */
 
 typedef struct kem {
@@ -82,7 +96,7 @@ typedef struct sig {
   const struct sigops *ops;
   key_packdef *kp;
   void *kd;
-  gchash *ch;
+  const gchash *ch;
   ghash *h;
 } sig;
 
@@ -114,6 +128,7 @@ typedef struct enc {
 typedef struct encops {
   const char *name;
   const char *rmode, *wmode;
+  int nraw, ncook;
   enc *(*initenc)(FILE */*fp*/, const char */*msg*/);
   enc *(*initdec)(FILE */*fp*/,
                  int (*/*func*/)(const char *, void *), void */*p*/);
@@ -258,24 +273,26 @@ extern void freeenc(enc */*e*/);
 
 #define CMD_ENCODE {                                                   \
   "encode", cmd_encode,                                                        \
-    "encode [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]",                        \
+    "encode [-p] [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]",           \
     "\
 Options:\n\
 \n\
 -f, --format=FORMAT    Encode to FORMAT.\n\
 -b, --boundary=LABEL   PEM boundary is LABEL.\n\
 -o, --output=FILE      Write output to FILE.\n\
+-p, --progress         Show progress on large files.\n\
 " }
 
 #define CMD_DECODE {                                                   \
   "decode", cmd_decode,                                                        \
-    "decode [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]",                        \
+    "decode [-p] [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]",           \
     "\
 Options:\n\
 \n\
 -f, --format=FORMAT    Decode from FORMAT.\n\
 -b, --boundary=LABEL   PEM boundary is LABEL.\n\
 -o, --output=FILE      Write output to FILE.\n\
+-p, --progress         Show progress on large files.\n\
 " }
 
 extern int cmd_encode(int /*argc*/, char */*argv*/[]);
@@ -387,6 +404,58 @@ const cmd *findcmd(const cmd */*cmds*/, const char */*name*/);
 extern void sc_help(const cmd */*cmds*/, FILE */*fp*/,
                    char *const */*argv*/);
 
+/*----- Progress indicators -----------------------------------------------*/
+
+/* --- @fprogress_init@ --- *
+ *
+ * Arguments:  @fprogress *f@ = progress context to be initialized
+ *             @const char *name@ = file name string to show
+ *             @FILE *fp@ = file we're reading from
+ *
+ * Returns:    Zero on success, nonzero if the file's state is now broken.
+ *
+ * Use:                Initializes a progress context.  Nothing is actually
+ *             displayed yet.
+ */
+
+extern int fprogress_init(fprogress */*f*/,
+                         const char */*name*/, FILE */*fp*/);
+
+/* --- @fprogress_update@ --- *
+ *
+ * Arguments:  @fprogress *f@ = progress context
+ *             @size_t n@ = how much progress has been made
+ *
+ * Returns:    ---
+ *
+ * Use:                Maybe updates the display to show that some progress has been
+ *             made.
+ */
+
+extern void fprogress_update(fprogress */*f*/, size_t /*n*/);
+
+/* --- @fprogress_clear@ --- *
+ *
+ * Arguments:  @fprogress *f@ = progress context
+ *
+ * Returns:    ---
+ *
+ * Use:                Clears the progress display from the screen.
+ */
+
+extern void fprogress_clear(fprogress */*f*/);
+
+/* --- @fprogress_done@ --- *
+ *
+ * Arguments:  @fprogress *f@ = progress context
+ *
+ * Returns:    ---
+ *
+ * Use:                Clear up the progress context and removes any display.
+ */
+
+extern void fprogress_done(fprogress */*f*/);
+
 /*----- That's all, folks -------------------------------------------------*/
 
 #ifdef __cplusplus