/* 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 .
*/
#include "autoconf.h"
#include "gdbmapp.h"
#include
#include
#include
#include
#include
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);
}