12f3ed619SDag-Erling Smørgrav /*-
249e56509SDag-Erling Smørgrav  * Copyright (c) 2012-2017 Dag-Erling Smørgrav
32f3ed619SDag-Erling Smørgrav  * All rights reserved.
42f3ed619SDag-Erling Smørgrav  *
52f3ed619SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
62f3ed619SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
72f3ed619SDag-Erling Smørgrav  * are met:
82f3ed619SDag-Erling Smørgrav  * 1. Redistributions of source code must retain the above copyright
9ce77a8d6SDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer.
102f3ed619SDag-Erling Smørgrav  * 2. Redistributions in binary form must reproduce the above copyright
112f3ed619SDag-Erling Smørgrav  *    notice, this list of conditions and the following disclaimer in the
122f3ed619SDag-Erling Smørgrav  *    documentation and/or other materials provided with the distribution.
132f3ed619SDag-Erling Smørgrav  * 3. The name of the author may not be used to endorse or promote
142f3ed619SDag-Erling Smørgrav  *    products derived from this software without specific prior written
152f3ed619SDag-Erling Smørgrav  *    permission.
162f3ed619SDag-Erling Smørgrav  *
172f3ed619SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
182f3ed619SDag-Erling Smørgrav  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192f3ed619SDag-Erling Smørgrav  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202f3ed619SDag-Erling Smørgrav  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
212f3ed619SDag-Erling Smørgrav  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222f3ed619SDag-Erling Smørgrav  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232f3ed619SDag-Erling Smørgrav  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242f3ed619SDag-Erling Smørgrav  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252f3ed619SDag-Erling Smørgrav  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262f3ed619SDag-Erling Smørgrav  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272f3ed619SDag-Erling Smørgrav  * SUCH DAMAGE.
282f3ed619SDag-Erling Smørgrav  */
292f3ed619SDag-Erling Smørgrav 
302f3ed619SDag-Erling Smørgrav #ifdef HAVE_CONFIG_H
312f3ed619SDag-Erling Smørgrav # include "config.h"
322f3ed619SDag-Erling Smørgrav #endif
332f3ed619SDag-Erling Smørgrav 
342f3ed619SDag-Erling Smørgrav #include <err.h>
3549e56509SDag-Erling Smørgrav #include <stdint.h>
362f3ed619SDag-Erling Smørgrav #include <stdio.h>
372f3ed619SDag-Erling Smørgrav #include <stdlib.h>
382f3ed619SDag-Erling Smørgrav #include <string.h>
392f3ed619SDag-Erling Smørgrav #include <unistd.h>
402f3ed619SDag-Erling Smørgrav 
41f3b0ac34SDag-Erling Smørgrav #include <cryb/test.h>
42f3b0ac34SDag-Erling Smørgrav 
432f3ed619SDag-Erling Smørgrav #include <security/pam_appl.h>
442f3ed619SDag-Erling Smørgrav #include <security/openpam.h>
452f3ed619SDag-Erling Smørgrav 
46f3b0ac34SDag-Erling Smørgrav #define T_FUNC(n, d)							\
47f3b0ac34SDag-Erling Smørgrav 	static const char *t_ ## n ## _desc = d;			\
48f3b0ac34SDag-Erling Smørgrav 	static int t_ ## n ## _func(OPENPAM_UNUSED(char **desc),	\
49f3b0ac34SDag-Erling Smørgrav 	    OPENPAM_UNUSED(void *arg))
50f3b0ac34SDag-Erling Smørgrav 
51f3b0ac34SDag-Erling Smørgrav #define T(n)								\
5249e56509SDag-Erling Smørgrav 	t_add_test(&t_ ## n ## _func, NULL, "%s", t_ ## n ## _desc)
532f3ed619SDag-Erling Smørgrav 
542f3ed619SDag-Erling Smørgrav /*
552f3ed619SDag-Erling Smørgrav  * Read a word from the temp file and verify that the result matches our
562f3ed619SDag-Erling Smørgrav  * expectations: whether a word was read at all, how many lines were read
572f3ed619SDag-Erling Smørgrav  * (in case of quoted or escaped newlines), whether we reached the end of
582f3ed619SDag-Erling Smørgrav  * the file and whether we reached the end of the line.
592f3ed619SDag-Erling Smørgrav  */
602f3ed619SDag-Erling Smørgrav static int
orw_expect(struct t_file * tf,const char * expected,int lines,int eof,int eol)61ce77a8d6SDag-Erling Smørgrav orw_expect(struct t_file *tf, const char *expected, int lines, int eof, int eol)
622f3ed619SDag-Erling Smørgrav {
632f3ed619SDag-Erling Smørgrav 	int ch, lineno = 0;
642f3ed619SDag-Erling Smørgrav 	char *got;
652f3ed619SDag-Erling Smørgrav 	size_t len;
66f3b0ac34SDag-Erling Smørgrav 	int ret;
672f3ed619SDag-Erling Smørgrav 
68ce77a8d6SDag-Erling Smørgrav 	got = openpam_readword(tf->file, &lineno, &len);
69f3b0ac34SDag-Erling Smørgrav 	ret = 1;
70ce77a8d6SDag-Erling Smørgrav 	if (t_ferror(tf))
71ce77a8d6SDag-Erling Smørgrav 		err(1, "%s(): %s", __func__, tf->name);
722f3ed619SDag-Erling Smørgrav 	if (expected != NULL && got == NULL) {
7349e56509SDag-Erling Smørgrav 		t_printv("expected <<%s>>, got nothing\n", expected);
74f3b0ac34SDag-Erling Smørgrav 		ret = 0;
75f3b0ac34SDag-Erling Smørgrav 	} else if (expected == NULL && got != NULL) {
7649e56509SDag-Erling Smørgrav 		t_printv("expected nothing, got <<%s>>\n", got);
77f3b0ac34SDag-Erling Smørgrav 		ret = 0;
78f3b0ac34SDag-Erling Smørgrav 	} else if (expected != NULL && got != NULL && strcmp(expected, got) != 0) {
7949e56509SDag-Erling Smørgrav 		t_printv("expected <<%s>>, got <<%s>>\n", expected, got);
80f3b0ac34SDag-Erling Smørgrav 		ret = 0;
812f3ed619SDag-Erling Smørgrav 	}
82f3b0ac34SDag-Erling Smørgrav 	free(got);
832f3ed619SDag-Erling Smørgrav 	if (lineno != lines) {
8449e56509SDag-Erling Smørgrav 		t_printv("expected to advance %d lines, advanced %d lines\n",
852f3ed619SDag-Erling Smørgrav 		    lines, lineno);
86f3b0ac34SDag-Erling Smørgrav 		ret = 0;
872f3ed619SDag-Erling Smørgrav 	}
88ce77a8d6SDag-Erling Smørgrav 	if (eof && !t_feof(tf)) {
8949e56509SDag-Erling Smørgrav 		t_printv("expected EOF, but didn't get it\n");
90f3b0ac34SDag-Erling Smørgrav 		ret = 0;
912f3ed619SDag-Erling Smørgrav 	}
92ce77a8d6SDag-Erling Smørgrav 	if (!eof && t_feof(tf)) {
9349e56509SDag-Erling Smørgrav 		t_printv("didn't expect EOF, but got it anyway\n");
94f3b0ac34SDag-Erling Smørgrav 		ret = 0;
952f3ed619SDag-Erling Smørgrav 	}
96ce77a8d6SDag-Erling Smørgrav 	ch = fgetc(tf->file);
97ce77a8d6SDag-Erling Smørgrav 	if (t_ferror(tf))
98ce77a8d6SDag-Erling Smørgrav 		err(1, "%s(): %s", __func__, tf->name);
992f3ed619SDag-Erling Smørgrav 	if (eol && ch != '\n') {
10049e56509SDag-Erling Smørgrav 		t_printv("expected EOL, but didn't get it\n");
101f3b0ac34SDag-Erling Smørgrav 		ret = 0;
102f3b0ac34SDag-Erling Smørgrav 	} else if (!eol && ch == '\n') {
10349e56509SDag-Erling Smørgrav 		t_printv("didn't expect EOL, but got it anyway\n");
104f3b0ac34SDag-Erling Smørgrav 		ret = 0;
1052f3ed619SDag-Erling Smørgrav 	}
1062f3ed619SDag-Erling Smørgrav 	if (ch != EOF)
107ce77a8d6SDag-Erling Smørgrav 		ungetc(ch, tf->file);
108f3b0ac34SDag-Erling Smørgrav 	return (ret);
1092f3ed619SDag-Erling Smørgrav }
1102f3ed619SDag-Erling Smørgrav 
1112f3ed619SDag-Erling Smørgrav 
1122f3ed619SDag-Erling Smørgrav /***************************************************************************
1132f3ed619SDag-Erling Smørgrav  * Lines without words
1142f3ed619SDag-Erling Smørgrav  */
1152f3ed619SDag-Erling Smørgrav 
1162f3ed619SDag-Erling Smørgrav T_FUNC(empty_input, "empty input")
1172f3ed619SDag-Erling Smørgrav {
118ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1192f3ed619SDag-Erling Smørgrav 	int ret;
1202f3ed619SDag-Erling Smørgrav 
121ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
122ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
123ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1242f3ed619SDag-Erling Smørgrav 	return (ret);
1252f3ed619SDag-Erling Smørgrav }
1262f3ed619SDag-Erling Smørgrav 
1272f3ed619SDag-Erling Smørgrav T_FUNC(empty_line, "empty line")
1282f3ed619SDag-Erling Smørgrav {
129ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1302f3ed619SDag-Erling Smørgrav 	int ret;
1312f3ed619SDag-Erling Smørgrav 
132ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
133ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\n");
134ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
135ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
136ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1372f3ed619SDag-Erling Smørgrav 	return (ret);
1382f3ed619SDag-Erling Smørgrav }
1392f3ed619SDag-Erling Smørgrav 
1402f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_line, "unterminated line")
1412f3ed619SDag-Erling Smørgrav {
142ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1432f3ed619SDag-Erling Smørgrav 	int ret;
1442f3ed619SDag-Erling Smørgrav 
145ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
146ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " ");
147ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
148ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
149ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1502f3ed619SDag-Erling Smørgrav 	return (ret);
1512f3ed619SDag-Erling Smørgrav }
1522f3ed619SDag-Erling Smørgrav 
1532f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace, "single whitespace")
1542f3ed619SDag-Erling Smørgrav {
155ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1562f3ed619SDag-Erling Smørgrav 	int ret;
1572f3ed619SDag-Erling Smørgrav 
158ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
159ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " \n");
160ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
161ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
162ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1632f3ed619SDag-Erling Smørgrav 	return (ret);
1642f3ed619SDag-Erling Smørgrav }
1652f3ed619SDag-Erling Smørgrav 
1662f3ed619SDag-Erling Smørgrav T_FUNC(multiple_whitespace, "multiple whitespace")
1672f3ed619SDag-Erling Smørgrav {
168ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1692f3ed619SDag-Erling Smørgrav 	int ret;
1702f3ed619SDag-Erling Smørgrav 
171ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
172ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " \t\r\n");
173ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
174ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
175ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1762f3ed619SDag-Erling Smørgrav 	return (ret);
1772f3ed619SDag-Erling Smørgrav }
1782f3ed619SDag-Erling Smørgrav 
1792f3ed619SDag-Erling Smørgrav T_FUNC(comment, "comment")
1802f3ed619SDag-Erling Smørgrav {
181ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1822f3ed619SDag-Erling Smørgrav 	int ret;
1832f3ed619SDag-Erling Smørgrav 
184ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
185ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "# comment\n");
186ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
187ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
188ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1892f3ed619SDag-Erling Smørgrav 	return (ret);
1902f3ed619SDag-Erling Smørgrav }
1912f3ed619SDag-Erling Smørgrav 
1922f3ed619SDag-Erling Smørgrav T_FUNC(whitespace_before_comment, "whitespace before comment")
1932f3ed619SDag-Erling Smørgrav {
194ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1952f3ed619SDag-Erling Smørgrav 	int ret;
1962f3ed619SDag-Erling Smørgrav 
197ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
198ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " # comment\n");
199ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
200ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
201ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2022f3ed619SDag-Erling Smørgrav 	return (ret);
2032f3ed619SDag-Erling Smørgrav }
2042f3ed619SDag-Erling Smørgrav 
205f3b0ac34SDag-Erling Smørgrav T_FUNC(single_quoted_comment, "single-quoted comment")
206f3b0ac34SDag-Erling Smørgrav {
207f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
208f3b0ac34SDag-Erling Smørgrav 	int ret;
209f3b0ac34SDag-Erling Smørgrav 
210f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
211f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, " '# comment'\n");
212f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
213f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
214f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
215f3b0ac34SDag-Erling Smørgrav 	return (ret);
216f3b0ac34SDag-Erling Smørgrav }
217f3b0ac34SDag-Erling Smørgrav 
218f3b0ac34SDag-Erling Smørgrav T_FUNC(double_quoted_comment, "double-quoted comment")
219f3b0ac34SDag-Erling Smørgrav {
220f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
221f3b0ac34SDag-Erling Smørgrav 	int ret;
222f3b0ac34SDag-Erling Smørgrav 
223f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
224f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, " \"# comment\"\n");
225f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
226f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
227f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
228f3b0ac34SDag-Erling Smørgrav 	return (ret);
229f3b0ac34SDag-Erling Smørgrav }
230f3b0ac34SDag-Erling Smørgrav 
231f3b0ac34SDag-Erling Smørgrav T_FUNC(comment_at_eof, "comment at end of file")
232f3b0ac34SDag-Erling Smørgrav {
233f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
234f3b0ac34SDag-Erling Smørgrav 	int ret;
235f3b0ac34SDag-Erling Smørgrav 
236f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
237f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "# comment");
238f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
239f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
240f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
241f3b0ac34SDag-Erling Smørgrav 	return (ret);
242f3b0ac34SDag-Erling Smørgrav }
243f3b0ac34SDag-Erling Smørgrav 
2442f3ed619SDag-Erling Smørgrav 
2452f3ed619SDag-Erling Smørgrav /***************************************************************************
2462f3ed619SDag-Erling Smørgrav  * Simple cases - no quotes or escapes
2472f3ed619SDag-Erling Smørgrav  */
2482f3ed619SDag-Erling Smørgrav 
2492f3ed619SDag-Erling Smørgrav T_FUNC(single_word, "single word")
2502f3ed619SDag-Erling Smørgrav {
2512f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
252ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2532f3ed619SDag-Erling Smørgrav 	int ret;
2542f3ed619SDag-Erling Smørgrav 
255ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
256ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s\n", word);
257ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
258ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
259ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2602f3ed619SDag-Erling Smørgrav 	return (ret);
2612f3ed619SDag-Erling Smørgrav }
2622f3ed619SDag-Erling Smørgrav 
2632f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace_before_word, "single whitespace before word")
2642f3ed619SDag-Erling Smørgrav {
2652f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
266ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2672f3ed619SDag-Erling Smørgrav 	int ret;
2682f3ed619SDag-Erling Smørgrav 
269ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
270ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " %s\n", word);
271ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
272ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
273ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2742f3ed619SDag-Erling Smørgrav 	return (ret);
2752f3ed619SDag-Erling Smørgrav }
2762f3ed619SDag-Erling Smørgrav 
2772f3ed619SDag-Erling Smørgrav T_FUNC(double_whitespace_before_word, "double whitespace before word")
2782f3ed619SDag-Erling Smørgrav {
2792f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
280ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2812f3ed619SDag-Erling Smørgrav 	int ret;
2822f3ed619SDag-Erling Smørgrav 
283ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
284ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "  %s\n", word);
285ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
286ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
287ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2882f3ed619SDag-Erling Smørgrav 	return (ret);
2892f3ed619SDag-Erling Smørgrav }
2902f3ed619SDag-Erling Smørgrav 
2912f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace_after_word, "single whitespace after word")
2922f3ed619SDag-Erling Smørgrav {
2932f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
294ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2952f3ed619SDag-Erling Smørgrav 	int ret;
2962f3ed619SDag-Erling Smørgrav 
297ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
298ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s \n", word);
299ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
300ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/);
301ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3022f3ed619SDag-Erling Smørgrav 	return (ret);
3032f3ed619SDag-Erling Smørgrav }
3042f3ed619SDag-Erling Smørgrav 
3052f3ed619SDag-Erling Smørgrav T_FUNC(double_whitespace_after_word, "double whitespace after word")
3062f3ed619SDag-Erling Smørgrav {
3072f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
308ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3092f3ed619SDag-Erling Smørgrav 	int ret;
3102f3ed619SDag-Erling Smørgrav 
311ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
312ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s  \n", word);
313ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
314ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/);
315ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3162f3ed619SDag-Erling Smørgrav 	return (ret);
3172f3ed619SDag-Erling Smørgrav }
3182f3ed619SDag-Erling Smørgrav 
3192f3ed619SDag-Erling Smørgrav T_FUNC(comment_after_word, "comment after word")
3202f3ed619SDag-Erling Smørgrav {
3212f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
322ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3232f3ed619SDag-Erling Smørgrav 	int ret;
3242f3ed619SDag-Erling Smørgrav 
325ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
326ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s # comment\n", word);
327ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
328ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
329ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
330ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3312f3ed619SDag-Erling Smørgrav 	return (ret);
3322f3ed619SDag-Erling Smørgrav }
3332f3ed619SDag-Erling Smørgrav 
3342f3ed619SDag-Erling Smørgrav T_FUNC(word_containing_hash, "word containing hash")
3352f3ed619SDag-Erling Smørgrav {
3362f3ed619SDag-Erling Smørgrav 	const char *word = "hello#world";
337ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3382f3ed619SDag-Erling Smørgrav 	int ret;
3392f3ed619SDag-Erling Smørgrav 
340ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
341ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s\n", word);
342ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
343ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
344ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3452f3ed619SDag-Erling Smørgrav 	return (ret);
3462f3ed619SDag-Erling Smørgrav }
3472f3ed619SDag-Erling Smørgrav 
3482f3ed619SDag-Erling Smørgrav T_FUNC(two_words, "two words")
3492f3ed619SDag-Erling Smørgrav {
3502f3ed619SDag-Erling Smørgrav 	const char *word[] = { "hello", "world" };
351ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3522f3ed619SDag-Erling Smørgrav 	int ret;
3532f3ed619SDag-Erling Smørgrav 
354ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
355ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s %s\n", word[0], word[1]);
356ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
357ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word[0], 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
358ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, word[1], 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
359ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3602f3ed619SDag-Erling Smørgrav 	return (ret);
3612f3ed619SDag-Erling Smørgrav }
3622f3ed619SDag-Erling Smørgrav 
3632f3ed619SDag-Erling Smørgrav 
3642f3ed619SDag-Erling Smørgrav /***************************************************************************
3652f3ed619SDag-Erling Smørgrav  * Escapes
3662f3ed619SDag-Erling Smørgrav  */
3672f3ed619SDag-Erling Smørgrav 
3682f3ed619SDag-Erling Smørgrav T_FUNC(naked_escape, "naked escape")
3692f3ed619SDag-Erling Smørgrav {
370ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3712f3ed619SDag-Erling Smørgrav 	int ret;
3722f3ed619SDag-Erling Smørgrav 
373ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
374ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\");
375ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
376ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
377ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3782f3ed619SDag-Erling Smørgrav 	return (ret);
3792f3ed619SDag-Erling Smørgrav }
3802f3ed619SDag-Erling Smørgrav 
3812f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape, "escaped escape")
3822f3ed619SDag-Erling Smørgrav {
383ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3842f3ed619SDag-Erling Smørgrav 	int ret;
3852f3ed619SDag-Erling Smørgrav 
386ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
387ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\\\\n");
388ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
389ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
390ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3912f3ed619SDag-Erling Smørgrav 	return (ret);
3922f3ed619SDag-Erling Smørgrav }
3932f3ed619SDag-Erling Smørgrav 
3942f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace, "escaped whitespace")
3952f3ed619SDag-Erling Smørgrav {
396ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3972f3ed619SDag-Erling Smørgrav 	int ret;
3982f3ed619SDag-Erling Smørgrav 
399ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
400ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\  \\\t \\\r \\\n\n");
401ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
402ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
403ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
404ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
4052f3ed619SDag-Erling Smørgrav 	    /* this last one is a line continuation */
406ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, NULL, 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
407ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4082f3ed619SDag-Erling Smørgrav 	return (ret);
4092f3ed619SDag-Erling Smørgrav }
4102f3ed619SDag-Erling Smørgrav 
4112f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_before_word, "escaped newline before word")
4122f3ed619SDag-Erling Smørgrav {
413ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4142f3ed619SDag-Erling Smørgrav 	int ret;
4152f3ed619SDag-Erling Smørgrav 
416ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
417ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\\nhello world\n");
418ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
419ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/);
420ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4212f3ed619SDag-Erling Smørgrav 	return (ret);
4222f3ed619SDag-Erling Smørgrav }
4232f3ed619SDag-Erling Smørgrav 
4242f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_within_word, "escaped newline within word")
4252f3ed619SDag-Erling Smørgrav {
426ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4272f3ed619SDag-Erling Smørgrav 	int ret;
4282f3ed619SDag-Erling Smørgrav 
429ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
430ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\nworld\n");
431ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
432ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
433ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4342f3ed619SDag-Erling Smørgrav 	return (ret);
4352f3ed619SDag-Erling Smørgrav }
4362f3ed619SDag-Erling Smørgrav 
4372f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_after_word, "escaped newline after word")
4382f3ed619SDag-Erling Smørgrav {
439ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4402f3ed619SDag-Erling Smørgrav 	int ret;
4412f3ed619SDag-Erling Smørgrav 
442ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
443ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\n world\n");
444ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
445ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/);
446ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4472f3ed619SDag-Erling Smørgrav 	return (ret);
4482f3ed619SDag-Erling Smørgrav }
4492f3ed619SDag-Erling Smørgrav 
4502f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter, "escaped letter")
4512f3ed619SDag-Erling Smørgrav {
452ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4532f3ed619SDag-Erling Smørgrav 	int ret;
4542f3ed619SDag-Erling Smørgrav 
455ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
456ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\z\n");
457ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
458ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
459ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4602f3ed619SDag-Erling Smørgrav 	return (ret);
4612f3ed619SDag-Erling Smørgrav }
4622f3ed619SDag-Erling Smørgrav 
463f3b0ac34SDag-Erling Smørgrav T_FUNC(escaped_comment, "escaped comment")
464f3b0ac34SDag-Erling Smørgrav {
465f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
466f3b0ac34SDag-Erling Smørgrav 	int ret;
467f3b0ac34SDag-Erling Smørgrav 
468f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
469f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, " \\# comment\n");
470f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
471f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "#", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
472f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
473f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
474f3b0ac34SDag-Erling Smørgrav 	return (ret);
475f3b0ac34SDag-Erling Smørgrav }
476f3b0ac34SDag-Erling Smørgrav 
477f3b0ac34SDag-Erling Smørgrav T_FUNC(escape_at_eof, "escape at end of file")
478f3b0ac34SDag-Erling Smørgrav {
479f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
480f3b0ac34SDag-Erling Smørgrav 	int ret;
481f3b0ac34SDag-Erling Smørgrav 
482f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
483f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "z\\");
484f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
485f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
486f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
487f3b0ac34SDag-Erling Smørgrav 	return (ret);
488f3b0ac34SDag-Erling Smørgrav }
489f3b0ac34SDag-Erling Smørgrav 
4902f3ed619SDag-Erling Smørgrav 
4912f3ed619SDag-Erling Smørgrav /***************************************************************************
4922f3ed619SDag-Erling Smørgrav  * Quotes
4932f3ed619SDag-Erling Smørgrav  */
4942f3ed619SDag-Erling Smørgrav 
4952f3ed619SDag-Erling Smørgrav T_FUNC(naked_single_quote, "naked single quote")
4962f3ed619SDag-Erling Smørgrav {
497ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4982f3ed619SDag-Erling Smørgrav 	int ret;
4992f3ed619SDag-Erling Smørgrav 
500ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
501ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'");
502ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
503ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
504ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5052f3ed619SDag-Erling Smørgrav 	return (ret);
5062f3ed619SDag-Erling Smørgrav }
5072f3ed619SDag-Erling Smørgrav 
5082f3ed619SDag-Erling Smørgrav T_FUNC(naked_double_quote, "naked double quote")
5092f3ed619SDag-Erling Smørgrav {
510ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5112f3ed619SDag-Erling Smørgrav 	int ret;
5122f3ed619SDag-Erling Smørgrav 
513ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
514ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"");
515ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
516ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
517ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5182f3ed619SDag-Erling Smørgrav 	return (ret);
5192f3ed619SDag-Erling Smørgrav }
5202f3ed619SDag-Erling Smørgrav 
5212f3ed619SDag-Erling Smørgrav T_FUNC(empty_single_quotes, "empty single quotes")
5222f3ed619SDag-Erling Smørgrav {
523ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5242f3ed619SDag-Erling Smørgrav 	int ret;
5252f3ed619SDag-Erling Smørgrav 
526ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
527ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "''\n");
528ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
529ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
530ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5312f3ed619SDag-Erling Smørgrav 	return (ret);
5322f3ed619SDag-Erling Smørgrav }
5332f3ed619SDag-Erling Smørgrav 
5342f3ed619SDag-Erling Smørgrav T_FUNC(empty_double_quotes, "empty double quotes")
5352f3ed619SDag-Erling Smørgrav {
536ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5372f3ed619SDag-Erling Smørgrav 	int ret;
5382f3ed619SDag-Erling Smørgrav 
539ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
540ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\"\n");
541ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
542ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
543ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5442f3ed619SDag-Erling Smørgrav 	return (ret);
5452f3ed619SDag-Erling Smørgrav }
5462f3ed619SDag-Erling Smørgrav 
5472f3ed619SDag-Erling Smørgrav T_FUNC(single_quotes_within_double_quotes, "single quotes within double quotes")
5482f3ed619SDag-Erling Smørgrav {
549ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5502f3ed619SDag-Erling Smørgrav 	int ret;
5512f3ed619SDag-Erling Smørgrav 
552ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
553ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"' '\"\n");
554ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
555ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "' '", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
556ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5572f3ed619SDag-Erling Smørgrav 	return (ret);
5582f3ed619SDag-Erling Smørgrav }
5592f3ed619SDag-Erling Smørgrav 
5602f3ed619SDag-Erling Smørgrav T_FUNC(double_quotes_within_single_quotes, "double quotes within single quotes")
5612f3ed619SDag-Erling Smørgrav {
562ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5632f3ed619SDag-Erling Smørgrav 	int ret;
5642f3ed619SDag-Erling Smørgrav 
565ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
566ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\" \"'\n");
567ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
568ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\" \"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
569ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5702f3ed619SDag-Erling Smørgrav 	return (ret);
5712f3ed619SDag-Erling Smørgrav }
5722f3ed619SDag-Erling Smørgrav 
5732f3ed619SDag-Erling Smørgrav T_FUNC(single_quoted_whitespace, "single-quoted whitespace")
5742f3ed619SDag-Erling Smørgrav {
575ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5762f3ed619SDag-Erling Smørgrav 	int ret;
5772f3ed619SDag-Erling Smørgrav 
578ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
579ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "' ' '\t' '\r' '\n'\n");
580ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
581ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
582ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
583ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
584ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
585ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5862f3ed619SDag-Erling Smørgrav 	return (ret);
5872f3ed619SDag-Erling Smørgrav }
5882f3ed619SDag-Erling Smørgrav 
5892f3ed619SDag-Erling Smørgrav T_FUNC(double_quoted_whitespace, "double-quoted whitespace")
5902f3ed619SDag-Erling Smørgrav {
591ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5922f3ed619SDag-Erling Smørgrav 	int ret;
5932f3ed619SDag-Erling Smørgrav 
594ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
595ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\" \" \"\t\" \"\r\" \"\n\"\n");
596ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
597ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
598ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
599ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
600ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
601ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
6022f3ed619SDag-Erling Smørgrav 	return (ret);
6032f3ed619SDag-Erling Smørgrav }
6042f3ed619SDag-Erling Smørgrav 
6052f3ed619SDag-Erling Smørgrav T_FUNC(single_quoted_words, "single-quoted words")
6062f3ed619SDag-Erling Smørgrav {
607ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
6082f3ed619SDag-Erling Smørgrav 	int ret;
6092f3ed619SDag-Erling Smørgrav 
610ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
611ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'hello world'\n");
612ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
613ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
614ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
6152f3ed619SDag-Erling Smørgrav 	return (ret);
6162f3ed619SDag-Erling Smørgrav }
6172f3ed619SDag-Erling Smørgrav 
6182f3ed619SDag-Erling Smørgrav T_FUNC(double_quoted_words, "double-quoted words")
6192f3ed619SDag-Erling Smørgrav {
620ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
6212f3ed619SDag-Erling Smørgrav 	int ret;
6222f3ed619SDag-Erling Smørgrav 
623ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
624ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"hello world\"\n");
625ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
626ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
627ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
628ce77a8d6SDag-Erling Smørgrav 	return (ret);
629ce77a8d6SDag-Erling Smørgrav }
630ce77a8d6SDag-Erling Smørgrav 
631ce77a8d6SDag-Erling Smørgrav 
632ce77a8d6SDag-Erling Smørgrav /***************************************************************************
633ce77a8d6SDag-Erling Smørgrav  * Combinations of quoted and unquoted text
634ce77a8d6SDag-Erling Smørgrav  */
635ce77a8d6SDag-Erling Smørgrav 
636ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_before_word, "single quote before word")
637ce77a8d6SDag-Erling Smørgrav {
638ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
639ce77a8d6SDag-Erling Smørgrav 	int ret;
640ce77a8d6SDag-Erling Smørgrav 
641ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
642ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'hello 'world\n");
643ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
644ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
645ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
646ce77a8d6SDag-Erling Smørgrav 	return (ret);
647ce77a8d6SDag-Erling Smørgrav }
648ce77a8d6SDag-Erling Smørgrav 
649ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_before_word, "double quote before word")
650ce77a8d6SDag-Erling Smørgrav {
651ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
652ce77a8d6SDag-Erling Smørgrav 	int ret;
653ce77a8d6SDag-Erling Smørgrav 
654ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
655ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"hello \"world\n");
656ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
657ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
658ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
659ce77a8d6SDag-Erling Smørgrav 	return (ret);
660ce77a8d6SDag-Erling Smørgrav }
661ce77a8d6SDag-Erling Smørgrav 
662ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_within_word, "single quote within word")
663ce77a8d6SDag-Erling Smørgrav {
664ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
665ce77a8d6SDag-Erling Smørgrav 	int ret;
666ce77a8d6SDag-Erling Smørgrav 
667ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
668ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello' 'world\n");
669ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
670ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
671ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
672ce77a8d6SDag-Erling Smørgrav 	return (ret);
673ce77a8d6SDag-Erling Smørgrav }
674ce77a8d6SDag-Erling Smørgrav 
675ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_within_word, "double quote within word")
676ce77a8d6SDag-Erling Smørgrav {
677ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
678ce77a8d6SDag-Erling Smørgrav 	int ret;
679ce77a8d6SDag-Erling Smørgrav 
680ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
681ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\" \"world\n");
682ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
683ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
684ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
685ce77a8d6SDag-Erling Smørgrav 	return (ret);
686ce77a8d6SDag-Erling Smørgrav }
687ce77a8d6SDag-Erling Smørgrav 
688ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_after_word, "single quote after word")
689ce77a8d6SDag-Erling Smørgrav {
690ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
691ce77a8d6SDag-Erling Smørgrav 	int ret;
692ce77a8d6SDag-Erling Smørgrav 
693ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
694ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello' world'\n");
695ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
696ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
697ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
698ce77a8d6SDag-Erling Smørgrav 	return (ret);
699ce77a8d6SDag-Erling Smørgrav }
700ce77a8d6SDag-Erling Smørgrav 
701ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_after_word, "double quote after word")
702ce77a8d6SDag-Erling Smørgrav {
703ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
704ce77a8d6SDag-Erling Smørgrav 	int ret;
705ce77a8d6SDag-Erling Smørgrav 
706ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
707ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\" world\"\n");
708ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
709ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
710ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7112f3ed619SDag-Erling Smørgrav 	return (ret);
7122f3ed619SDag-Erling Smørgrav }
7132f3ed619SDag-Erling Smørgrav 
7142f3ed619SDag-Erling Smørgrav 
7152f3ed619SDag-Erling Smørgrav /***************************************************************************
7162f3ed619SDag-Erling Smørgrav  * Combinations of escape and quotes
7172f3ed619SDag-Erling Smørgrav  */
7182f3ed619SDag-Erling Smørgrav 
7192f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote,
7202f3ed619SDag-Erling Smørgrav     "escaped single quote")
7212f3ed619SDag-Erling Smørgrav {
722ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7232f3ed619SDag-Erling Smørgrav 	int ret;
7242f3ed619SDag-Erling Smørgrav 
725ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
726ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\'\n");
727ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
728ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
729ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7302f3ed619SDag-Erling Smørgrav 	return (ret);
7312f3ed619SDag-Erling Smørgrav }
7322f3ed619SDag-Erling Smørgrav 
7332f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote,
7342f3ed619SDag-Erling Smørgrav     "escaped double quote")
7352f3ed619SDag-Erling Smørgrav {
736ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7372f3ed619SDag-Erling Smørgrav 	int ret;
7382f3ed619SDag-Erling Smørgrav 
739ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
740ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\\"\n");
741ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
742ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
743ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7442f3ed619SDag-Erling Smørgrav 	return (ret);
7452f3ed619SDag-Erling Smørgrav }
7462f3ed619SDag-Erling Smørgrav 
7472f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace_within_single_quotes,
7482f3ed619SDag-Erling Smørgrav     "escaped whitespace within single quotes")
7492f3ed619SDag-Erling Smørgrav {
750ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7512f3ed619SDag-Erling Smørgrav 	int ret;
7522f3ed619SDag-Erling Smørgrav 
753ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
754ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\ ' '\\\t' '\\\r' '\\\n'\n");
755ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
756ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
757ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
758ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
759ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
760ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7612f3ed619SDag-Erling Smørgrav 	return (ret);
7622f3ed619SDag-Erling Smørgrav }
7632f3ed619SDag-Erling Smørgrav 
7642f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace_within_double_quotes,
7652f3ed619SDag-Erling Smørgrav     "escaped whitespace within double quotes")
7662f3ed619SDag-Erling Smørgrav {
767ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7682f3ed619SDag-Erling Smørgrav 	int ret;
7692f3ed619SDag-Erling Smørgrav 
770ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
771ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\ \" \"\\\t\" \"\\\r\" \"\\\n\"\n");
772ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
773ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
774ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
775ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
7762f3ed619SDag-Erling Smørgrav 	    /* this last one is a line continuation */
777ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
778ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7792f3ed619SDag-Erling Smørgrav 	return (ret);
7802f3ed619SDag-Erling Smørgrav }
7812f3ed619SDag-Erling Smørgrav 
7822f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter_within_single_quotes,
7832f3ed619SDag-Erling Smørgrav     "escaped letter within single quotes")
7842f3ed619SDag-Erling Smørgrav {
785ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7862f3ed619SDag-Erling Smørgrav 	int ret;
7872f3ed619SDag-Erling Smørgrav 
788ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
789ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\z'\n");
790ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
791ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
792ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7932f3ed619SDag-Erling Smørgrav 	return (ret);
7942f3ed619SDag-Erling Smørgrav }
7952f3ed619SDag-Erling Smørgrav 
7962f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter_within_double_quotes,
7972f3ed619SDag-Erling Smørgrav     "escaped letter within double quotes")
7982f3ed619SDag-Erling Smørgrav {
799ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8002f3ed619SDag-Erling Smørgrav 	int ret;
8012f3ed619SDag-Erling Smørgrav 
802ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
803ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\z\"\n");
804ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
805ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
806ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8072f3ed619SDag-Erling Smørgrav 	return (ret);
8082f3ed619SDag-Erling Smørgrav }
8092f3ed619SDag-Erling Smørgrav 
8102f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape_within_single_quotes,
8112f3ed619SDag-Erling Smørgrav     "escaped escape within single quotes")
8122f3ed619SDag-Erling Smørgrav {
813ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8142f3ed619SDag-Erling Smørgrav 	int ret;
8152f3ed619SDag-Erling Smørgrav 
816ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
817ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\\\'\n");
818ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
819ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
820ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8212f3ed619SDag-Erling Smørgrav 	return (ret);
8222f3ed619SDag-Erling Smørgrav }
8232f3ed619SDag-Erling Smørgrav 
8242f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape_within_double_quotes,
8252f3ed619SDag-Erling Smørgrav     "escaped escape within double quotes")
8262f3ed619SDag-Erling Smørgrav {
827ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8282f3ed619SDag-Erling Smørgrav 	int ret;
8292f3ed619SDag-Erling Smørgrav 
830ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
831ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\\\\"\n");
832ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
833ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
834ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8352f3ed619SDag-Erling Smørgrav 	return (ret);
8362f3ed619SDag-Erling Smørgrav }
8372f3ed619SDag-Erling Smørgrav 
8382f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote_within_single_quotes,
8392f3ed619SDag-Erling Smørgrav     "escaped single quote within single quotes")
8402f3ed619SDag-Erling Smørgrav {
841ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8422f3ed619SDag-Erling Smørgrav 	int ret;
8432f3ed619SDag-Erling Smørgrav 
844ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
845ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\''\n");
846ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
847ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 1 /*lines*/, 1 /*eof*/, 0 /*eol*/);
848ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8492f3ed619SDag-Erling Smørgrav 	return (ret);
8502f3ed619SDag-Erling Smørgrav }
8512f3ed619SDag-Erling Smørgrav 
8522f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote_within_single_quotes,
8532f3ed619SDag-Erling Smørgrav     "escaped double quote within single quotes")
8542f3ed619SDag-Erling Smørgrav {
855ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8562f3ed619SDag-Erling Smørgrav 	int ret;
8572f3ed619SDag-Erling Smørgrav 
858ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
859ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\\"'\n");
860ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
861ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
862ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8632f3ed619SDag-Erling Smørgrav 	return (ret);
8642f3ed619SDag-Erling Smørgrav }
8652f3ed619SDag-Erling Smørgrav 
8662f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote_within_double_quotes,
8672f3ed619SDag-Erling Smørgrav     "escaped single quote within double quotes")
8682f3ed619SDag-Erling Smørgrav {
869ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8702f3ed619SDag-Erling Smørgrav 	int ret;
8712f3ed619SDag-Erling Smørgrav 
872ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
873ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\'\"\n");
874ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
875ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
876ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8772f3ed619SDag-Erling Smørgrav 	return (ret);
8782f3ed619SDag-Erling Smørgrav }
8792f3ed619SDag-Erling Smørgrav 
8802f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote_within_double_quotes,
8812f3ed619SDag-Erling Smørgrav     "escaped double quote within double quotes")
8822f3ed619SDag-Erling Smørgrav {
883ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8842f3ed619SDag-Erling Smørgrav 	int ret;
8852f3ed619SDag-Erling Smørgrav 
886ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
887ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\\"\"\n");
888ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
889ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
890ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8912f3ed619SDag-Erling Smørgrav 	return (ret);
8922f3ed619SDag-Erling Smørgrav }
8932f3ed619SDag-Erling Smørgrav 
8942f3ed619SDag-Erling Smørgrav 
8952f3ed619SDag-Erling Smørgrav /***************************************************************************
896f3b0ac34SDag-Erling Smørgrav  * Line continuation
897f3b0ac34SDag-Erling Smørgrav  */
898f3b0ac34SDag-Erling Smørgrav 
899f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_within_whitespace, "line continuation within whitespace")
900f3b0ac34SDag-Erling Smørgrav {
901f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
902f3b0ac34SDag-Erling Smørgrav 	int ret;
903f3b0ac34SDag-Erling Smørgrav 
904f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
905f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello \\\n world\n");
906f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
907f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
908f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
909f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
910f3b0ac34SDag-Erling Smørgrav 	return (ret);
911f3b0ac34SDag-Erling Smørgrav }
912f3b0ac34SDag-Erling Smørgrav 
913f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_before_whitespace, "line continuation before whitespace")
914f3b0ac34SDag-Erling Smørgrav {
915f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
916f3b0ac34SDag-Erling Smørgrav 	int ret;
917f3b0ac34SDag-Erling Smørgrav 
918f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
919f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\n world\n");
920f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
921f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
922f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
923f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
924f3b0ac34SDag-Erling Smørgrav 	return (ret);
925f3b0ac34SDag-Erling Smørgrav }
926f3b0ac34SDag-Erling Smørgrav 
927f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_after_whitespace, "line continuation after whitespace")
928f3b0ac34SDag-Erling Smørgrav {
929f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
930f3b0ac34SDag-Erling Smørgrav 	int ret;
931f3b0ac34SDag-Erling Smørgrav 
932f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
933f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello \\\nworld\n");
934f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
935f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
936f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
937f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
938f3b0ac34SDag-Erling Smørgrav 	return (ret);
939f3b0ac34SDag-Erling Smørgrav }
940f3b0ac34SDag-Erling Smørgrav 
941f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_within_word, "line continuation within word")
942f3b0ac34SDag-Erling Smørgrav {
943f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
944f3b0ac34SDag-Erling Smørgrav 	int ret;
945f3b0ac34SDag-Erling Smørgrav 
946f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
947f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\nworld\n");
948f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
949f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
950f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
951f3b0ac34SDag-Erling Smørgrav 	return (ret);
952f3b0ac34SDag-Erling Smørgrav }
953f3b0ac34SDag-Erling Smørgrav 
954f3b0ac34SDag-Erling Smørgrav 
955f3b0ac34SDag-Erling Smørgrav /***************************************************************************
9562f3ed619SDag-Erling Smørgrav  * Boilerplate
9572f3ed619SDag-Erling Smørgrav  */
9582f3ed619SDag-Erling Smørgrav 
959f3b0ac34SDag-Erling Smørgrav static int
t_prepare(int argc,char * argv[])9602f3ed619SDag-Erling Smørgrav t_prepare(int argc, char *argv[])
9612f3ed619SDag-Erling Smørgrav {
9622f3ed619SDag-Erling Smørgrav 
9632f3ed619SDag-Erling Smørgrav 	(void)argc;
9642f3ed619SDag-Erling Smørgrav 	(void)argv;
965f3b0ac34SDag-Erling Smørgrav 
966f3b0ac34SDag-Erling Smørgrav 	T(empty_input);
967f3b0ac34SDag-Erling Smørgrav 	T(empty_line);
968f3b0ac34SDag-Erling Smørgrav 	T(unterminated_line);
969f3b0ac34SDag-Erling Smørgrav 	T(single_whitespace);
970f3b0ac34SDag-Erling Smørgrav 	T(multiple_whitespace);
971f3b0ac34SDag-Erling Smørgrav 	T(comment);
972f3b0ac34SDag-Erling Smørgrav 	T(whitespace_before_comment);
973f3b0ac34SDag-Erling Smørgrav 	T(single_quoted_comment);
974f3b0ac34SDag-Erling Smørgrav 	T(double_quoted_comment);
975f3b0ac34SDag-Erling Smørgrav 	T(comment_at_eof);
976f3b0ac34SDag-Erling Smørgrav 
977f3b0ac34SDag-Erling Smørgrav 	T(single_word);
978f3b0ac34SDag-Erling Smørgrav 	T(single_whitespace_before_word);
979f3b0ac34SDag-Erling Smørgrav 	T(double_whitespace_before_word);
980f3b0ac34SDag-Erling Smørgrav 	T(single_whitespace_after_word);
981f3b0ac34SDag-Erling Smørgrav 	T(double_whitespace_after_word);
982f3b0ac34SDag-Erling Smørgrav 	T(comment_after_word);
983f3b0ac34SDag-Erling Smørgrav 	T(word_containing_hash);
984f3b0ac34SDag-Erling Smørgrav 	T(two_words);
985f3b0ac34SDag-Erling Smørgrav 
986f3b0ac34SDag-Erling Smørgrav 	T(naked_escape);
987f3b0ac34SDag-Erling Smørgrav 	T(escaped_escape);
988f3b0ac34SDag-Erling Smørgrav 	T(escaped_whitespace);
989f3b0ac34SDag-Erling Smørgrav 	T(escaped_newline_before_word);
990f3b0ac34SDag-Erling Smørgrav 	T(escaped_newline_within_word);
991f3b0ac34SDag-Erling Smørgrav 	T(escaped_newline_after_word);
992f3b0ac34SDag-Erling Smørgrav 	T(escaped_letter);
993f3b0ac34SDag-Erling Smørgrav 	T(escaped_comment);
994f3b0ac34SDag-Erling Smørgrav 	T(escape_at_eof);
995f3b0ac34SDag-Erling Smørgrav 
996f3b0ac34SDag-Erling Smørgrav 	T(naked_single_quote);
997f3b0ac34SDag-Erling Smørgrav 	T(naked_double_quote);
998f3b0ac34SDag-Erling Smørgrav 	T(empty_single_quotes);
999f3b0ac34SDag-Erling Smørgrav 	T(empty_double_quotes);
1000f3b0ac34SDag-Erling Smørgrav 	T(single_quotes_within_double_quotes);
1001f3b0ac34SDag-Erling Smørgrav 	T(double_quotes_within_single_quotes);
1002f3b0ac34SDag-Erling Smørgrav 	T(single_quoted_whitespace);
1003f3b0ac34SDag-Erling Smørgrav 	T(double_quoted_whitespace);
1004f3b0ac34SDag-Erling Smørgrav 	T(single_quoted_words);
1005f3b0ac34SDag-Erling Smørgrav 	T(double_quoted_words);
1006f3b0ac34SDag-Erling Smørgrav 
1007f3b0ac34SDag-Erling Smørgrav 	T(single_quote_before_word);
1008f3b0ac34SDag-Erling Smørgrav 	T(double_quote_before_word);
1009f3b0ac34SDag-Erling Smørgrav 	T(single_quote_within_word);
1010f3b0ac34SDag-Erling Smørgrav 	T(double_quote_within_word);
1011f3b0ac34SDag-Erling Smørgrav 	T(single_quote_after_word);
1012f3b0ac34SDag-Erling Smørgrav 	T(double_quote_after_word);
1013f3b0ac34SDag-Erling Smørgrav 
1014f3b0ac34SDag-Erling Smørgrav 	T(escaped_single_quote);
1015f3b0ac34SDag-Erling Smørgrav 	T(escaped_double_quote);
1016f3b0ac34SDag-Erling Smørgrav 	T(escaped_whitespace_within_single_quotes);
1017f3b0ac34SDag-Erling Smørgrav 	T(escaped_whitespace_within_double_quotes);
1018f3b0ac34SDag-Erling Smørgrav 	T(escaped_letter_within_single_quotes);
1019f3b0ac34SDag-Erling Smørgrav 	T(escaped_letter_within_double_quotes);
1020f3b0ac34SDag-Erling Smørgrav 	T(escaped_escape_within_single_quotes);
1021f3b0ac34SDag-Erling Smørgrav 	T(escaped_escape_within_double_quotes);
1022f3b0ac34SDag-Erling Smørgrav 	T(escaped_single_quote_within_single_quotes);
1023f3b0ac34SDag-Erling Smørgrav 	T(escaped_double_quote_within_single_quotes);
1024f3b0ac34SDag-Erling Smørgrav 	T(escaped_single_quote_within_double_quotes);
1025f3b0ac34SDag-Erling Smørgrav 	T(escaped_double_quote_within_double_quotes);
1026f3b0ac34SDag-Erling Smørgrav 
1027f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_within_whitespace);
1028f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_before_whitespace);
1029f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_after_whitespace);
1030f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_within_word);
1031f3b0ac34SDag-Erling Smørgrav 
1032f3b0ac34SDag-Erling Smørgrav 	return (0);
10332f3ed619SDag-Erling Smørgrav }
10342f3ed619SDag-Erling Smørgrav 
1035f3b0ac34SDag-Erling Smørgrav int
main(int argc,char * argv[])1036f3b0ac34SDag-Erling Smørgrav main(int argc, char *argv[])
10372f3ed619SDag-Erling Smørgrav {
1038f3b0ac34SDag-Erling Smørgrav 
1039f3b0ac34SDag-Erling Smørgrav 	t_main(t_prepare, NULL, argc, argv);
10402f3ed619SDag-Erling Smørgrav }
1041