diff options
Diffstat (limited to 'gnulib/tests/test-pipe-filter-gi1.c')
m--------- | gnulib | 0 | ||||
-rw-r--r-- | gnulib/tests/test-pipe-filter-gi1.c | 114 |
2 files changed, 114 insertions, 0 deletions
diff --git a/gnulib b/gnulib deleted file mode 160000 -Subproject 443bc5ffcf7429e557f4a371b0661abe98ddbc1 diff --git a/gnulib/tests/test-pipe-filter-gi1.c b/gnulib/tests/test-pipe-filter-gi1.c new file mode 100644 index 0000000..b1f94e1 --- /dev/null +++ b/gnulib/tests/test-pipe-filter-gi1.c @@ -0,0 +1,114 @@ +/* Test of filtering of data through a subprocess. + Copyright (C) 2009-2011 Free Software Foundation, Inc. + Written by Bruno Haible <haible@clisp.cons.org>, 2009. + + This program 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 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include <config.h> + +#include "pipe-filter.h" + +#include "binary-io.h" +#include "c-ctype.h" +#include "read-file.h" +#include "progname.h" +#include "macros.h" + + +/* Pipe a text file through 'tr "[a-z]" "[A-Z]"', which converts ASCII + characters from lower case to upper case. */ + +struct locals +{ + const char *input; + size_t nread; + char buf[19]; +}; + +static void * +prepare_read (size_t *num_bytes_p, void *private_data) +{ + struct locals *l = (struct locals *) private_data; + *num_bytes_p = sizeof (l->buf); + return l->buf; +} + +static void +done_read (void *data_read, size_t num_bytes_read, void *private_data) +{ + struct locals *l = (struct locals *) private_data; + const char *p = l->input + l->nread; + const char *q = (const char *) data_read; + size_t i; + + for (i = 0; i < num_bytes_read; i++, q++) + { + /* Handle conversion NL -> CRLF possibly done by the child process. */ + if (!(O_BINARY && *q == '\r')) + { + char orig = *p; + char expected = c_toupper (orig); + ASSERT (*q == expected); + p++; + } + } + l->nread = p - l->input; +} + +int +main (int argc, char *argv[]) +{ + const char *tr_program; + const char *input_filename; + size_t input_size; + char *input; + + set_program_name (argv[0]); + + ASSERT (argc == 3); + + tr_program = argv[1]; + + /* Read some text from a file. */ + input_filename = argv[2]; + input = read_binary_file (input_filename, &input_size); + ASSERT (input != NULL); + + /* Convert it to uppercase, line by line. */ + { + const char *argv[4]; + struct locals l; + struct pipe_filter_gi *f; + int result; + + l.input = input; + l.nread = 0; + + argv[0] = tr_program; + argv[1] = "[a-z]"; + argv[2] = "[A-Z]"; + argv[3] = NULL; + + f = pipe_filter_gi_create ("tr", tr_program, argv, false, true, + prepare_read, done_read, &l); + ASSERT (f != NULL); + result = pipe_filter_gi_write (f, input, input_size); + ASSERT (result == 0); + result = pipe_filter_gi_close (f); + ASSERT (result == 0); + ASSERT (l.nread == input_size); + } + + return 0; +} |