xref: /freebsd/contrib/openpam/t/t_openpam_readword.c (revision f3b0ac3409e4c3c6ec2a74432ee5b410f087b93d)
12f3ed619SDag-Erling Smørgrav /*-
2*f3b0ac34SDag-Erling Smørgrav  * Copyright (c) 2012-2015 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  *
29*f3b0ac34SDag-Erling Smørgrav  * $Id: t_openpam_readword.c 922 2017-02-19 19:28:30Z des $
302f3ed619SDag-Erling Smørgrav  */
312f3ed619SDag-Erling Smørgrav 
322f3ed619SDag-Erling Smørgrav #ifdef HAVE_CONFIG_H
332f3ed619SDag-Erling Smørgrav # include "config.h"
342f3ed619SDag-Erling Smørgrav #endif
352f3ed619SDag-Erling Smørgrav 
362f3ed619SDag-Erling Smørgrav #include <err.h>
372f3ed619SDag-Erling Smørgrav #include <stdio.h>
382f3ed619SDag-Erling Smørgrav #include <stdlib.h>
392f3ed619SDag-Erling Smørgrav #include <string.h>
402f3ed619SDag-Erling Smørgrav #include <unistd.h>
412f3ed619SDag-Erling Smørgrav 
42*f3b0ac34SDag-Erling Smørgrav #include <cryb/test.h>
43*f3b0ac34SDag-Erling Smørgrav 
442f3ed619SDag-Erling Smørgrav #include <security/pam_appl.h>
452f3ed619SDag-Erling Smørgrav #include <security/openpam.h>
462f3ed619SDag-Erling Smørgrav 
47*f3b0ac34SDag-Erling Smørgrav #define T_FUNC(n, d)							\
48*f3b0ac34SDag-Erling Smørgrav 	static const char *t_ ## n ## _desc = d;			\
49*f3b0ac34SDag-Erling Smørgrav 	static int t_ ## n ## _func(OPENPAM_UNUSED(char **desc),	\
50*f3b0ac34SDag-Erling Smørgrav 	    OPENPAM_UNUSED(void *arg))
51*f3b0ac34SDag-Erling Smørgrav 
52*f3b0ac34SDag-Erling Smørgrav #define T(n)								\
53*f3b0ac34SDag-Erling Smørgrav 	t_add_test(&t_ ## n ## _func, NULL, t_ ## n ## _desc)
542f3ed619SDag-Erling Smørgrav 
552f3ed619SDag-Erling Smørgrav /*
562f3ed619SDag-Erling Smørgrav  * Read a word from the temp file and verify that the result matches our
572f3ed619SDag-Erling Smørgrav  * expectations: whether a word was read at all, how many lines were read
582f3ed619SDag-Erling Smørgrav  * (in case of quoted or escaped newlines), whether we reached the end of
592f3ed619SDag-Erling Smørgrav  * the file and whether we reached the end of the line.
602f3ed619SDag-Erling Smørgrav  */
612f3ed619SDag-Erling Smørgrav static int
62ce77a8d6SDag-Erling Smørgrav orw_expect(struct t_file *tf, const char *expected, int lines, int eof, int eol)
632f3ed619SDag-Erling Smørgrav {
642f3ed619SDag-Erling Smørgrav 	int ch, lineno = 0;
652f3ed619SDag-Erling Smørgrav 	char *got;
662f3ed619SDag-Erling Smørgrav 	size_t len;
67*f3b0ac34SDag-Erling Smørgrav 	int ret;
682f3ed619SDag-Erling Smørgrav 
69ce77a8d6SDag-Erling Smørgrav 	got = openpam_readword(tf->file, &lineno, &len);
70*f3b0ac34SDag-Erling Smørgrav 	ret = 1;
71ce77a8d6SDag-Erling Smørgrav 	if (t_ferror(tf))
72ce77a8d6SDag-Erling Smørgrav 		err(1, "%s(): %s", __func__, tf->name);
732f3ed619SDag-Erling Smørgrav 	if (expected != NULL && got == NULL) {
742f3ed619SDag-Erling Smørgrav 		t_verbose("expected <<%s>>, got nothing\n", expected);
75*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
76*f3b0ac34SDag-Erling Smørgrav 	} else if (expected == NULL && got != NULL) {
772f3ed619SDag-Erling Smørgrav 		t_verbose("expected nothing, got <<%s>>\n", got);
78*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
79*f3b0ac34SDag-Erling Smørgrav 	} else if (expected != NULL && got != NULL && strcmp(expected, got) != 0) {
802f3ed619SDag-Erling Smørgrav 		t_verbose("expected <<%s>>, got <<%s>>\n", expected, got);
81*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
822f3ed619SDag-Erling Smørgrav 	}
83*f3b0ac34SDag-Erling Smørgrav 	free(got);
842f3ed619SDag-Erling Smørgrav 	if (lineno != lines) {
852f3ed619SDag-Erling Smørgrav 		t_verbose("expected to advance %d lines, advanced %d lines\n",
862f3ed619SDag-Erling Smørgrav 		    lines, lineno);
87*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
882f3ed619SDag-Erling Smørgrav 	}
89ce77a8d6SDag-Erling Smørgrav 	if (eof && !t_feof(tf)) {
902f3ed619SDag-Erling Smørgrav 		t_verbose("expected EOF, but didn't get it\n");
91*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
922f3ed619SDag-Erling Smørgrav 	}
93ce77a8d6SDag-Erling Smørgrav 	if (!eof && t_feof(tf)) {
942f3ed619SDag-Erling Smørgrav 		t_verbose("didn't expect EOF, but got it anyway\n");
95*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
962f3ed619SDag-Erling Smørgrav 	}
97ce77a8d6SDag-Erling Smørgrav 	ch = fgetc(tf->file);
98ce77a8d6SDag-Erling Smørgrav 	if (t_ferror(tf))
99ce77a8d6SDag-Erling Smørgrav 		err(1, "%s(): %s", __func__, tf->name);
1002f3ed619SDag-Erling Smørgrav 	if (eol && ch != '\n') {
1012f3ed619SDag-Erling Smørgrav 		t_verbose("expected EOL, but didn't get it\n");
102*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
103*f3b0ac34SDag-Erling Smørgrav 	} else if (!eol && ch == '\n') {
1042f3ed619SDag-Erling Smørgrav 		t_verbose("didn't expect EOL, but got it anyway\n");
105*f3b0ac34SDag-Erling Smørgrav 		ret = 0;
1062f3ed619SDag-Erling Smørgrav 	}
1072f3ed619SDag-Erling Smørgrav 	if (ch != EOF)
108ce77a8d6SDag-Erling Smørgrav 		ungetc(ch, tf->file);
109*f3b0ac34SDag-Erling Smørgrav 	return (ret);
1102f3ed619SDag-Erling Smørgrav }
1112f3ed619SDag-Erling Smørgrav 
1122f3ed619SDag-Erling Smørgrav 
1132f3ed619SDag-Erling Smørgrav /***************************************************************************
1142f3ed619SDag-Erling Smørgrav  * Lines without words
1152f3ed619SDag-Erling Smørgrav  */
1162f3ed619SDag-Erling Smørgrav 
1172f3ed619SDag-Erling Smørgrav T_FUNC(empty_input, "empty input")
1182f3ed619SDag-Erling Smørgrav {
119ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1202f3ed619SDag-Erling Smørgrav 	int ret;
1212f3ed619SDag-Erling Smørgrav 
122ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
123ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
124ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1252f3ed619SDag-Erling Smørgrav 	return (ret);
1262f3ed619SDag-Erling Smørgrav }
1272f3ed619SDag-Erling Smørgrav 
1282f3ed619SDag-Erling Smørgrav T_FUNC(empty_line, "empty line")
1292f3ed619SDag-Erling Smørgrav {
130ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1312f3ed619SDag-Erling Smørgrav 	int ret;
1322f3ed619SDag-Erling Smørgrav 
133ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
134ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\n");
135ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
136ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
137ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1382f3ed619SDag-Erling Smørgrav 	return (ret);
1392f3ed619SDag-Erling Smørgrav }
1402f3ed619SDag-Erling Smørgrav 
1412f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_line, "unterminated line")
1422f3ed619SDag-Erling Smørgrav {
143ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1442f3ed619SDag-Erling Smørgrav 	int ret;
1452f3ed619SDag-Erling Smørgrav 
146ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
147ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " ");
148ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
149ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
150ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1512f3ed619SDag-Erling Smørgrav 	return (ret);
1522f3ed619SDag-Erling Smørgrav }
1532f3ed619SDag-Erling Smørgrav 
1542f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace, "single whitespace")
1552f3ed619SDag-Erling Smørgrav {
156ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1572f3ed619SDag-Erling Smørgrav 	int ret;
1582f3ed619SDag-Erling Smørgrav 
159ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
160ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " \n");
161ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
162ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
163ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1642f3ed619SDag-Erling Smørgrav 	return (ret);
1652f3ed619SDag-Erling Smørgrav }
1662f3ed619SDag-Erling Smørgrav 
1672f3ed619SDag-Erling Smørgrav T_FUNC(multiple_whitespace, "multiple whitespace")
1682f3ed619SDag-Erling Smørgrav {
169ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1702f3ed619SDag-Erling Smørgrav 	int ret;
1712f3ed619SDag-Erling Smørgrav 
172ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
173ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " \t\r\n");
174ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
175ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
176ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1772f3ed619SDag-Erling Smørgrav 	return (ret);
1782f3ed619SDag-Erling Smørgrav }
1792f3ed619SDag-Erling Smørgrav 
1802f3ed619SDag-Erling Smørgrav T_FUNC(comment, "comment")
1812f3ed619SDag-Erling Smørgrav {
182ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1832f3ed619SDag-Erling Smørgrav 	int ret;
1842f3ed619SDag-Erling Smørgrav 
185ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
186ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "# comment\n");
187ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
188ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
189ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
1902f3ed619SDag-Erling Smørgrav 	return (ret);
1912f3ed619SDag-Erling Smørgrav }
1922f3ed619SDag-Erling Smørgrav 
1932f3ed619SDag-Erling Smørgrav T_FUNC(whitespace_before_comment, "whitespace before comment")
1942f3ed619SDag-Erling Smørgrav {
195ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
1962f3ed619SDag-Erling Smørgrav 	int ret;
1972f3ed619SDag-Erling Smørgrav 
198ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
199ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " # comment\n");
200ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
201ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
202ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2032f3ed619SDag-Erling Smørgrav 	return (ret);
2042f3ed619SDag-Erling Smørgrav }
2052f3ed619SDag-Erling Smørgrav 
206*f3b0ac34SDag-Erling Smørgrav T_FUNC(single_quoted_comment, "single-quoted comment")
207*f3b0ac34SDag-Erling Smørgrav {
208*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
209*f3b0ac34SDag-Erling Smørgrav 	int ret;
210*f3b0ac34SDag-Erling Smørgrav 
211*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
212*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, " '# comment'\n");
213*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
214*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
215*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
216*f3b0ac34SDag-Erling Smørgrav 	return (ret);
217*f3b0ac34SDag-Erling Smørgrav }
218*f3b0ac34SDag-Erling Smørgrav 
219*f3b0ac34SDag-Erling Smørgrav T_FUNC(double_quoted_comment, "double-quoted comment")
220*f3b0ac34SDag-Erling Smørgrav {
221*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
222*f3b0ac34SDag-Erling Smørgrav 	int ret;
223*f3b0ac34SDag-Erling Smørgrav 
224*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
225*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, " \"# comment\"\n");
226*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
227*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
228*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
229*f3b0ac34SDag-Erling Smørgrav 	return (ret);
230*f3b0ac34SDag-Erling Smørgrav }
231*f3b0ac34SDag-Erling Smørgrav 
232*f3b0ac34SDag-Erling Smørgrav T_FUNC(comment_at_eof, "comment at end of file")
233*f3b0ac34SDag-Erling Smørgrav {
234*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
235*f3b0ac34SDag-Erling Smørgrav 	int ret;
236*f3b0ac34SDag-Erling Smørgrav 
237*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
238*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "# comment");
239*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
240*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
241*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
242*f3b0ac34SDag-Erling Smørgrav 	return (ret);
243*f3b0ac34SDag-Erling Smørgrav }
244*f3b0ac34SDag-Erling Smørgrav 
2452f3ed619SDag-Erling Smørgrav 
2462f3ed619SDag-Erling Smørgrav /***************************************************************************
2472f3ed619SDag-Erling Smørgrav  * Simple cases - no quotes or escapes
2482f3ed619SDag-Erling Smørgrav  */
2492f3ed619SDag-Erling Smørgrav 
2502f3ed619SDag-Erling Smørgrav T_FUNC(single_word, "single word")
2512f3ed619SDag-Erling Smørgrav {
2522f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
253ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2542f3ed619SDag-Erling Smørgrav 	int ret;
2552f3ed619SDag-Erling Smørgrav 
256ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
257ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s\n", word);
258ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
259ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
260ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2612f3ed619SDag-Erling Smørgrav 	return (ret);
2622f3ed619SDag-Erling Smørgrav }
2632f3ed619SDag-Erling Smørgrav 
2642f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace_before_word, "single whitespace before word")
2652f3ed619SDag-Erling Smørgrav {
2662f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
267ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2682f3ed619SDag-Erling Smørgrav 	int ret;
2692f3ed619SDag-Erling Smørgrav 
270ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
271ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, " %s\n", word);
272ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
273ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
274ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2752f3ed619SDag-Erling Smørgrav 	return (ret);
2762f3ed619SDag-Erling Smørgrav }
2772f3ed619SDag-Erling Smørgrav 
2782f3ed619SDag-Erling Smørgrav T_FUNC(double_whitespace_before_word, "double whitespace before word")
2792f3ed619SDag-Erling Smørgrav {
2802f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
281ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2822f3ed619SDag-Erling Smørgrav 	int ret;
2832f3ed619SDag-Erling Smørgrav 
284ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
285ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "  %s\n", word);
286ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
287ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
288ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
2892f3ed619SDag-Erling Smørgrav 	return (ret);
2902f3ed619SDag-Erling Smørgrav }
2912f3ed619SDag-Erling Smørgrav 
2922f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace_after_word, "single whitespace after word")
2932f3ed619SDag-Erling Smørgrav {
2942f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
295ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
2962f3ed619SDag-Erling Smørgrav 	int ret;
2972f3ed619SDag-Erling Smørgrav 
298ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
299ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s \n", word);
300ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
301ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/);
302ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3032f3ed619SDag-Erling Smørgrav 	return (ret);
3042f3ed619SDag-Erling Smørgrav }
3052f3ed619SDag-Erling Smørgrav 
3062f3ed619SDag-Erling Smørgrav T_FUNC(double_whitespace_after_word, "double whitespace after word")
3072f3ed619SDag-Erling Smørgrav {
3082f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
309ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3102f3ed619SDag-Erling Smørgrav 	int ret;
3112f3ed619SDag-Erling Smørgrav 
312ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
313ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s  \n", word);
314ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
315ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/);
316ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3172f3ed619SDag-Erling Smørgrav 	return (ret);
3182f3ed619SDag-Erling Smørgrav }
3192f3ed619SDag-Erling Smørgrav 
3202f3ed619SDag-Erling Smørgrav T_FUNC(comment_after_word, "comment after word")
3212f3ed619SDag-Erling Smørgrav {
3222f3ed619SDag-Erling Smørgrav 	const char *word = "hello";
323ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3242f3ed619SDag-Erling Smørgrav 	int ret;
3252f3ed619SDag-Erling Smørgrav 
326ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
327ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s # comment\n", word);
328ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
329ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
330ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
331ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3322f3ed619SDag-Erling Smørgrav 	return (ret);
3332f3ed619SDag-Erling Smørgrav }
3342f3ed619SDag-Erling Smørgrav 
3352f3ed619SDag-Erling Smørgrav T_FUNC(word_containing_hash, "word containing hash")
3362f3ed619SDag-Erling Smørgrav {
3372f3ed619SDag-Erling Smørgrav 	const char *word = "hello#world";
338ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3392f3ed619SDag-Erling Smørgrav 	int ret;
3402f3ed619SDag-Erling Smørgrav 
341ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
342ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s\n", word);
343ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
344ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
345ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3462f3ed619SDag-Erling Smørgrav 	return (ret);
3472f3ed619SDag-Erling Smørgrav }
3482f3ed619SDag-Erling Smørgrav 
3492f3ed619SDag-Erling Smørgrav T_FUNC(two_words, "two words")
3502f3ed619SDag-Erling Smørgrav {
3512f3ed619SDag-Erling Smørgrav 	const char *word[] = { "hello", "world" };
352ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3532f3ed619SDag-Erling Smørgrav 	int ret;
3542f3ed619SDag-Erling Smørgrav 
355ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
356ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "%s %s\n", word[0], word[1]);
357ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
358ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, word[0], 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
359ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, word[1], 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
360ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3612f3ed619SDag-Erling Smørgrav 	return (ret);
3622f3ed619SDag-Erling Smørgrav }
3632f3ed619SDag-Erling Smørgrav 
3642f3ed619SDag-Erling Smørgrav 
3652f3ed619SDag-Erling Smørgrav /***************************************************************************
3662f3ed619SDag-Erling Smørgrav  * Escapes
3672f3ed619SDag-Erling Smørgrav  */
3682f3ed619SDag-Erling Smørgrav 
3692f3ed619SDag-Erling Smørgrav T_FUNC(naked_escape, "naked escape")
3702f3ed619SDag-Erling Smørgrav {
371ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3722f3ed619SDag-Erling Smørgrav 	int ret;
3732f3ed619SDag-Erling Smørgrav 
374ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
375ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\");
376ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
377ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
378ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3792f3ed619SDag-Erling Smørgrav 	return (ret);
3802f3ed619SDag-Erling Smørgrav }
3812f3ed619SDag-Erling Smørgrav 
3822f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape, "escaped escape")
3832f3ed619SDag-Erling Smørgrav {
384ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3852f3ed619SDag-Erling Smørgrav 	int ret;
3862f3ed619SDag-Erling Smørgrav 
387ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
388ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\\\\n");
389ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
390ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
391ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
3922f3ed619SDag-Erling Smørgrav 	return (ret);
3932f3ed619SDag-Erling Smørgrav }
3942f3ed619SDag-Erling Smørgrav 
3952f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace, "escaped whitespace")
3962f3ed619SDag-Erling Smørgrav {
397ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
3982f3ed619SDag-Erling Smørgrav 	int ret;
3992f3ed619SDag-Erling Smørgrav 
400ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
401ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\  \\\t \\\r \\\n\n");
402ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
403ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
404ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
405ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
4062f3ed619SDag-Erling Smørgrav 	    /* this last one is a line continuation */
407ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, NULL, 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
408ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4092f3ed619SDag-Erling Smørgrav 	return (ret);
4102f3ed619SDag-Erling Smørgrav }
4112f3ed619SDag-Erling Smørgrav 
4122f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_before_word, "escaped newline before word")
4132f3ed619SDag-Erling Smørgrav {
414ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4152f3ed619SDag-Erling Smørgrav 	int ret;
4162f3ed619SDag-Erling Smørgrav 
417ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
418ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\\nhello world\n");
419ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
420ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/);
421ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4222f3ed619SDag-Erling Smørgrav 	return (ret);
4232f3ed619SDag-Erling Smørgrav }
4242f3ed619SDag-Erling Smørgrav 
4252f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_within_word, "escaped newline within word")
4262f3ed619SDag-Erling Smørgrav {
427ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4282f3ed619SDag-Erling Smørgrav 	int ret;
4292f3ed619SDag-Erling Smørgrav 
430ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
431ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\nworld\n");
432ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
433ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
434ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4352f3ed619SDag-Erling Smørgrav 	return (ret);
4362f3ed619SDag-Erling Smørgrav }
4372f3ed619SDag-Erling Smørgrav 
4382f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_after_word, "escaped newline after word")
4392f3ed619SDag-Erling Smørgrav {
440ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4412f3ed619SDag-Erling Smørgrav 	int ret;
4422f3ed619SDag-Erling Smørgrav 
443ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
444ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\n world\n");
445ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
446ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/);
447ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4482f3ed619SDag-Erling Smørgrav 	return (ret);
4492f3ed619SDag-Erling Smørgrav }
4502f3ed619SDag-Erling Smørgrav 
4512f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter, "escaped letter")
4522f3ed619SDag-Erling Smørgrav {
453ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4542f3ed619SDag-Erling Smørgrav 	int ret;
4552f3ed619SDag-Erling Smørgrav 
456ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
457ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\z\n");
458ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
459ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
460ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
4612f3ed619SDag-Erling Smørgrav 	return (ret);
4622f3ed619SDag-Erling Smørgrav }
4632f3ed619SDag-Erling Smørgrav 
464*f3b0ac34SDag-Erling Smørgrav T_FUNC(escaped_comment, "escaped comment")
465*f3b0ac34SDag-Erling Smørgrav {
466*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
467*f3b0ac34SDag-Erling Smørgrav 	int ret;
468*f3b0ac34SDag-Erling Smørgrav 
469*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
470*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, " \\# comment\n");
471*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
472*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "#", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
473*f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
474*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
475*f3b0ac34SDag-Erling Smørgrav 	return (ret);
476*f3b0ac34SDag-Erling Smørgrav }
477*f3b0ac34SDag-Erling Smørgrav 
478*f3b0ac34SDag-Erling Smørgrav T_FUNC(escape_at_eof, "escape at end of file")
479*f3b0ac34SDag-Erling Smørgrav {
480*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
481*f3b0ac34SDag-Erling Smørgrav 	int ret;
482*f3b0ac34SDag-Erling Smørgrav 
483*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
484*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "z\\");
485*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
486*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
487*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
488*f3b0ac34SDag-Erling Smørgrav 	return (ret);
489*f3b0ac34SDag-Erling Smørgrav }
490*f3b0ac34SDag-Erling Smørgrav 
4912f3ed619SDag-Erling Smørgrav 
4922f3ed619SDag-Erling Smørgrav /***************************************************************************
4932f3ed619SDag-Erling Smørgrav  * Quotes
4942f3ed619SDag-Erling Smørgrav  */
4952f3ed619SDag-Erling Smørgrav 
4962f3ed619SDag-Erling Smørgrav T_FUNC(naked_single_quote, "naked single quote")
4972f3ed619SDag-Erling Smørgrav {
498ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
4992f3ed619SDag-Erling Smørgrav 	int ret;
5002f3ed619SDag-Erling Smørgrav 
501ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
502ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'");
503ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
504ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
505ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5062f3ed619SDag-Erling Smørgrav 	return (ret);
5072f3ed619SDag-Erling Smørgrav }
5082f3ed619SDag-Erling Smørgrav 
5092f3ed619SDag-Erling Smørgrav T_FUNC(naked_double_quote, "naked double quote")
5102f3ed619SDag-Erling Smørgrav {
511ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5122f3ed619SDag-Erling Smørgrav 	int ret;
5132f3ed619SDag-Erling Smørgrav 
514ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
515ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"");
516ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
517ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
518ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5192f3ed619SDag-Erling Smørgrav 	return (ret);
5202f3ed619SDag-Erling Smørgrav }
5212f3ed619SDag-Erling Smørgrav 
5222f3ed619SDag-Erling Smørgrav T_FUNC(empty_single_quotes, "empty single quotes")
5232f3ed619SDag-Erling Smørgrav {
524ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5252f3ed619SDag-Erling Smørgrav 	int ret;
5262f3ed619SDag-Erling Smørgrav 
527ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
528ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "''\n");
529ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
530ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
531ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5322f3ed619SDag-Erling Smørgrav 	return (ret);
5332f3ed619SDag-Erling Smørgrav }
5342f3ed619SDag-Erling Smørgrav 
5352f3ed619SDag-Erling Smørgrav T_FUNC(empty_double_quotes, "empty double quotes")
5362f3ed619SDag-Erling Smørgrav {
537ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5382f3ed619SDag-Erling Smørgrav 	int ret;
5392f3ed619SDag-Erling Smørgrav 
540ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
541ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\"\n");
542ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
543ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
544ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5452f3ed619SDag-Erling Smørgrav 	return (ret);
5462f3ed619SDag-Erling Smørgrav }
5472f3ed619SDag-Erling Smørgrav 
5482f3ed619SDag-Erling Smørgrav T_FUNC(single_quotes_within_double_quotes, "single quotes within double quotes")
5492f3ed619SDag-Erling Smørgrav {
550ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5512f3ed619SDag-Erling Smørgrav 	int ret;
5522f3ed619SDag-Erling Smørgrav 
553ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
554ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"' '\"\n");
555ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
556ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "' '", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
557ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5582f3ed619SDag-Erling Smørgrav 	return (ret);
5592f3ed619SDag-Erling Smørgrav }
5602f3ed619SDag-Erling Smørgrav 
5612f3ed619SDag-Erling Smørgrav T_FUNC(double_quotes_within_single_quotes, "double quotes within single quotes")
5622f3ed619SDag-Erling Smørgrav {
563ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5642f3ed619SDag-Erling Smørgrav 	int ret;
5652f3ed619SDag-Erling Smørgrav 
566ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
567ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\" \"'\n");
568ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
569ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\" \"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
570ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5712f3ed619SDag-Erling Smørgrav 	return (ret);
5722f3ed619SDag-Erling Smørgrav }
5732f3ed619SDag-Erling Smørgrav 
5742f3ed619SDag-Erling Smørgrav T_FUNC(single_quoted_whitespace, "single-quoted whitespace")
5752f3ed619SDag-Erling Smørgrav {
576ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5772f3ed619SDag-Erling Smørgrav 	int ret;
5782f3ed619SDag-Erling Smørgrav 
579ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
580ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "' ' '\t' '\r' '\n'\n");
581ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
582ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
583ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
584ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
585ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
586ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
5872f3ed619SDag-Erling Smørgrav 	return (ret);
5882f3ed619SDag-Erling Smørgrav }
5892f3ed619SDag-Erling Smørgrav 
5902f3ed619SDag-Erling Smørgrav T_FUNC(double_quoted_whitespace, "double-quoted whitespace")
5912f3ed619SDag-Erling Smørgrav {
592ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
5932f3ed619SDag-Erling Smørgrav 	int ret;
5942f3ed619SDag-Erling Smørgrav 
595ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
596ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\" \" \"\t\" \"\r\" \"\n\"\n");
597ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
598ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
599ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
600ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
601ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
602ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
6032f3ed619SDag-Erling Smørgrav 	return (ret);
6042f3ed619SDag-Erling Smørgrav }
6052f3ed619SDag-Erling Smørgrav 
6062f3ed619SDag-Erling Smørgrav T_FUNC(single_quoted_words, "single-quoted words")
6072f3ed619SDag-Erling Smørgrav {
608ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
6092f3ed619SDag-Erling Smørgrav 	int ret;
6102f3ed619SDag-Erling Smørgrav 
611ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
612ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'hello world'\n");
613ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
614ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
615ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
6162f3ed619SDag-Erling Smørgrav 	return (ret);
6172f3ed619SDag-Erling Smørgrav }
6182f3ed619SDag-Erling Smørgrav 
6192f3ed619SDag-Erling Smørgrav T_FUNC(double_quoted_words, "double-quoted words")
6202f3ed619SDag-Erling Smørgrav {
621ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
6222f3ed619SDag-Erling Smørgrav 	int ret;
6232f3ed619SDag-Erling Smørgrav 
624ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
625ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"hello world\"\n");
626ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
627ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
628ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
629ce77a8d6SDag-Erling Smørgrav 	return (ret);
630ce77a8d6SDag-Erling Smørgrav }
631ce77a8d6SDag-Erling Smørgrav 
632ce77a8d6SDag-Erling Smørgrav 
633ce77a8d6SDag-Erling Smørgrav /***************************************************************************
634ce77a8d6SDag-Erling Smørgrav  * Combinations of quoted and unquoted text
635ce77a8d6SDag-Erling Smørgrav  */
636ce77a8d6SDag-Erling Smørgrav 
637ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_before_word, "single quote before word")
638ce77a8d6SDag-Erling Smørgrav {
639ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
640ce77a8d6SDag-Erling Smørgrav 	int ret;
641ce77a8d6SDag-Erling Smørgrav 
642ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
643ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'hello 'world\n");
644ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
645ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
646ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
647ce77a8d6SDag-Erling Smørgrav 	return (ret);
648ce77a8d6SDag-Erling Smørgrav }
649ce77a8d6SDag-Erling Smørgrav 
650ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_before_word, "double quote before word")
651ce77a8d6SDag-Erling Smørgrav {
652ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
653ce77a8d6SDag-Erling Smørgrav 	int ret;
654ce77a8d6SDag-Erling Smørgrav 
655ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
656ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"hello \"world\n");
657ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
658ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
659ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
660ce77a8d6SDag-Erling Smørgrav 	return (ret);
661ce77a8d6SDag-Erling Smørgrav }
662ce77a8d6SDag-Erling Smørgrav 
663ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_within_word, "single quote within word")
664ce77a8d6SDag-Erling Smørgrav {
665ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
666ce77a8d6SDag-Erling Smørgrav 	int ret;
667ce77a8d6SDag-Erling Smørgrav 
668ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
669ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello' 'world\n");
670ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
671ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
672ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
673ce77a8d6SDag-Erling Smørgrav 	return (ret);
674ce77a8d6SDag-Erling Smørgrav }
675ce77a8d6SDag-Erling Smørgrav 
676ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_within_word, "double quote within word")
677ce77a8d6SDag-Erling Smørgrav {
678ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
679ce77a8d6SDag-Erling Smørgrav 	int ret;
680ce77a8d6SDag-Erling Smørgrav 
681ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
682ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\" \"world\n");
683ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
684ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
685ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
686ce77a8d6SDag-Erling Smørgrav 	return (ret);
687ce77a8d6SDag-Erling Smørgrav }
688ce77a8d6SDag-Erling Smørgrav 
689ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_after_word, "single quote after word")
690ce77a8d6SDag-Erling Smørgrav {
691ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
692ce77a8d6SDag-Erling Smørgrav 	int ret;
693ce77a8d6SDag-Erling Smørgrav 
694ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
695ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello' world'\n");
696ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
697ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
698ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
699ce77a8d6SDag-Erling Smørgrav 	return (ret);
700ce77a8d6SDag-Erling Smørgrav }
701ce77a8d6SDag-Erling Smørgrav 
702ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_after_word, "double quote after word")
703ce77a8d6SDag-Erling Smørgrav {
704ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
705ce77a8d6SDag-Erling Smørgrav 	int ret;
706ce77a8d6SDag-Erling Smørgrav 
707ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
708ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "hello\" world\"\n");
709ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
710ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
711ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7122f3ed619SDag-Erling Smørgrav 	return (ret);
7132f3ed619SDag-Erling Smørgrav }
7142f3ed619SDag-Erling Smørgrav 
7152f3ed619SDag-Erling Smørgrav 
7162f3ed619SDag-Erling Smørgrav /***************************************************************************
7172f3ed619SDag-Erling Smørgrav  * Combinations of escape and quotes
7182f3ed619SDag-Erling Smørgrav  */
7192f3ed619SDag-Erling Smørgrav 
7202f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote,
7212f3ed619SDag-Erling Smørgrav     "escaped single quote")
7222f3ed619SDag-Erling Smørgrav {
723ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7242f3ed619SDag-Erling Smørgrav 	int ret;
7252f3ed619SDag-Erling Smørgrav 
726ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
727ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\'\n");
728ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
729ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
730ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7312f3ed619SDag-Erling Smørgrav 	return (ret);
7322f3ed619SDag-Erling Smørgrav }
7332f3ed619SDag-Erling Smørgrav 
7342f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote,
7352f3ed619SDag-Erling Smørgrav     "escaped double quote")
7362f3ed619SDag-Erling Smørgrav {
737ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7382f3ed619SDag-Erling Smørgrav 	int ret;
7392f3ed619SDag-Erling Smørgrav 
740ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
741ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\\\"\n");
742ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
743ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
744ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7452f3ed619SDag-Erling Smørgrav 	return (ret);
7462f3ed619SDag-Erling Smørgrav }
7472f3ed619SDag-Erling Smørgrav 
7482f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace_within_single_quotes,
7492f3ed619SDag-Erling Smørgrav     "escaped whitespace within single quotes")
7502f3ed619SDag-Erling Smørgrav {
751ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7522f3ed619SDag-Erling Smørgrav 	int ret;
7532f3ed619SDag-Erling Smørgrav 
754ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
755ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\ ' '\\\t' '\\\r' '\\\n'\n");
756ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
757ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
758ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
759ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
760ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
761ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7622f3ed619SDag-Erling Smørgrav 	return (ret);
7632f3ed619SDag-Erling Smørgrav }
7642f3ed619SDag-Erling Smørgrav 
7652f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace_within_double_quotes,
7662f3ed619SDag-Erling Smørgrav     "escaped whitespace within double quotes")
7672f3ed619SDag-Erling Smørgrav {
768ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7692f3ed619SDag-Erling Smørgrav 	int ret;
7702f3ed619SDag-Erling Smørgrav 
771ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
772ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\ \" \"\\\t\" \"\\\r\" \"\\\n\"\n");
773ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
774ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
775ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
776ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
7772f3ed619SDag-Erling Smørgrav 	    /* this last one is a line continuation */
778ce77a8d6SDag-Erling Smørgrav 	    orw_expect(tf, "", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
779ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7802f3ed619SDag-Erling Smørgrav 	return (ret);
7812f3ed619SDag-Erling Smørgrav }
7822f3ed619SDag-Erling Smørgrav 
7832f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter_within_single_quotes,
7842f3ed619SDag-Erling Smørgrav     "escaped letter within single quotes")
7852f3ed619SDag-Erling Smørgrav {
786ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
7872f3ed619SDag-Erling Smørgrav 	int ret;
7882f3ed619SDag-Erling Smørgrav 
789ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
790ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\z'\n");
791ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
792ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
793ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
7942f3ed619SDag-Erling Smørgrav 	return (ret);
7952f3ed619SDag-Erling Smørgrav }
7962f3ed619SDag-Erling Smørgrav 
7972f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter_within_double_quotes,
7982f3ed619SDag-Erling Smørgrav     "escaped letter within double quotes")
7992f3ed619SDag-Erling Smørgrav {
800ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8012f3ed619SDag-Erling Smørgrav 	int ret;
8022f3ed619SDag-Erling Smørgrav 
803ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
804ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\z\"\n");
805ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
806ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
807ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8082f3ed619SDag-Erling Smørgrav 	return (ret);
8092f3ed619SDag-Erling Smørgrav }
8102f3ed619SDag-Erling Smørgrav 
8112f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape_within_single_quotes,
8122f3ed619SDag-Erling Smørgrav     "escaped escape within single quotes")
8132f3ed619SDag-Erling Smørgrav {
814ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8152f3ed619SDag-Erling Smørgrav 	int ret;
8162f3ed619SDag-Erling Smørgrav 
817ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
818ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\\\'\n");
819ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
820ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
821ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8222f3ed619SDag-Erling Smørgrav 	return (ret);
8232f3ed619SDag-Erling Smørgrav }
8242f3ed619SDag-Erling Smørgrav 
8252f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape_within_double_quotes,
8262f3ed619SDag-Erling Smørgrav     "escaped escape within double quotes")
8272f3ed619SDag-Erling Smørgrav {
828ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8292f3ed619SDag-Erling Smørgrav 	int ret;
8302f3ed619SDag-Erling Smørgrav 
831ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
832ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\\\\"\n");
833ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
834ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
835ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8362f3ed619SDag-Erling Smørgrav 	return (ret);
8372f3ed619SDag-Erling Smørgrav }
8382f3ed619SDag-Erling Smørgrav 
8392f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote_within_single_quotes,
8402f3ed619SDag-Erling Smørgrav     "escaped single quote within single quotes")
8412f3ed619SDag-Erling Smørgrav {
842ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8432f3ed619SDag-Erling Smørgrav 	int ret;
8442f3ed619SDag-Erling Smørgrav 
845ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
846ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\''\n");
847ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
848ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, NULL, 1 /*lines*/, 1 /*eof*/, 0 /*eol*/);
849ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8502f3ed619SDag-Erling Smørgrav 	return (ret);
8512f3ed619SDag-Erling Smørgrav }
8522f3ed619SDag-Erling Smørgrav 
8532f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote_within_single_quotes,
8542f3ed619SDag-Erling Smørgrav     "escaped double quote within single quotes")
8552f3ed619SDag-Erling Smørgrav {
856ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8572f3ed619SDag-Erling Smørgrav 	int ret;
8582f3ed619SDag-Erling Smørgrav 
859ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
860ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "'\\\"'\n");
861ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
862ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
863ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8642f3ed619SDag-Erling Smørgrav 	return (ret);
8652f3ed619SDag-Erling Smørgrav }
8662f3ed619SDag-Erling Smørgrav 
8672f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote_within_double_quotes,
8682f3ed619SDag-Erling Smørgrav     "escaped single quote within double quotes")
8692f3ed619SDag-Erling Smørgrav {
870ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8712f3ed619SDag-Erling Smørgrav 	int ret;
8722f3ed619SDag-Erling Smørgrav 
873ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
874ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\'\"\n");
875ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
876ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\\'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
877ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8782f3ed619SDag-Erling Smørgrav 	return (ret);
8792f3ed619SDag-Erling Smørgrav }
8802f3ed619SDag-Erling Smørgrav 
8812f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote_within_double_quotes,
8822f3ed619SDag-Erling Smørgrav     "escaped double quote within double quotes")
8832f3ed619SDag-Erling Smørgrav {
884ce77a8d6SDag-Erling Smørgrav 	struct t_file *tf;
8852f3ed619SDag-Erling Smørgrav 	int ret;
8862f3ed619SDag-Erling Smørgrav 
887ce77a8d6SDag-Erling Smørgrav 	tf = t_fopen(NULL);
888ce77a8d6SDag-Erling Smørgrav 	t_fprintf(tf, "\"\\\"\"\n");
889ce77a8d6SDag-Erling Smørgrav 	t_frewind(tf);
890ce77a8d6SDag-Erling Smørgrav 	ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
891ce77a8d6SDag-Erling Smørgrav 	t_fclose(tf);
8922f3ed619SDag-Erling Smørgrav 	return (ret);
8932f3ed619SDag-Erling Smørgrav }
8942f3ed619SDag-Erling Smørgrav 
8952f3ed619SDag-Erling Smørgrav 
8962f3ed619SDag-Erling Smørgrav /***************************************************************************
897*f3b0ac34SDag-Erling Smørgrav  * Line continuation
898*f3b0ac34SDag-Erling Smørgrav  */
899*f3b0ac34SDag-Erling Smørgrav 
900*f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_within_whitespace, "line continuation within whitespace")
901*f3b0ac34SDag-Erling Smørgrav {
902*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
903*f3b0ac34SDag-Erling Smørgrav 	int ret;
904*f3b0ac34SDag-Erling Smørgrav 
905*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
906*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello \\\n world\n");
907*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
908*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
909*f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
910*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
911*f3b0ac34SDag-Erling Smørgrav 	return (ret);
912*f3b0ac34SDag-Erling Smørgrav }
913*f3b0ac34SDag-Erling Smørgrav 
914*f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_before_whitespace, "line continuation before whitespace")
915*f3b0ac34SDag-Erling Smørgrav {
916*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
917*f3b0ac34SDag-Erling Smørgrav 	int ret;
918*f3b0ac34SDag-Erling Smørgrav 
919*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
920*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\n world\n");
921*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
922*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
923*f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
924*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
925*f3b0ac34SDag-Erling Smørgrav 	return (ret);
926*f3b0ac34SDag-Erling Smørgrav }
927*f3b0ac34SDag-Erling Smørgrav 
928*f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_after_whitespace, "line continuation after whitespace")
929*f3b0ac34SDag-Erling Smørgrav {
930*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
931*f3b0ac34SDag-Erling Smørgrav 	int ret;
932*f3b0ac34SDag-Erling Smørgrav 
933*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
934*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello \\\nworld\n");
935*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
936*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
937*f3b0ac34SDag-Erling Smørgrav 	    orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
938*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
939*f3b0ac34SDag-Erling Smørgrav 	return (ret);
940*f3b0ac34SDag-Erling Smørgrav }
941*f3b0ac34SDag-Erling Smørgrav 
942*f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_within_word, "line continuation within word")
943*f3b0ac34SDag-Erling Smørgrav {
944*f3b0ac34SDag-Erling Smørgrav 	struct t_file *tf;
945*f3b0ac34SDag-Erling Smørgrav 	int ret;
946*f3b0ac34SDag-Erling Smørgrav 
947*f3b0ac34SDag-Erling Smørgrav 	tf = t_fopen(NULL);
948*f3b0ac34SDag-Erling Smørgrav 	t_fprintf(tf, "hello\\\nworld\n");
949*f3b0ac34SDag-Erling Smørgrav 	t_frewind(tf);
950*f3b0ac34SDag-Erling Smørgrav 	ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
951*f3b0ac34SDag-Erling Smørgrav 	t_fclose(tf);
952*f3b0ac34SDag-Erling Smørgrav 	return (ret);
953*f3b0ac34SDag-Erling Smørgrav }
954*f3b0ac34SDag-Erling Smørgrav 
955*f3b0ac34SDag-Erling Smørgrav 
956*f3b0ac34SDag-Erling Smørgrav /***************************************************************************
9572f3ed619SDag-Erling Smørgrav  * Boilerplate
9582f3ed619SDag-Erling Smørgrav  */
9592f3ed619SDag-Erling Smørgrav 
960*f3b0ac34SDag-Erling Smørgrav static int
9612f3ed619SDag-Erling Smørgrav t_prepare(int argc, char *argv[])
9622f3ed619SDag-Erling Smørgrav {
9632f3ed619SDag-Erling Smørgrav 
9642f3ed619SDag-Erling Smørgrav 	(void)argc;
9652f3ed619SDag-Erling Smørgrav 	(void)argv;
966*f3b0ac34SDag-Erling Smørgrav 
967*f3b0ac34SDag-Erling Smørgrav 	T(empty_input);
968*f3b0ac34SDag-Erling Smørgrav 	T(empty_line);
969*f3b0ac34SDag-Erling Smørgrav 	T(unterminated_line);
970*f3b0ac34SDag-Erling Smørgrav 	T(single_whitespace);
971*f3b0ac34SDag-Erling Smørgrav 	T(multiple_whitespace);
972*f3b0ac34SDag-Erling Smørgrav 	T(comment);
973*f3b0ac34SDag-Erling Smørgrav 	T(whitespace_before_comment);
974*f3b0ac34SDag-Erling Smørgrav 	T(single_quoted_comment);
975*f3b0ac34SDag-Erling Smørgrav 	T(double_quoted_comment);
976*f3b0ac34SDag-Erling Smørgrav 	T(comment_at_eof);
977*f3b0ac34SDag-Erling Smørgrav 
978*f3b0ac34SDag-Erling Smørgrav 	T(single_word);
979*f3b0ac34SDag-Erling Smørgrav 	T(single_whitespace_before_word);
980*f3b0ac34SDag-Erling Smørgrav 	T(double_whitespace_before_word);
981*f3b0ac34SDag-Erling Smørgrav 	T(single_whitespace_after_word);
982*f3b0ac34SDag-Erling Smørgrav 	T(double_whitespace_after_word);
983*f3b0ac34SDag-Erling Smørgrav 	T(comment_after_word);
984*f3b0ac34SDag-Erling Smørgrav 	T(word_containing_hash);
985*f3b0ac34SDag-Erling Smørgrav 	T(two_words);
986*f3b0ac34SDag-Erling Smørgrav 
987*f3b0ac34SDag-Erling Smørgrav 	T(naked_escape);
988*f3b0ac34SDag-Erling Smørgrav 	T(escaped_escape);
989*f3b0ac34SDag-Erling Smørgrav 	T(escaped_whitespace);
990*f3b0ac34SDag-Erling Smørgrav 	T(escaped_newline_before_word);
991*f3b0ac34SDag-Erling Smørgrav 	T(escaped_newline_within_word);
992*f3b0ac34SDag-Erling Smørgrav 	T(escaped_newline_after_word);
993*f3b0ac34SDag-Erling Smørgrav 	T(escaped_letter);
994*f3b0ac34SDag-Erling Smørgrav 	T(escaped_comment);
995*f3b0ac34SDag-Erling Smørgrav 	T(escape_at_eof);
996*f3b0ac34SDag-Erling Smørgrav 
997*f3b0ac34SDag-Erling Smørgrav 	T(naked_single_quote);
998*f3b0ac34SDag-Erling Smørgrav 	T(naked_double_quote);
999*f3b0ac34SDag-Erling Smørgrav 	T(empty_single_quotes);
1000*f3b0ac34SDag-Erling Smørgrav 	T(empty_double_quotes);
1001*f3b0ac34SDag-Erling Smørgrav 	T(single_quotes_within_double_quotes);
1002*f3b0ac34SDag-Erling Smørgrav 	T(double_quotes_within_single_quotes);
1003*f3b0ac34SDag-Erling Smørgrav 	T(single_quoted_whitespace);
1004*f3b0ac34SDag-Erling Smørgrav 	T(double_quoted_whitespace);
1005*f3b0ac34SDag-Erling Smørgrav 	T(single_quoted_words);
1006*f3b0ac34SDag-Erling Smørgrav 	T(double_quoted_words);
1007*f3b0ac34SDag-Erling Smørgrav 
1008*f3b0ac34SDag-Erling Smørgrav 	T(single_quote_before_word);
1009*f3b0ac34SDag-Erling Smørgrav 	T(double_quote_before_word);
1010*f3b0ac34SDag-Erling Smørgrav 	T(single_quote_within_word);
1011*f3b0ac34SDag-Erling Smørgrav 	T(double_quote_within_word);
1012*f3b0ac34SDag-Erling Smørgrav 	T(single_quote_after_word);
1013*f3b0ac34SDag-Erling Smørgrav 	T(double_quote_after_word);
1014*f3b0ac34SDag-Erling Smørgrav 
1015*f3b0ac34SDag-Erling Smørgrav 	T(escaped_single_quote);
1016*f3b0ac34SDag-Erling Smørgrav 	T(escaped_double_quote);
1017*f3b0ac34SDag-Erling Smørgrav 	T(escaped_whitespace_within_single_quotes);
1018*f3b0ac34SDag-Erling Smørgrav 	T(escaped_whitespace_within_double_quotes);
1019*f3b0ac34SDag-Erling Smørgrav 	T(escaped_letter_within_single_quotes);
1020*f3b0ac34SDag-Erling Smørgrav 	T(escaped_letter_within_double_quotes);
1021*f3b0ac34SDag-Erling Smørgrav 	T(escaped_escape_within_single_quotes);
1022*f3b0ac34SDag-Erling Smørgrav 	T(escaped_escape_within_double_quotes);
1023*f3b0ac34SDag-Erling Smørgrav 	T(escaped_single_quote_within_single_quotes);
1024*f3b0ac34SDag-Erling Smørgrav 	T(escaped_double_quote_within_single_quotes);
1025*f3b0ac34SDag-Erling Smørgrav 	T(escaped_single_quote_within_double_quotes);
1026*f3b0ac34SDag-Erling Smørgrav 	T(escaped_double_quote_within_double_quotes);
1027*f3b0ac34SDag-Erling Smørgrav 
1028*f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_within_whitespace);
1029*f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_before_whitespace);
1030*f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_after_whitespace);
1031*f3b0ac34SDag-Erling Smørgrav 	T(line_continuation_within_word);
1032*f3b0ac34SDag-Erling Smørgrav 
1033*f3b0ac34SDag-Erling Smørgrav 	return (0);
10342f3ed619SDag-Erling Smørgrav }
10352f3ed619SDag-Erling Smørgrav 
1036*f3b0ac34SDag-Erling Smørgrav int
1037*f3b0ac34SDag-Erling Smørgrav main(int argc, char *argv[])
10382f3ed619SDag-Erling Smørgrav {
1039*f3b0ac34SDag-Erling Smørgrav 
1040*f3b0ac34SDag-Erling Smørgrav 	t_main(t_prepare, NULL, argc, argv);
10412f3ed619SDag-Erling Smørgrav }
1042