summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tools/catcho.c204
1 files changed, 0 insertions, 204 deletions
diff --git a/tools/catcho.c b/tools/catcho.c
deleted file mode 100644
index 3426e50..0000000
--- a/tools/catcho.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * catcho - outputing text to the standard output
- *
- * Usage
- * -----
- * catcho [options]
- *
- * Options
- * -------
- * -m --mode MODE Set the initial text mode (Default: passthrough)
- * -v --version Display program information and exit
- * -V --verbose Duplicate stdout on stderr
- *
- * Modes
- * -----
- * passthru / passthrough / normal / n - Input is copied to output verbatim.
- * null / z - Input is dropped.
- * hb - Input (interpreted as hex) is compressed to bytes on the output.
- * bh - The opposite of hb.
- * ib - Input (interpreted as bit-bytes) is compressed to bytes on the output.
- * bi - The opposite of ib.
- *
- * Append 'f' to any mode (eg: bhf): Input is interpreted as '\n'-delimited
- * filenames. File contents are filtered based on mode and sent to output.
- *
- * Switching modes
- * ---------------
- * When catcho receives signal SIGINT (ctrl-C from the terminal, for example),
- * any pending input/output is flushed and catcho then interprets the input
- * as a mode name terminated by a '\n'. Once the input provides a string\n,
- * it switches the desired mode and input processing resumes.
- *
- * Exiting catcho
- * --------------
- * Since SIGINT is used for mode switching, the 'normal' way to terminate
- * catcho is by sending it an End-Of-File byte on its input. (ctrl-D on your
- * terminal)
- */
-
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <signal.h>
-
-#define LAST_STR_CHAR(s) (s[strlen(s)-1])
-
-/* modes */
-enum mode
-{
- N,
- Z,
- HB,
- BH,
- IB,
- BI
-};
-
-/* global state */
-static enum mode current_mode = N;
-static int current_mode_f = 0;
-static int current_verbose = 0;
-
-static size_t ccfwrite(const void *ptr, size_t size, size_t nmemb)
-{
- size_t ret;
- ret = fwrite(ptr, size, nmemb, stdout);
-
- if (current_verbose)
- fwrite(ptr, size, nmemb, stderr);
-
- return ret;
-}
-
-static void sigint(int sig)
-{
- (void)sig;
- ccfwrite("in signal handler\n", 18, 1);
-}
-
-static int set_mode(const char *mode)
-{
- if (!mode)
- return 0;
-
- if (!strcmp(mode, "passthru") || // these don't support 'f' suffix
- !strcmp(mode, "passthrough") ||
- !strcmp(mode, "normal"))
- {
- current_mode = N;
- current_mode_f = 0;
- }
- else if (!strcmp(mode, "null")) // this doesn't support 'f' suffix
- {
- current_mode = Z;
- current_mode_f = 0;
- }
- else if (!strncmp(mode, "n", 1))
- {
- current_mode = N;
- current_mode_f = (LAST_STR_CHAR(mode) == 'f');
- }
- else if (!strncmp(mode, "z", 1))
- {
- current_mode = Z;
- current_mode_f = (LAST_STR_CHAR(mode) == 'f');
- }
- else if (!strncmp(mode, "hb", 2))
- {
- current_mode = HB;
- current_mode_f = (LAST_STR_CHAR(mode) == 'f');
- }
- else if (!strncmp(mode, "bh", 2))
- {
- current_mode = BH;
- current_mode_f = (LAST_STR_CHAR(mode) == 'f');
- }
- else if (!strncmp(mode, "ib", 2))
- {
- current_mode = IB;
- current_mode_f = (LAST_STR_CHAR(mode) == 'f');
- }
- else if (!strncmp(mode, "bi", 2))
- {
- current_mode = BI;
- current_mode_f = (LAST_STR_CHAR(mode) == 'f');
- }
- else
- {
- fprintf(stderr, "Mode string '%s' not recognized\n", mode);
- return 0;
- }
-
- return 1;
-}
-
-void show_version(const char *name)
-{
- printf("%s version 1.0\n", name);
-}
-
-int main(int argc, char **argv)
-{
- /*
- * handling command-line arguments:
- * i'm going to leave opterr alone (defaults to non-zero)
- * \this causes getopt to print its own error messages to
- * stderr if things go wrong, which is fine.
- */
-
- const char *shortopts = "m:vV";
-
- const struct option longopts[] = {
- { "mode", required_argument, NULL, 'm' },
- { "version", no_argument, NULL, 'v' },
- { "verbose", no_argument, NULL, 'V' },
- { NULL, 0, NULL, 0 }
- };
-
- int opt;
-
- while ((opt = getopt_long(argc, argv, shortopts, longopts, NULL)) != -1)
- {
- switch (opt)
- {
- case '?':
- return 1;
-
- case 'm':
- if (!set_mode(optarg))
- return 1;
- break;
-
- case 'v':
- show_version(argv[0]);
- return 0;
-
- case 'V':
- current_verbose = 1;
- break;
- }
- }
-
- /* setup signals (mode switch) */
- signal(SIGINT, &sigint);
-
-
- char memes[4];
- fread(memes, 4, 1, stdin);
- switch (current_mode)
- {
- case N: printf("NORMAL\n"); break;
- case Z: printf("NULL\n"); break;
- case HB: printf("hex to bytes\n"); break;
- case BH: printf("bytes to hex\n"); break;
- case IB: printf("bits to bytes\n"); break;
- case BI: printf("bytes to bits\n"); break;
- }
-
- printf("file mode: %i\n", current_mode_f);
- printf("verbose mode: %i\n", current_verbose);
-
- return 0;
-}