1 /* Test of filtering of data through a subprocess.
2 Copyright (C) 2009-2020 Free Software Foundation, Inc.
3 Written by Bruno Haible <haible@clisp.cons.org>, 2009.
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <https://www.gnu.org/licenses/>. */
20 #include "pipe-filter.h"
22 #include "binary-io.h"
24 #include "read-file.h"
28 /* Pipe a text file through 'LC_ALL=C tr "[a-z]" "[A-Z]"', or equivalently,
29 'tr "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"', which
30 converts ASCII characters from lower case to upper case. */
40 prepare_read (size_t *num_bytes_p
, void *private_data
)
42 struct locals
*l
= (struct locals
*) private_data
;
43 *num_bytes_p
= sizeof (l
->buf
);
48 done_read (void *data_read
, size_t num_bytes_read
, void *private_data
)
50 struct locals
*l
= (struct locals
*) private_data
;
51 const char *p
= l
->input
+ l
->nread
;
52 const char *q
= (const char *) data_read
;
55 for (i
= 0; i
< num_bytes_read
; i
++, q
++)
57 /* Handle conversion NL -> CRLF possibly done by the child process. */
58 if (!(O_BINARY
&& *q
== '\r'))
61 char expected
= c_toupper (orig
);
62 ASSERT (*q
== expected
);
66 l
->nread
= p
- l
->input
;
70 main (int argc
, char *argv
[])
72 const char *tr_program
;
73 const char *input_filename
;
81 /* Read some text from a file. */
82 input_filename
= argv
[2];
83 input
= read_file (input_filename
, RF_BINARY
, &input_size
);
84 ASSERT (input
!= NULL
);
86 /* Convert it to uppercase, line by line. */
90 struct pipe_filter_gi
*f
;
97 argv
[1] = "abcdefghijklmnopqrstuvwxyz";
98 argv
[2] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
101 f
= pipe_filter_gi_create ("tr", tr_program
, argv
, false, true,
102 prepare_read
, done_read
, &l
);
104 result
= pipe_filter_gi_write (f
, input
, input_size
);
105 ASSERT (result
== 0);
106 result
= pipe_filter_gi_close (f
);
107 ASSERT (result
== 0);
108 ASSERT (l
.nread
== input_size
);