1236099Sdes/*-
2348980Sdes * Copyright (c) 2012-2017 Dag-Erling Sm��rgrav
3236099Sdes * All rights reserved.
4236099Sdes *
5236099Sdes * Redistribution and use in source and binary forms, with or without
6236099Sdes * modification, are permitted provided that the following conditions
7236099Sdes * are met:
8236099Sdes * 1. Redistributions of source code must retain the above copyright
9255376Sdes *    notice, this list of conditions and the following disclaimer.
10236099Sdes * 2. Redistributions in binary form must reproduce the above copyright
11236099Sdes *    notice, this list of conditions and the following disclaimer in the
12236099Sdes *    documentation and/or other materials provided with the distribution.
13236099Sdes * 3. The name of the author may not be used to endorse or promote
14236099Sdes *    products derived from this software without specific prior written
15236099Sdes *    permission.
16236099Sdes *
17236099Sdes * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18236099Sdes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19236099Sdes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20236099Sdes * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21236099Sdes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22236099Sdes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23236099Sdes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24236099Sdes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25236099Sdes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26236099Sdes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27236099Sdes * SUCH DAMAGE.
28236099Sdes *
29348980Sdes * $OpenPAM: t_openpam_readword.c 938 2017-04-30 21:34:42Z des $
30236099Sdes */
31236099Sdes
32236099Sdes#ifdef HAVE_CONFIG_H
33236099Sdes# include "config.h"
34236099Sdes#endif
35236099Sdes
36236099Sdes#include <err.h>
37348980Sdes#include <stdint.h>
38236099Sdes#include <stdio.h>
39236099Sdes#include <stdlib.h>
40236099Sdes#include <string.h>
41236099Sdes#include <unistd.h>
42236099Sdes
43348980Sdes#include <cryb/test.h>
44348980Sdes
45236099Sdes#include <security/pam_appl.h>
46236099Sdes#include <security/openpam.h>
47236099Sdes
48348980Sdes#define T_FUNC(n, d)							\
49348980Sdes	static const char *t_ ## n ## _desc = d;			\
50348980Sdes	static int t_ ## n ## _func(OPENPAM_UNUSED(char **desc),	\
51348980Sdes	    OPENPAM_UNUSED(void *arg))
52236099Sdes
53348980Sdes#define T(n)								\
54348980Sdes	t_add_test(&t_ ## n ## _func, NULL, "%s", t_ ## n ## _desc)
55348980Sdes
56236099Sdes/*
57236099Sdes * Read a word from the temp file and verify that the result matches our
58236099Sdes * expectations: whether a word was read at all, how many lines were read
59236099Sdes * (in case of quoted or escaped newlines), whether we reached the end of
60236099Sdes * the file and whether we reached the end of the line.
61236099Sdes */
62236099Sdesstatic int
63255376Sdesorw_expect(struct t_file *tf, const char *expected, int lines, int eof, int eol)
64236099Sdes{
65236099Sdes	int ch, lineno = 0;
66236099Sdes	char *got;
67236099Sdes	size_t len;
68348980Sdes	int ret;
69236099Sdes
70255376Sdes	got = openpam_readword(tf->file, &lineno, &len);
71348980Sdes	ret = 1;
72255376Sdes	if (t_ferror(tf))
73255376Sdes		err(1, "%s(): %s", __func__, tf->name);
74236099Sdes	if (expected != NULL && got == NULL) {
75348980Sdes		t_printv("expected <<%s>>, got nothing\n", expected);
76348980Sdes		ret = 0;
77348980Sdes	} else if (expected == NULL && got != NULL) {
78348980Sdes		t_printv("expected nothing, got <<%s>>\n", got);
79348980Sdes		ret = 0;
80348980Sdes	} else if (expected != NULL && got != NULL && strcmp(expected, got) != 0) {
81348980Sdes		t_printv("expected <<%s>>, got <<%s>>\n", expected, got);
82348980Sdes		ret = 0;
83236099Sdes	}
84348980Sdes	free(got);
85236099Sdes	if (lineno != lines) {
86348980Sdes		t_printv("expected to advance %d lines, advanced %d lines\n",
87236099Sdes		    lines, lineno);
88348980Sdes		ret = 0;
89236099Sdes	}
90255376Sdes	if (eof && !t_feof(tf)) {
91348980Sdes		t_printv("expected EOF, but didn't get it\n");
92348980Sdes		ret = 0;
93236099Sdes	}
94255376Sdes	if (!eof && t_feof(tf)) {
95348980Sdes		t_printv("didn't expect EOF, but got it anyway\n");
96348980Sdes		ret = 0;
97236099Sdes	}
98255376Sdes	ch = fgetc(tf->file);
99255376Sdes	if (t_ferror(tf))
100255376Sdes		err(1, "%s(): %s", __func__, tf->name);
101236099Sdes	if (eol && ch != '\n') {
102348980Sdes		t_printv("expected EOL, but didn't get it\n");
103348980Sdes		ret = 0;
104348980Sdes	} else if (!eol && ch == '\n') {
105348980Sdes		t_printv("didn't expect EOL, but got it anyway\n");
106348980Sdes		ret = 0;
107236099Sdes	}
108236099Sdes	if (ch != EOF)
109255376Sdes		ungetc(ch, tf->file);
110348980Sdes	return (ret);
111236099Sdes}
112236099Sdes
113236099Sdes
114236099Sdes/***************************************************************************
115236099Sdes * Lines without words
116236099Sdes */
117236099Sdes
118236099SdesT_FUNC(empty_input, "empty input")
119236099Sdes{
120255376Sdes	struct t_file *tf;
121236099Sdes	int ret;
122236099Sdes
123255376Sdes	tf = t_fopen(NULL);
124255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
125255376Sdes	t_fclose(tf);
126236099Sdes	return (ret);
127236099Sdes}
128236099Sdes
129236099SdesT_FUNC(empty_line, "empty line")
130236099Sdes{
131255376Sdes	struct t_file *tf;
132236099Sdes	int ret;
133236099Sdes
134255376Sdes	tf = t_fopen(NULL);
135255376Sdes	t_fprintf(tf, "\n");
136255376Sdes	t_frewind(tf);
137255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
138255376Sdes	t_fclose(tf);
139236099Sdes	return (ret);
140236099Sdes}
141236099Sdes
142236099SdesT_FUNC(unterminated_line, "unterminated line")
143236099Sdes{
144255376Sdes	struct t_file *tf;
145236099Sdes	int ret;
146236099Sdes
147255376Sdes	tf = t_fopen(NULL);
148255376Sdes	t_fprintf(tf, " ");
149255376Sdes	t_frewind(tf);
150255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
151255376Sdes	t_fclose(tf);
152236099Sdes	return (ret);
153236099Sdes}
154236099Sdes
155236099SdesT_FUNC(single_whitespace, "single whitespace")
156236099Sdes{
157255376Sdes	struct t_file *tf;
158236099Sdes	int ret;
159236099Sdes
160255376Sdes	tf = t_fopen(NULL);
161255376Sdes	t_fprintf(tf, " \n");
162255376Sdes	t_frewind(tf);
163255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
164255376Sdes	t_fclose(tf);
165236099Sdes	return (ret);
166236099Sdes}
167236099Sdes
168236099SdesT_FUNC(multiple_whitespace, "multiple whitespace")
169236099Sdes{
170255376Sdes	struct t_file *tf;
171236099Sdes	int ret;
172236099Sdes
173255376Sdes	tf = t_fopen(NULL);
174255376Sdes	t_fprintf(tf, " \t\r\n");
175255376Sdes	t_frewind(tf);
176255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
177255376Sdes	t_fclose(tf);
178236099Sdes	return (ret);
179236099Sdes}
180236099Sdes
181236099SdesT_FUNC(comment, "comment")
182236099Sdes{
183255376Sdes	struct t_file *tf;
184236099Sdes	int ret;
185236099Sdes
186255376Sdes	tf = t_fopen(NULL);
187255376Sdes	t_fprintf(tf, "# comment\n");
188255376Sdes	t_frewind(tf);
189255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
190255376Sdes	t_fclose(tf);
191236099Sdes	return (ret);
192236099Sdes}
193236099Sdes
194236099SdesT_FUNC(whitespace_before_comment, "whitespace before comment")
195236099Sdes{
196255376Sdes	struct t_file *tf;
197236099Sdes	int ret;
198236099Sdes
199255376Sdes	tf = t_fopen(NULL);
200255376Sdes	t_fprintf(tf, " # comment\n");
201255376Sdes	t_frewind(tf);
202255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
203255376Sdes	t_fclose(tf);
204236099Sdes	return (ret);
205236099Sdes}
206236099Sdes
207348980SdesT_FUNC(single_quoted_comment, "single-quoted comment")
208348980Sdes{
209348980Sdes	struct t_file *tf;
210348980Sdes	int ret;
211348980Sdes
212348980Sdes	tf = t_fopen(NULL);
213348980Sdes	t_fprintf(tf, " '# comment'\n");
214348980Sdes	t_frewind(tf);
215348980Sdes	ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
216348980Sdes	t_fclose(tf);
217348980Sdes	return (ret);
218348980Sdes}
219348980Sdes
220348980SdesT_FUNC(double_quoted_comment, "double-quoted comment")
221348980Sdes{
222348980Sdes	struct t_file *tf;
223348980Sdes	int ret;
224348980Sdes
225348980Sdes	tf = t_fopen(NULL);
226348980Sdes	t_fprintf(tf, " \"# comment\"\n");
227348980Sdes	t_frewind(tf);
228348980Sdes	ret = orw_expect(tf, "# comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
229348980Sdes	t_fclose(tf);
230348980Sdes	return (ret);
231348980Sdes}
232348980Sdes
233348980SdesT_FUNC(comment_at_eof, "comment at end of file")
234348980Sdes{
235348980Sdes	struct t_file *tf;
236348980Sdes	int ret;
237348980Sdes
238348980Sdes	tf = t_fopen(NULL);
239348980Sdes	t_fprintf(tf, "# comment");
240348980Sdes	t_frewind(tf);
241348980Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
242348980Sdes	t_fclose(tf);
243348980Sdes	return (ret);
244348980Sdes}
245348980Sdes
246236099Sdes
247236099Sdes/***************************************************************************
248236099Sdes * Simple cases - no quotes or escapes
249236099Sdes */
250236099Sdes
251236099SdesT_FUNC(single_word, "single word")
252236099Sdes{
253236099Sdes	const char *word = "hello";
254255376Sdes	struct t_file *tf;
255236099Sdes	int ret;
256236099Sdes
257255376Sdes	tf = t_fopen(NULL);
258255376Sdes	t_fprintf(tf, "%s\n", word);
259255376Sdes	t_frewind(tf);
260255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
261255376Sdes	t_fclose(tf);
262236099Sdes	return (ret);
263236099Sdes}
264236099Sdes
265236099SdesT_FUNC(single_whitespace_before_word, "single whitespace before word")
266236099Sdes{
267236099Sdes	const char *word = "hello";
268255376Sdes	struct t_file *tf;
269236099Sdes	int ret;
270236099Sdes
271255376Sdes	tf = t_fopen(NULL);
272255376Sdes	t_fprintf(tf, " %s\n", word);
273255376Sdes	t_frewind(tf);
274255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
275255376Sdes	t_fclose(tf);
276236099Sdes	return (ret);
277236099Sdes}
278236099Sdes
279236099SdesT_FUNC(double_whitespace_before_word, "double whitespace before word")
280236099Sdes{
281236099Sdes	const char *word = "hello";
282255376Sdes	struct t_file *tf;
283236099Sdes	int ret;
284236099Sdes
285255376Sdes	tf = t_fopen(NULL);
286255376Sdes	t_fprintf(tf, "  %s\n", word);
287255376Sdes	t_frewind(tf);
288255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
289255376Sdes	t_fclose(tf);
290236099Sdes	return (ret);
291236099Sdes}
292236099Sdes
293236099SdesT_FUNC(single_whitespace_after_word, "single whitespace after word")
294236099Sdes{
295236099Sdes	const char *word = "hello";
296255376Sdes	struct t_file *tf;
297236099Sdes	int ret;
298236099Sdes
299255376Sdes	tf = t_fopen(NULL);
300255376Sdes	t_fprintf(tf, "%s \n", word);
301255376Sdes	t_frewind(tf);
302255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/);
303255376Sdes	t_fclose(tf);
304236099Sdes	return (ret);
305236099Sdes}
306236099Sdes
307236099SdesT_FUNC(double_whitespace_after_word, "double whitespace after word")
308236099Sdes{
309236099Sdes	const char *word = "hello";
310255376Sdes	struct t_file *tf;
311236099Sdes	int ret;
312236099Sdes
313255376Sdes	tf = t_fopen(NULL);
314255376Sdes	t_fprintf(tf, "%s  \n", word);
315255376Sdes	t_frewind(tf);
316255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/);
317255376Sdes	t_fclose(tf);
318236099Sdes	return (ret);
319236099Sdes}
320236099Sdes
321236099SdesT_FUNC(comment_after_word, "comment after word")
322236099Sdes{
323236099Sdes	const char *word = "hello";
324255376Sdes	struct t_file *tf;
325236099Sdes	int ret;
326236099Sdes
327255376Sdes	tf = t_fopen(NULL);
328255376Sdes	t_fprintf(tf, "%s # comment\n", word);
329255376Sdes	t_frewind(tf);
330255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
331255376Sdes	    orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
332255376Sdes	t_fclose(tf);
333236099Sdes	return (ret);
334236099Sdes}
335236099Sdes
336236099SdesT_FUNC(word_containing_hash, "word containing hash")
337236099Sdes{
338236099Sdes	const char *word = "hello#world";
339255376Sdes	struct t_file *tf;
340236099Sdes	int ret;
341236099Sdes
342255376Sdes	tf = t_fopen(NULL);
343255376Sdes	t_fprintf(tf, "%s\n", word);
344255376Sdes	t_frewind(tf);
345255376Sdes	ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
346255376Sdes	t_fclose(tf);
347236099Sdes	return (ret);
348236099Sdes}
349236099Sdes
350236099SdesT_FUNC(two_words, "two words")
351236099Sdes{
352236099Sdes	const char *word[] = { "hello", "world" };
353255376Sdes	struct t_file *tf;
354236099Sdes	int ret;
355236099Sdes
356255376Sdes	tf = t_fopen(NULL);
357255376Sdes	t_fprintf(tf, "%s %s\n", word[0], word[1]);
358255376Sdes	t_frewind(tf);
359255376Sdes	ret = orw_expect(tf, word[0], 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
360255376Sdes	    orw_expect(tf, word[1], 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
361255376Sdes	t_fclose(tf);
362236099Sdes	return (ret);
363236099Sdes}
364236099Sdes
365236099Sdes
366236099Sdes/***************************************************************************
367236099Sdes * Escapes
368236099Sdes */
369236099Sdes
370236099SdesT_FUNC(naked_escape, "naked escape")
371236099Sdes{
372255376Sdes	struct t_file *tf;
373236099Sdes	int ret;
374236099Sdes
375255376Sdes	tf = t_fopen(NULL);
376255376Sdes	t_fprintf(tf, "\\");
377255376Sdes	t_frewind(tf);
378255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
379255376Sdes	t_fclose(tf);
380236099Sdes	return (ret);
381236099Sdes}
382236099Sdes
383236099SdesT_FUNC(escaped_escape, "escaped escape")
384236099Sdes{
385255376Sdes	struct t_file *tf;
386236099Sdes	int ret;
387236099Sdes
388255376Sdes	tf = t_fopen(NULL);
389255376Sdes	t_fprintf(tf, "\\\\\n");
390255376Sdes	t_frewind(tf);
391255376Sdes	ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
392255376Sdes	t_fclose(tf);
393236099Sdes	return (ret);
394236099Sdes}
395236099Sdes
396236099SdesT_FUNC(escaped_whitespace, "escaped whitespace")
397236099Sdes{
398255376Sdes	struct t_file *tf;
399236099Sdes	int ret;
400236099Sdes
401255376Sdes	tf = t_fopen(NULL);
402255376Sdes	t_fprintf(tf, "\\  \\\t \\\r \\\n\n");
403255376Sdes	t_frewind(tf);
404255376Sdes	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
405255376Sdes	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
406255376Sdes	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
407236099Sdes	    /* this last one is a line continuation */
408255376Sdes	    orw_expect(tf, NULL, 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
409255376Sdes	t_fclose(tf);
410236099Sdes	return (ret);
411236099Sdes}
412236099Sdes
413236099SdesT_FUNC(escaped_newline_before_word, "escaped newline before word")
414236099Sdes{
415255376Sdes	struct t_file *tf;
416236099Sdes	int ret;
417236099Sdes
418255376Sdes	tf = t_fopen(NULL);
419255376Sdes	t_fprintf(tf, "\\\nhello world\n");
420255376Sdes	t_frewind(tf);
421255376Sdes	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/);
422255376Sdes	t_fclose(tf);
423236099Sdes	return (ret);
424236099Sdes}
425236099Sdes
426236099SdesT_FUNC(escaped_newline_within_word, "escaped newline within word")
427236099Sdes{
428255376Sdes	struct t_file *tf;
429236099Sdes	int ret;
430236099Sdes
431255376Sdes	tf = t_fopen(NULL);
432255376Sdes	t_fprintf(tf, "hello\\\nworld\n");
433255376Sdes	t_frewind(tf);
434255376Sdes	ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
435255376Sdes	t_fclose(tf);
436236099Sdes	return (ret);
437236099Sdes}
438236099Sdes
439236099SdesT_FUNC(escaped_newline_after_word, "escaped newline after word")
440236099Sdes{
441255376Sdes	struct t_file *tf;
442236099Sdes	int ret;
443236099Sdes
444255376Sdes	tf = t_fopen(NULL);
445255376Sdes	t_fprintf(tf, "hello\\\n world\n");
446255376Sdes	t_frewind(tf);
447255376Sdes	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/);
448255376Sdes	t_fclose(tf);
449236099Sdes	return (ret);
450236099Sdes}
451236099Sdes
452236099SdesT_FUNC(escaped_letter, "escaped letter")
453236099Sdes{
454255376Sdes	struct t_file *tf;
455236099Sdes	int ret;
456236099Sdes
457255376Sdes	tf = t_fopen(NULL);
458255376Sdes	t_fprintf(tf, "\\z\n");
459255376Sdes	t_frewind(tf);
460255376Sdes	ret = orw_expect(tf, "z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
461255376Sdes	t_fclose(tf);
462236099Sdes	return (ret);
463236099Sdes}
464236099Sdes
465348980SdesT_FUNC(escaped_comment, "escaped comment")
466348980Sdes{
467348980Sdes	struct t_file *tf;
468348980Sdes	int ret;
469348980Sdes
470348980Sdes	tf = t_fopen(NULL);
471348980Sdes	t_fprintf(tf, " \\# comment\n");
472348980Sdes	t_frewind(tf);
473348980Sdes	ret = orw_expect(tf, "#", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
474348980Sdes	    orw_expect(tf, "comment", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
475348980Sdes	t_fclose(tf);
476348980Sdes	return (ret);
477348980Sdes}
478348980Sdes
479348980SdesT_FUNC(escape_at_eof, "escape at end of file")
480348980Sdes{
481348980Sdes	struct t_file *tf;
482348980Sdes	int ret;
483348980Sdes
484348980Sdes	tf = t_fopen(NULL);
485348980Sdes	t_fprintf(tf, "z\\");
486348980Sdes	t_frewind(tf);
487348980Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
488348980Sdes	t_fclose(tf);
489348980Sdes	return (ret);
490348980Sdes}
491348980Sdes
492236099Sdes
493236099Sdes/***************************************************************************
494236099Sdes * Quotes
495236099Sdes */
496236099Sdes
497236099SdesT_FUNC(naked_single_quote, "naked single quote")
498236099Sdes{
499255376Sdes	struct t_file *tf;
500236099Sdes	int ret;
501236099Sdes
502255376Sdes	tf = t_fopen(NULL);
503255376Sdes	t_fprintf(tf, "'");
504255376Sdes	t_frewind(tf);
505255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
506255376Sdes	t_fclose(tf);
507236099Sdes	return (ret);
508236099Sdes}
509236099Sdes
510236099SdesT_FUNC(naked_double_quote, "naked double quote")
511236099Sdes{
512255376Sdes	struct t_file *tf;
513236099Sdes	int ret;
514236099Sdes
515255376Sdes	tf = t_fopen(NULL);
516255376Sdes	t_fprintf(tf, "\"");
517255376Sdes	t_frewind(tf);
518255376Sdes	ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/);
519255376Sdes	t_fclose(tf);
520236099Sdes	return (ret);
521236099Sdes}
522236099Sdes
523236099SdesT_FUNC(empty_single_quotes, "empty single quotes")
524236099Sdes{
525255376Sdes	struct t_file *tf;
526236099Sdes	int ret;
527236099Sdes
528255376Sdes	tf = t_fopen(NULL);
529255376Sdes	t_fprintf(tf, "''\n");
530255376Sdes	t_frewind(tf);
531255376Sdes	ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
532255376Sdes	t_fclose(tf);
533236099Sdes	return (ret);
534236099Sdes}
535236099Sdes
536236099SdesT_FUNC(empty_double_quotes, "empty double quotes")
537236099Sdes{
538255376Sdes	struct t_file *tf;
539236099Sdes	int ret;
540236099Sdes
541255376Sdes	tf = t_fopen(NULL);
542255376Sdes	t_fprintf(tf, "\"\"\n");
543255376Sdes	t_frewind(tf);
544255376Sdes	ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
545255376Sdes	t_fclose(tf);
546236099Sdes	return (ret);
547236099Sdes}
548236099Sdes
549236099SdesT_FUNC(single_quotes_within_double_quotes, "single quotes within double quotes")
550236099Sdes{
551255376Sdes	struct t_file *tf;
552236099Sdes	int ret;
553236099Sdes
554255376Sdes	tf = t_fopen(NULL);
555255376Sdes	t_fprintf(tf, "\"' '\"\n");
556255376Sdes	t_frewind(tf);
557255376Sdes	ret = orw_expect(tf, "' '", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
558255376Sdes	t_fclose(tf);
559236099Sdes	return (ret);
560236099Sdes}
561236099Sdes
562236099SdesT_FUNC(double_quotes_within_single_quotes, "double quotes within single quotes")
563236099Sdes{
564255376Sdes	struct t_file *tf;
565236099Sdes	int ret;
566236099Sdes
567255376Sdes	tf = t_fopen(NULL);
568255376Sdes	t_fprintf(tf, "'\" \"'\n");
569255376Sdes	t_frewind(tf);
570255376Sdes	ret = orw_expect(tf, "\" \"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
571255376Sdes	t_fclose(tf);
572236099Sdes	return (ret);
573236099Sdes}
574236099Sdes
575236099SdesT_FUNC(single_quoted_whitespace, "single-quoted whitespace")
576236099Sdes{
577255376Sdes	struct t_file *tf;
578236099Sdes	int ret;
579236099Sdes
580255376Sdes	tf = t_fopen(NULL);
581255376Sdes	t_fprintf(tf, "' ' '\t' '\r' '\n'\n");
582255376Sdes	t_frewind(tf);
583255376Sdes	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
584255376Sdes	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
585255376Sdes	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
586255376Sdes	    orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
587255376Sdes	t_fclose(tf);
588236099Sdes	return (ret);
589236099Sdes}
590236099Sdes
591236099SdesT_FUNC(double_quoted_whitespace, "double-quoted whitespace")
592236099Sdes{
593255376Sdes	struct t_file *tf;
594236099Sdes	int ret;
595236099Sdes
596255376Sdes	tf = t_fopen(NULL);
597255376Sdes	t_fprintf(tf, "\" \" \"\t\" \"\r\" \"\n\"\n");
598255376Sdes	t_frewind(tf);
599255376Sdes	ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
600255376Sdes	    orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
601255376Sdes	    orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
602255376Sdes	    orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
603255376Sdes	t_fclose(tf);
604236099Sdes	return (ret);
605236099Sdes}
606236099Sdes
607236099SdesT_FUNC(single_quoted_words, "single-quoted words")
608236099Sdes{
609255376Sdes	struct t_file *tf;
610236099Sdes	int ret;
611236099Sdes
612255376Sdes	tf = t_fopen(NULL);
613255376Sdes	t_fprintf(tf, "'hello world'\n");
614255376Sdes	t_frewind(tf);
615255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
616255376Sdes	t_fclose(tf);
617236099Sdes	return (ret);
618236099Sdes}
619236099Sdes
620236099SdesT_FUNC(double_quoted_words, "double-quoted words")
621236099Sdes{
622255376Sdes	struct t_file *tf;
623236099Sdes	int ret;
624236099Sdes
625255376Sdes	tf = t_fopen(NULL);
626255376Sdes	t_fprintf(tf, "\"hello world\"\n");
627255376Sdes	t_frewind(tf);
628255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
629255376Sdes	t_fclose(tf);
630236099Sdes	return (ret);
631236099Sdes}
632236099Sdes
633236099Sdes
634236099Sdes/***************************************************************************
635255376Sdes * Combinations of quoted and unquoted text
636255376Sdes */
637255376Sdes
638255376SdesT_FUNC(single_quote_before_word, "single quote before word")
639255376Sdes{
640255376Sdes	struct t_file *tf;
641255376Sdes	int ret;
642255376Sdes
643255376Sdes	tf = t_fopen(NULL);
644255376Sdes	t_fprintf(tf, "'hello 'world\n");
645255376Sdes	t_frewind(tf);
646255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
647255376Sdes	t_fclose(tf);
648255376Sdes	return (ret);
649255376Sdes}
650255376Sdes
651255376SdesT_FUNC(double_quote_before_word, "double quote before word")
652255376Sdes{
653255376Sdes	struct t_file *tf;
654255376Sdes	int ret;
655255376Sdes
656255376Sdes	tf = t_fopen(NULL);
657255376Sdes	t_fprintf(tf, "\"hello \"world\n");
658255376Sdes	t_frewind(tf);
659255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
660255376Sdes	t_fclose(tf);
661255376Sdes	return (ret);
662255376Sdes}
663255376Sdes
664255376SdesT_FUNC(single_quote_within_word, "single quote within word")
665255376Sdes{
666255376Sdes	struct t_file *tf;
667255376Sdes	int ret;
668255376Sdes
669255376Sdes	tf = t_fopen(NULL);
670255376Sdes	t_fprintf(tf, "hello' 'world\n");
671255376Sdes	t_frewind(tf);
672255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
673255376Sdes	t_fclose(tf);
674255376Sdes	return (ret);
675255376Sdes}
676255376Sdes
677255376SdesT_FUNC(double_quote_within_word, "double quote within word")
678255376Sdes{
679255376Sdes	struct t_file *tf;
680255376Sdes	int ret;
681255376Sdes
682255376Sdes	tf = t_fopen(NULL);
683255376Sdes	t_fprintf(tf, "hello\" \"world\n");
684255376Sdes	t_frewind(tf);
685255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
686255376Sdes	t_fclose(tf);
687255376Sdes	return (ret);
688255376Sdes}
689255376Sdes
690255376SdesT_FUNC(single_quote_after_word, "single quote after word")
691255376Sdes{
692255376Sdes	struct t_file *tf;
693255376Sdes	int ret;
694255376Sdes
695255376Sdes	tf = t_fopen(NULL);
696255376Sdes	t_fprintf(tf, "hello' world'\n");
697255376Sdes	t_frewind(tf);
698255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
699255376Sdes	t_fclose(tf);
700255376Sdes	return (ret);
701255376Sdes}
702255376Sdes
703255376SdesT_FUNC(double_quote_after_word, "double quote after word")
704255376Sdes{
705255376Sdes	struct t_file *tf;
706255376Sdes	int ret;
707255376Sdes
708255376Sdes	tf = t_fopen(NULL);
709255376Sdes	t_fprintf(tf, "hello\" world\"\n");
710255376Sdes	t_frewind(tf);
711255376Sdes	ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
712255376Sdes	t_fclose(tf);
713255376Sdes	return (ret);
714255376Sdes}
715255376Sdes
716255376Sdes
717255376Sdes/***************************************************************************
718236099Sdes * Combinations of escape and quotes
719236099Sdes */
720236099Sdes
721236099SdesT_FUNC(escaped_single_quote,
722236099Sdes    "escaped single quote")
723236099Sdes{
724255376Sdes	struct t_file *tf;
725236099Sdes	int ret;
726236099Sdes
727255376Sdes	tf = t_fopen(NULL);
728255376Sdes	t_fprintf(tf, "\\'\n");
729255376Sdes	t_frewind(tf);
730255376Sdes	ret = orw_expect(tf, "'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
731255376Sdes	t_fclose(tf);
732236099Sdes	return (ret);
733236099Sdes}
734236099Sdes
735236099SdesT_FUNC(escaped_double_quote,
736236099Sdes    "escaped double quote")
737236099Sdes{
738255376Sdes	struct t_file *tf;
739236099Sdes	int ret;
740236099Sdes
741255376Sdes	tf = t_fopen(NULL);
742255376Sdes	t_fprintf(tf, "\\\"\n");
743255376Sdes	t_frewind(tf);
744255376Sdes	ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
745255376Sdes	t_fclose(tf);
746236099Sdes	return (ret);
747236099Sdes}
748236099Sdes
749236099SdesT_FUNC(escaped_whitespace_within_single_quotes,
750236099Sdes    "escaped whitespace within single quotes")
751236099Sdes{
752255376Sdes	struct t_file *tf;
753236099Sdes	int ret;
754236099Sdes
755255376Sdes	tf = t_fopen(NULL);
756255376Sdes	t_fprintf(tf, "'\\ ' '\\\t' '\\\r' '\\\n'\n");
757255376Sdes	t_frewind(tf);
758255376Sdes	ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
759255376Sdes	    orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
760255376Sdes	    orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
761255376Sdes	    orw_expect(tf, "\\\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
762255376Sdes	t_fclose(tf);
763236099Sdes	return (ret);
764236099Sdes}
765236099Sdes
766236099SdesT_FUNC(escaped_whitespace_within_double_quotes,
767236099Sdes    "escaped whitespace within double quotes")
768236099Sdes{
769255376Sdes	struct t_file *tf;
770236099Sdes	int ret;
771236099Sdes
772255376Sdes	tf = t_fopen(NULL);
773255376Sdes	t_fprintf(tf, "\"\\ \" \"\\\t\" \"\\\r\" \"\\\n\"\n");
774255376Sdes	t_frewind(tf);
775255376Sdes	ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
776255376Sdes	    orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
777255376Sdes	    orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
778236099Sdes	    /* this last one is a line continuation */
779255376Sdes	    orw_expect(tf, "", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
780255376Sdes	t_fclose(tf);
781236099Sdes	return (ret);
782236099Sdes}
783236099Sdes
784236099SdesT_FUNC(escaped_letter_within_single_quotes,
785236099Sdes    "escaped letter within single quotes")
786236099Sdes{
787255376Sdes	struct t_file *tf;
788236099Sdes	int ret;
789236099Sdes
790255376Sdes	tf = t_fopen(NULL);
791255376Sdes	t_fprintf(tf, "'\\z'\n");
792255376Sdes	t_frewind(tf);
793255376Sdes	ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
794255376Sdes	t_fclose(tf);
795236099Sdes	return (ret);
796236099Sdes}
797236099Sdes
798236099SdesT_FUNC(escaped_letter_within_double_quotes,
799236099Sdes    "escaped letter within double quotes")
800236099Sdes{
801255376Sdes	struct t_file *tf;
802236099Sdes	int ret;
803236099Sdes
804255376Sdes	tf = t_fopen(NULL);
805255376Sdes	t_fprintf(tf, "\"\\z\"\n");
806255376Sdes	t_frewind(tf);
807255376Sdes	ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
808255376Sdes	t_fclose(tf);
809236099Sdes	return (ret);
810236099Sdes}
811236099Sdes
812236099SdesT_FUNC(escaped_escape_within_single_quotes,
813236099Sdes    "escaped escape within single quotes")
814236099Sdes{
815255376Sdes	struct t_file *tf;
816236099Sdes	int ret;
817236099Sdes
818255376Sdes	tf = t_fopen(NULL);
819255376Sdes	t_fprintf(tf, "'\\\\'\n");
820255376Sdes	t_frewind(tf);
821255376Sdes	ret = orw_expect(tf, "\\\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
822255376Sdes	t_fclose(tf);
823236099Sdes	return (ret);
824236099Sdes}
825236099Sdes
826236099SdesT_FUNC(escaped_escape_within_double_quotes,
827236099Sdes    "escaped escape within double quotes")
828236099Sdes{
829255376Sdes	struct t_file *tf;
830236099Sdes	int ret;
831236099Sdes
832255376Sdes	tf = t_fopen(NULL);
833255376Sdes	t_fprintf(tf, "\"\\\\\"\n");
834255376Sdes	t_frewind(tf);
835255376Sdes	ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
836255376Sdes	t_fclose(tf);
837236099Sdes	return (ret);
838236099Sdes}
839236099Sdes
840236099SdesT_FUNC(escaped_single_quote_within_single_quotes,
841236099Sdes    "escaped single quote within single quotes")
842236099Sdes{
843255376Sdes	struct t_file *tf;
844236099Sdes	int ret;
845236099Sdes
846255376Sdes	tf = t_fopen(NULL);
847255376Sdes	t_fprintf(tf, "'\\''\n");
848255376Sdes	t_frewind(tf);
849255376Sdes	ret = orw_expect(tf, NULL, 1 /*lines*/, 1 /*eof*/, 0 /*eol*/);
850255376Sdes	t_fclose(tf);
851236099Sdes	return (ret);
852236099Sdes}
853236099Sdes
854236099SdesT_FUNC(escaped_double_quote_within_single_quotes,
855236099Sdes    "escaped double quote within single quotes")
856236099Sdes{
857255376Sdes	struct t_file *tf;
858236099Sdes	int ret;
859236099Sdes
860255376Sdes	tf = t_fopen(NULL);
861255376Sdes	t_fprintf(tf, "'\\\"'\n");
862255376Sdes	t_frewind(tf);
863255376Sdes	ret = orw_expect(tf, "\\\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
864255376Sdes	t_fclose(tf);
865236099Sdes	return (ret);
866236099Sdes}
867236099Sdes
868236099SdesT_FUNC(escaped_single_quote_within_double_quotes,
869236099Sdes    "escaped single quote within double quotes")
870236099Sdes{
871255376Sdes	struct t_file *tf;
872236099Sdes	int ret;
873236099Sdes
874255376Sdes	tf = t_fopen(NULL);
875255376Sdes	t_fprintf(tf, "\"\\'\"\n");
876255376Sdes	t_frewind(tf);
877255376Sdes	ret = orw_expect(tf, "\\'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
878255376Sdes	t_fclose(tf);
879236099Sdes	return (ret);
880236099Sdes}
881236099Sdes
882236099SdesT_FUNC(escaped_double_quote_within_double_quotes,
883236099Sdes    "escaped double quote within double quotes")
884236099Sdes{
885255376Sdes	struct t_file *tf;
886236099Sdes	int ret;
887236099Sdes
888255376Sdes	tf = t_fopen(NULL);
889255376Sdes	t_fprintf(tf, "\"\\\"\"\n");
890255376Sdes	t_frewind(tf);
891255376Sdes	ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
892255376Sdes	t_fclose(tf);
893236099Sdes	return (ret);
894236099Sdes}
895236099Sdes
896236099Sdes
897236099Sdes/***************************************************************************
898348980Sdes * Line continuation
899236099Sdes */
900236099Sdes
901348980SdesT_FUNC(line_continuation_within_whitespace, "line continuation within whitespace")
902348980Sdes{
903348980Sdes	struct t_file *tf;
904348980Sdes	int ret;
905236099Sdes
906348980Sdes	tf = t_fopen(NULL);
907348980Sdes	t_fprintf(tf, "hello \\\n world\n");
908348980Sdes	t_frewind(tf);
909348980Sdes	ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
910348980Sdes	    orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
911348980Sdes	t_fclose(tf);
912348980Sdes	return (ret);
913348980Sdes}
914236099Sdes
915348980SdesT_FUNC(line_continuation_before_whitespace, "line continuation before whitespace")
916348980Sdes{
917348980Sdes	struct t_file *tf;
918348980Sdes	int ret;
919236099Sdes
920348980Sdes	tf = t_fopen(NULL);
921348980Sdes	t_fprintf(tf, "hello\\\n world\n");
922348980Sdes	t_frewind(tf);
923348980Sdes	ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
924348980Sdes	    orw_expect(tf, "world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/);
925348980Sdes	t_fclose(tf);
926348980Sdes	return (ret);
927348980Sdes}
928236099Sdes
929348980SdesT_FUNC(line_continuation_after_whitespace, "line continuation after whitespace")
930348980Sdes{
931348980Sdes	struct t_file *tf;
932348980Sdes	int ret;
933255376Sdes
934348980Sdes	tf = t_fopen(NULL);
935348980Sdes	t_fprintf(tf, "hello \\\nworld\n");
936348980Sdes	t_frewind(tf);
937348980Sdes	ret = orw_expect(tf, "hello", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) &&
938348980Sdes	    orw_expect(tf, "world", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
939348980Sdes	t_fclose(tf);
940348980Sdes	return (ret);
941348980Sdes}
942236099Sdes
943348980SdesT_FUNC(line_continuation_within_word, "line continuation within word")
944348980Sdes{
945348980Sdes	struct t_file *tf;
946348980Sdes	int ret;
947236099Sdes
948348980Sdes	tf = t_fopen(NULL);
949348980Sdes	t_fprintf(tf, "hello\\\nworld\n");
950348980Sdes	t_frewind(tf);
951348980Sdes	ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/);
952348980Sdes	t_fclose(tf);
953348980Sdes	return (ret);
954348980Sdes}
955348980Sdes
956348980Sdes
957348980Sdes/***************************************************************************
958348980Sdes * Boilerplate
959348980Sdes */
960348980Sdes
961348980Sdesstatic int
962236099Sdest_prepare(int argc, char *argv[])
963236099Sdes{
964236099Sdes
965236099Sdes	(void)argc;
966236099Sdes	(void)argv;
967348980Sdes
968348980Sdes	T(empty_input);
969348980Sdes	T(empty_line);
970348980Sdes	T(unterminated_line);
971348980Sdes	T(single_whitespace);
972348980Sdes	T(multiple_whitespace);
973348980Sdes	T(comment);
974348980Sdes	T(whitespace_before_comment);
975348980Sdes	T(single_quoted_comment);
976348980Sdes	T(double_quoted_comment);
977348980Sdes	T(comment_at_eof);
978348980Sdes
979348980Sdes	T(single_word);
980348980Sdes	T(single_whitespace_before_word);
981348980Sdes	T(double_whitespace_before_word);
982348980Sdes	T(single_whitespace_after_word);
983348980Sdes	T(double_whitespace_after_word);
984348980Sdes	T(comment_after_word);
985348980Sdes	T(word_containing_hash);
986348980Sdes	T(two_words);
987348980Sdes
988348980Sdes	T(naked_escape);
989348980Sdes	T(escaped_escape);
990348980Sdes	T(escaped_whitespace);
991348980Sdes	T(escaped_newline_before_word);
992348980Sdes	T(escaped_newline_within_word);
993348980Sdes	T(escaped_newline_after_word);
994348980Sdes	T(escaped_letter);
995348980Sdes	T(escaped_comment);
996348980Sdes	T(escape_at_eof);
997348980Sdes
998348980Sdes	T(naked_single_quote);
999348980Sdes	T(naked_double_quote);
1000348980Sdes	T(empty_single_quotes);
1001348980Sdes	T(empty_double_quotes);
1002348980Sdes	T(single_quotes_within_double_quotes);
1003348980Sdes	T(double_quotes_within_single_quotes);
1004348980Sdes	T(single_quoted_whitespace);
1005348980Sdes	T(double_quoted_whitespace);
1006348980Sdes	T(single_quoted_words);
1007348980Sdes	T(double_quoted_words);
1008348980Sdes
1009348980Sdes	T(single_quote_before_word);
1010348980Sdes	T(double_quote_before_word);
1011348980Sdes	T(single_quote_within_word);
1012348980Sdes	T(double_quote_within_word);
1013348980Sdes	T(single_quote_after_word);
1014348980Sdes	T(double_quote_after_word);
1015348980Sdes
1016348980Sdes	T(escaped_single_quote);
1017348980Sdes	T(escaped_double_quote);
1018348980Sdes	T(escaped_whitespace_within_single_quotes);
1019348980Sdes	T(escaped_whitespace_within_double_quotes);
1020348980Sdes	T(escaped_letter_within_single_quotes);
1021348980Sdes	T(escaped_letter_within_double_quotes);
1022348980Sdes	T(escaped_escape_within_single_quotes);
1023348980Sdes	T(escaped_escape_within_double_quotes);
1024348980Sdes	T(escaped_single_quote_within_single_quotes);
1025348980Sdes	T(escaped_double_quote_within_single_quotes);
1026348980Sdes	T(escaped_single_quote_within_double_quotes);
1027348980Sdes	T(escaped_double_quote_within_double_quotes);
1028348980Sdes
1029348980Sdes	T(line_continuation_within_whitespace);
1030348980Sdes	T(line_continuation_before_whitespace);
1031348980Sdes	T(line_continuation_after_whitespace);
1032348980Sdes	T(line_continuation_within_word);
1033348980Sdes
1034348980Sdes	return (0);
1035236099Sdes}
1036236099Sdes
1037348980Sdesint
1038348980Sdesmain(int argc, char *argv[])
1039236099Sdes{
1040348980Sdes
1041348980Sdes	t_main(t_prepare, NULL, argc, argv);
1042236099Sdes}
1043