diff --git a/usr.bin/Makefile b/usr.bin/Makefile index 865be938c37..37b672cd4d5 100644 --- a/usr.bin/Makefile +++ b/usr.bin/Makefile @@ -1,7 +1,7 @@ # From: @(#)Makefile 8.3 (Berkeley) 1/7/94 # $FreeBSD$ -.include +.include # XXX MISSING: deroff diction graph learn plot # spell spline struct xsend @@ -149,6 +149,7 @@ SUBDIR= alias \ shar \ showmount \ sockstat \ + soeliminate \ sort \ split \ stat \ @@ -164,7 +165,6 @@ SUBDIR= alias \ ${_tests} \ tftp \ time \ - timeout \ tip \ top \ touch \ @@ -184,6 +184,7 @@ SUBDIR= alias \ unvis \ uudecode \ uuencode \ + vi \ vis \ vmstat \ w \ @@ -233,10 +234,6 @@ SUBDIR+= calendar _clang= clang .endif -.if ${MK_FMAKE} != "no" -SUBDIR+= make -.endif - .if ${MK_GPL_DTC} != "yes" SUBDIR+= dtc .endif @@ -269,6 +266,10 @@ SUBDIR+= drill SUBDIR+= host .endif +.if ${MK_LIBTHR} != "no" +SUBDIR+= csup +.endif + .if ${MK_LOCATE} != "no" SUBDIR+= locate .endif @@ -282,7 +283,11 @@ SUBDIR+= msgs .endif .if ${MK_MAKE} != "no" +.if ${MK_BMAKE} != "no" SUBDIR+= bmake +.else +SUBDIR+= make +.endif .endif .if ${MK_MAN_UTILS} != "no" @@ -358,10 +363,6 @@ SUBDIR+= xstr SUBDIR+= yacc .endif -.if ${MK_VI} != "no" -SUBDIR+= vi -.endif - .if ${MK_VT} != "no" SUBDIR+= vtfontcvt .endif diff --git a/usr.bin/soeliminate/Makefile b/usr.bin/soeliminate/Makefile new file mode 100644 index 00000000000..17d4525988c --- /dev/null +++ b/usr.bin/soeliminate/Makefile @@ -0,0 +1,5 @@ +# $FreeBSD$ + +PROG= soeliminate + +.include diff --git a/usr.bin/soeliminate/soeliminate.1 b/usr.bin/soeliminate/soeliminate.1 new file mode 100644 index 00000000000..d04596e1539 --- /dev/null +++ b/usr.bin/soeliminate/soeliminate.1 @@ -0,0 +1,82 @@ +.\" Copyright (c) 2014 Baptiste Daroussin +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd November 22, 2014 +.Dt SOELIMINATE 1 +.Os +.Sh NAME +.Nm soeliminate +.Nd interpret .so directive in manpages +.Sh SYNOPSIS +.Nm +.Op Fl Crtv +.Op Fl I Ar dir +.Op Ar files ... +.Sh DESCRIPTION +.Nm +reads +.Ar files +lines by lines. +.Pp +If a line starts by: +.Dq .so anotherfile +it replace the line by processing +.Dq anotherfile . +Otherwise the line is printed to stdout. +.Bl -tag -width "-I dir" +.It Fl C +Compatibility with GNU groff's +.Xr soelim 1 +(does nothing). +.It Fl r +Compatibility with GNU groff's +.Xr soelim 1 +(does nothing). +.It Fl t +Compatibility with GNU groff's +.Xr soelim 1 +(does nothing). +.It Fl v +Compatibility with GNU groff's +.Xr soelim 1 +(does nothing). +.It Fl I Ar dir +This option specify directories where +.Nm +searches for files (both those on the command line and those named in +.Dq .so +directive.) +This options may be specified multiple times. The directories will be searched +in the order specified. +.El +.Pp +The files are always searched first in the current directory. +.Pp +A file specified with an absolute path will be opened directly without +performing a search. +.Sh SEE ALSO +.Xr mandoc 1 , +.Xr soelim 1 diff --git a/usr.bin/soeliminate/soeliminate.c b/usr.bin/soeliminate/soeliminate.c new file mode 100644 index 00000000000..80b337ff57d --- /dev/null +++ b/usr.bin/soeliminate/soeliminate.c @@ -0,0 +1,153 @@ +/*- + * Copyright (c) 2014 Baptiste Daroussin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer + * in this position and unchanged. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include + +#define _WITH_GETLINE +#include +#include +#include +#include +#include +#include +#include +#include + +static StringList *includes; + +static void +usage(void) +{ + + fprintf(stderr, "usage: soeliminate [-Crtv] [-I dir] [files]\n"); + + exit(EXIT_FAILURE); +} + +static FILE * +soelim_fopen(const char *name) +{ + FILE *f; + char path[MAXPATHLEN]; + size_t i; + + if ((f = fopen(name, "r")) != NULL) + return (f); + + if (*name == '/') { + warn("can't open '%s'", name); + return (NULL); + } + + for (i = 0; i < includes->sl_cur; i++) { + snprintf(path, sizeof(path), "%s/%s", includes->sl_str[i], + name); + if ((f = fopen(path, "r")) != NULL) + return (f); + } + + warn("can't open '%s'", name); + + return (f); +} + +static int +soelim_file(FILE *f) +{ + char *line = NULL; + char *walk; + size_t linecap = 0; + ssize_t linelen; + + if (f == NULL) + return (1); + + while ((linelen = getline(&line, &linecap, f)) > 0) { + if (strncmp(line, ".so", 3) != 0) { + printf("%s", line); + continue; + } + walk = line + 3; + while (isspace(*walk)) + walk++; + + while (isspace(walk[strlen(walk) - 1])) + walk[strlen(walk) - 1] = '\0'; + if (soelim_file(soelim_fopen(walk)) == 1) { + free(line); + return (1); + } + } + + free(line); + fclose(f); + + return (0); +} + +int +main(int argc, char **argv) +{ + int ch, i; + int ret = 0; + + includes = sl_init(); + if (includes == NULL) + err(EXIT_FAILURE, "sl_init()"); + + while ((ch = getopt(argc, argv, "CrtvI:")) != -1) { + switch (ch) { + case 'C': + case 'r': + case 'v': + case 't': + /* stub compatibility with groff's soelim */ + break; + case 'I': + sl_add(includes, optarg); + break; + default: + sl_free(includes, 0); + usage(); + } + } + + argc -= optind; + argv += optind; + + if (argc == 0) + ret = soelim_file(stdin); + + for (i = 0; i < argc; i++) + ret = soelim_file(soelim_fopen(argv[i])); + + sl_free(includes, 0); + + return (ret); +}