diff options
author | Bruno Haible <bruno@clisp.org> | 2009-08-02 23:53:25 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-08-03 01:57:34 +0200 |
commit | 8ae6a07d62256797e8ddcc918ff3e4f10ff69417 (patch) | |
tree | 479aac48f8549a7dde683b507c3544df9b05bd6a /tests/test-pipe-filter-gi1.c | |
parent | b015db270e6b2937105daf6f4f632cda339c95e2 (diff) | |
download | gnulib-8ae6a07d62256797e8ddcc918ff3e4f10ff69417.tar.gz |
Tests for module 'pipe-filter-gi'.
Diffstat (limited to 'tests/test-pipe-filter-gi1.c')
-rw-r--r-- | tests/test-pipe-filter-gi1.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/tests/test-pipe-filter-gi1.c b/tests/test-pipe-filter-gi1.c new file mode 100644 index 0000000000..95b9aa0cd9 --- /dev/null +++ b/tests/test-pipe-filter-gi1.c @@ -0,0 +1,125 @@ +/* Test of filtering of data through a subprocess. + Copyright (C) 2009 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 <stdio.h> +#include <stdlib.h> + +#include "binary-io.h" +#include "c-ctype.h" +#include "read-file.h" +#include "progname.h" + +#define ASSERT(expr) \ + do \ + { \ + if (!(expr)) \ + { \ + fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ + fflush (stderr); \ + abort (); \ + } \ + } \ + while (0) + + +/* 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 *input_filename; + size_t input_size; + char *input; + + set_program_name (argv[0]); + + ASSERT (argc == 2); + + /* Read some text from a file. */ + input_filename = argv[1]; + 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"; + argv[1] = "a-z"; + argv[2] = "A-Z"; + argv[3] = NULL; + + f = pipe_filter_gi_create ("tr", "tr", 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; +} |