Index: head/usr.bin/soelim/soelim.c =================================================================== --- head/usr.bin/soelim/soelim.c (revision 282424) +++ head/usr.bin/soelim/soelim.c (revision 282425) @@ -1,175 +1,178 @@ /*- * 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 #define C_OPTION 0x1 static StringList *includes; static void usage(void) { fprintf(stderr, "usage: soelim [-Crtv] [-I dir] [files]\n"); exit(EXIT_FAILURE); } static FILE * soelim_fopen(const char *name) { FILE *f; char path[MAXPATHLEN]; size_t i; if (strcmp(name, "-") == 0) return (stdin); 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, int flag) { char *line = NULL; char *walk, *cp; 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; if (!isspace(*walk) && ((flag & C_OPTION) == 0)) { printf("%s", line); continue; } while (isspace(*walk)) walk++; - cp = walk + strlen(walk) - 1; - while (cp > walk && isspace(*cp)) { - *cp = 0; - cp--; - } + cp = walk; + while (*cp != '\0' && !isspace(*cp)) + cp++; + *cp = 0; + if (cp < line + linelen) + cp++; if (*walk == '\0') { printf("%s", line); continue; } if (soelim_file(soelim_fopen(walk), flag) == 1) { free(line); return (1); } + if (*cp != '\0') + printf("%s", cp); } free(line); fclose(f); return (0); } int main(int argc, char **argv) { int ch, i; int ret = 0; int flags = 0; includes = sl_init(); if (includes == NULL) err(EXIT_FAILURE, "sl_init()"); while ((ch = getopt(argc, argv, "CrtvI:")) != -1) { switch (ch) { case 'C': flags |= C_OPTION; break; 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, flags); for (i = 0; i < argc; i++) ret = soelim_file(soelim_fopen(argv[i]), flags); sl_free(includes, 0); return (ret); } Index: head/usr.bin/soelim/tests/Makefile =================================================================== --- head/usr.bin/soelim/tests/Makefile (revision 282424) +++ head/usr.bin/soelim/tests/Makefile (revision 282425) @@ -1,13 +1,15 @@ # $FreeBSD$ TESTSDIR= ${TESTSBASE}/usr.bin/soelim ATF_TESTS_SH= soelim FILES= nonexisting.in \ basic.in \ basic \ - basic.out + basic.out \ + basic-with-space.in \ + basic-with-space.out FILESDIR= ${TESTSDIR} .include Index: head/usr.bin/soelim/tests/basic-with-space.in =================================================================== --- head/usr.bin/soelim/tests/basic-with-space.in (nonexistent) +++ head/usr.bin/soelim/tests/basic-with-space.in (revision 282425) @@ -0,0 +1,3 @@ +This is a test +.so basic something +end Property changes on: head/usr.bin/soelim/tests/basic-with-space.in ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/usr.bin/soelim/tests/basic-with-space.out =================================================================== --- head/usr.bin/soelim/tests/basic-with-space.out (nonexistent) +++ head/usr.bin/soelim/tests/basic-with-space.out (revision 282425) @@ -0,0 +1,4 @@ +This is a test +basic has been included +something +end Property changes on: head/usr.bin/soelim/tests/basic-with-space.out ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +yes \ No newline at end of property Index: head/usr.bin/soelim/tests/soelim.sh =================================================================== --- head/usr.bin/soelim/tests/soelim.sh (revision 282424) +++ head/usr.bin/soelim/tests/soelim.sh (revision 282425) @@ -1,96 +1,103 @@ # $FreeBSD$ atf_test_case stdin stdin_head() { atf_set "descr" "stdin functionality" } stdin_body() { # no file after .so atf_check \ -o inline:".so\n" \ -e empty \ -s exit:0 \ soelim <<-EOF .so EOF # only space after .so atf_check \ -o inline:".so \n" \ -e empty \ -s exit:0 \ soelim <<-EOF .so EOF # explicit stdin atf_check \ -o inline:".so\n" \ -e empty \ -s exit:0 \ soelim - <<-EOF .so EOF atf_check \ -o empty \ -e inline:"soelim: can't open 'afile': No such file or directory\n" \ -s exit:1 \ soelim <<-EOF .so afile EOF atf_check \ -o inline:".soafile\n" \ -e empty \ -s exit:0 \ soelim <<-EOF .soafile EOF atf_check \ -o empty \ -e inline:"soelim: can't open 'afile': No such file or directory\n" \ -s exit:1 \ soelim -C <<-EOF .soafile EOF } atf_test_case files files_head() { atf_set "descr" "testing files" } files_body() { atf_check \ -o inline:"This is a test\n" \ -e inline:"soelim: can't open 'nonexistingfile': No such file or directory\n" \ -s exit:1 \ soelim $(atf_get_srcdir)/nonexisting.in cp $(atf_get_srcdir)/basic . atf_check \ -o file:$(atf_get_srcdir)/basic.out \ -e empty \ -s exit:0 \ soelim $(atf_get_srcdir)/basic.in rm -f basic atf_check \ -o file:$(atf_get_srcdir)/basic.out \ -e empty \ -s exit:0 \ soelim -I$(atf_get_srcdir) $(atf_get_srcdir)/basic.in + + atf_check \ + -o file:$(atf_get_srcdir)/basic-with-space.out \ + -e empty \ + -s exit:0 \ + soelim -I$(atf_get_srcdir) $(atf_get_srcdir)/basic-with-space.in + } atf_init_test_cases() { atf_add_test_case stdin atf_add_test_case files }