aboutsummaryrefslogtreecommitdiff
path: root/tests/t_wordwrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/t_wordwrap.c')
-rw-r--r--tests/t_wordwrap.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/tests/t_wordwrap.c b/tests/t_wordwrap.c
new file mode 100644
index 0000000..72d3ff1
--- /dev/null
+++ b/tests/t_wordwrap.c
@@ -0,0 +1,181 @@
+/* This file is part of GDBM test suite.
+ Copyright (C) 2021-2023 Free Software Foundation, Inc.
+
+ GDBM is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ GDBM is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GDBM. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include "autoconf.h"
+#include "gdbmapp.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+
+static void
+h_left_margin (WORDWRAP_FILE wf, char *arg)
+{
+ wordwrap_set_left_margin (wf, atoi (arg));
+}
+
+static void
+h_right_margin (WORDWRAP_FILE wf, char *arg)
+{
+ wordwrap_set_right_margin (wf, atoi (arg));
+}
+
+static void
+h_flush (WORDWRAP_FILE wf, char *arg)
+{
+ wordwrap_flush (wf);
+}
+
+static void
+h_file (WORDWRAP_FILE wf, char *arg)
+{
+ FILE *fp;
+ char buf[256];
+
+ fp = fopen (arg, "r");
+ if (!fp)
+ {
+ perror (arg);
+ exit (1);
+ }
+
+ while (fgets (buf, sizeof buf, fp))
+ {
+ wordwrap_write (wf, buf, strlen (buf));
+ }
+ fclose (fp);
+}
+
+static void
+h_newline (WORDWRAP_FILE wf, char *arg)
+{
+ wordwrap_putc (wf, '\n');
+}
+
+static void
+h_para (WORDWRAP_FILE wf, char *arg)
+{
+ wordwrap_para (wf);
+}
+
+
+struct wwt_option
+{
+ char *name;
+ int arg;
+ void (*handler) (WORDWRAP_FILE, char *);
+};
+
+struct wwt_option wwt_options[] = {
+ { "left", 1, h_left_margin },
+ { "right", 1, h_right_margin },
+ { "flush", 0, h_flush },
+ { "file", 1, h_file },
+ { "newline", 0, h_newline },
+ { "para", 0, h_para },
+ { NULL }
+};
+
+enum
+ {
+ WWT_ARG,
+ WWT_OPT,
+ WWT_ERR
+ };
+
+int
+wwt_getopt (WORDWRAP_FILE wf, char *arg)
+{
+ if (arg[0] == '-')
+ {
+ struct wwt_option *opt;
+ size_t len;
+
+ if (arg[1] == '-' && arg[2] == 0)
+ return WWT_ARG;
+
+ arg++;
+ len = strcspn (arg, "=");
+
+ for (opt = wwt_options; opt->name; opt++)
+ {
+ if (strlen (opt->name) == len && memcmp (opt->name, arg, len) == 0)
+ {
+ if (opt->arg && arg[len])
+ arg += len + 1;
+ else if (!opt->arg && !arg[len])
+ arg = NULL;
+ else
+ continue;
+ opt->handler (wf, arg);
+ return WWT_OPT;
+ }
+ }
+ return WWT_ERR;
+ }
+ return WWT_ARG;
+}
+
+int
+main (int argc, char **argv)
+{
+ WORDWRAP_FILE wf;
+ int escape = 0;
+
+ setlocale (LC_ALL, "");
+ if ((wf = wordwrap_fdopen (1)) == NULL)
+ {
+ perror ("wordwrap_open");
+ exit (1);
+ }
+
+ while (--argc)
+ {
+ char *arg = *++argv;
+
+ if (escape)
+ {
+ wordwrap_write (wf, arg, strlen (arg));
+ if (argc > 1)
+ wordwrap_write (wf, " ", 1);
+ escape = 0;
+ continue;
+ }
+
+ switch (wwt_getopt (wf, arg))
+ {
+ case WWT_ARG:
+ if (strcmp (arg, "--") == 0)
+ escape = 1;
+ else
+ {
+ wordwrap_write (wf, arg, strlen (arg));
+ if (argc > 1)
+ wordwrap_write (wf, " ", 1);
+ }
+ break;
+
+ case WWT_OPT:
+ break;
+
+ case WWT_ERR:
+ fprintf (stderr, "unrecognized option: %s\n", arg);
+ }
+ }
+
+ wordwrap_close (wf);
+}

Return to:

Send suggestions and report system problems to the System administrator.