12f3ed619SDag-Erling Smørgrav /*-
2*49e56509SDag-Erling Smørgrav * Copyright (c) 2012-2017 Dag-Erling Smørgrav
32f3ed619SDag-Erling Smørgrav * All rights reserved.
42f3ed619SDag-Erling Smørgrav *
52f3ed619SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without
62f3ed619SDag-Erling Smørgrav * modification, are permitted provided that the following conditions
72f3ed619SDag-Erling Smørgrav * are met:
82f3ed619SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright
9ce77a8d6SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer.
102f3ed619SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright
112f3ed619SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the
122f3ed619SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution.
132f3ed619SDag-Erling Smørgrav * 3. The name of the author may not be used to endorse or promote
142f3ed619SDag-Erling Smørgrav * products derived from this software without specific prior written
152f3ed619SDag-Erling Smørgrav * permission.
162f3ed619SDag-Erling Smørgrav *
172f3ed619SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
182f3ed619SDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
192f3ed619SDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
202f3ed619SDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
212f3ed619SDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
222f3ed619SDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
232f3ed619SDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
242f3ed619SDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
252f3ed619SDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
262f3ed619SDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
272f3ed619SDag-Erling Smørgrav * SUCH DAMAGE.
282f3ed619SDag-Erling Smørgrav */
292f3ed619SDag-Erling Smørgrav
302f3ed619SDag-Erling Smørgrav #ifdef HAVE_CONFIG_H
312f3ed619SDag-Erling Smørgrav # include "config.h"
322f3ed619SDag-Erling Smørgrav #endif
332f3ed619SDag-Erling Smørgrav
342f3ed619SDag-Erling Smørgrav #include <err.h>
35f3b0ac34SDag-Erling Smørgrav #include <stdint.h>
362f3ed619SDag-Erling Smørgrav #include <stdio.h>
372f3ed619SDag-Erling Smørgrav #include <stdlib.h>
382f3ed619SDag-Erling Smørgrav #include <string.h>
392f3ed619SDag-Erling Smørgrav
40f3b0ac34SDag-Erling Smørgrav #include <cryb/test.h>
41f3b0ac34SDag-Erling Smørgrav
422f3ed619SDag-Erling Smørgrav #include <security/pam_appl.h>
432f3ed619SDag-Erling Smørgrav #include <security/openpam.h>
442f3ed619SDag-Erling Smørgrav
452f3ed619SDag-Erling Smørgrav #include "openpam_impl.h"
46f3b0ac34SDag-Erling Smørgrav
47f3b0ac34SDag-Erling Smørgrav #define T_FUNC(n, d) \
48f3b0ac34SDag-Erling Smørgrav static const char *t_ ## n ## _desc = d; \
49f3b0ac34SDag-Erling Smørgrav static int t_ ## n ## _func(OPENPAM_UNUSED(char **desc), \
50f3b0ac34SDag-Erling Smørgrav OPENPAM_UNUSED(void *arg))
51f3b0ac34SDag-Erling Smørgrav
52f3b0ac34SDag-Erling Smørgrav #define T(n) \
53*49e56509SDag-Erling Smørgrav t_add_test(&t_ ## n ## _func, NULL, "%s", t_ ## n ## _desc)
542f3ed619SDag-Erling Smørgrav
552f3ed619SDag-Erling Smørgrav /*
562f3ed619SDag-Erling Smørgrav * Read a line from the temp file and verify that the result matches our
572f3ed619SDag-Erling Smørgrav * expectations: whether a line was read at all, how many and which words
582f3ed619SDag-Erling Smørgrav * it contained, how many lines were read (in case of quoted or escaped
592f3ed619SDag-Erling Smørgrav * newlines) and whether we reached the end of the file.
602f3ed619SDag-Erling Smørgrav */
612f3ed619SDag-Erling Smørgrav static int
orlv_expect(struct t_file * tf,const char ** expectedv,int lines,int eof)62ce77a8d6SDag-Erling Smørgrav orlv_expect(struct t_file *tf, const char **expectedv, int lines, int eof)
632f3ed619SDag-Erling Smørgrav {
642f3ed619SDag-Erling Smørgrav int expectedc, gotc, i, lineno = 0;
652f3ed619SDag-Erling Smørgrav char **gotv;
66f3b0ac34SDag-Erling Smørgrav int ret;
672f3ed619SDag-Erling Smørgrav
68f3b0ac34SDag-Erling Smørgrav ret = 1;
692f3ed619SDag-Erling Smørgrav expectedc = 0;
702f3ed619SDag-Erling Smørgrav if (expectedv != NULL)
712f3ed619SDag-Erling Smørgrav while (expectedv[expectedc] != NULL)
722f3ed619SDag-Erling Smørgrav ++expectedc;
73ce77a8d6SDag-Erling Smørgrav gotv = openpam_readlinev(tf->file, &lineno, &gotc);
74ce77a8d6SDag-Erling Smørgrav if (t_ferror(tf))
75ce77a8d6SDag-Erling Smørgrav err(1, "%s(): %s", __func__, tf->name);
762f3ed619SDag-Erling Smørgrav if (expectedv != NULL && gotv == NULL) {
77*49e56509SDag-Erling Smørgrav t_printv("expected %d words, got nothing\n", expectedc);
78f3b0ac34SDag-Erling Smørgrav ret = 0;
79f3b0ac34SDag-Erling Smørgrav } else if (expectedv == NULL && gotv != NULL) {
80*49e56509SDag-Erling Smørgrav t_printv("expected nothing, got %d words\n", gotc);
81f3b0ac34SDag-Erling Smørgrav ret = 0;
82f3b0ac34SDag-Erling Smørgrav } else if (expectedv != NULL && gotv != NULL) {
832f3ed619SDag-Erling Smørgrav if (expectedc != gotc) {
84*49e56509SDag-Erling Smørgrav t_printv("expected %d words, got %d\n",
852f3ed619SDag-Erling Smørgrav expectedc, gotc);
86f3b0ac34SDag-Erling Smørgrav ret = 0;
872f3ed619SDag-Erling Smørgrav }
882f3ed619SDag-Erling Smørgrav for (i = 0; i < gotc; ++i) {
892f3ed619SDag-Erling Smørgrav if (strcmp(expectedv[i], gotv[i]) != 0) {
90*49e56509SDag-Erling Smørgrav t_printv("word %d: expected <<%s>>, "
912f3ed619SDag-Erling Smørgrav "got <<%s>>\n", i, expectedv[i], gotv[i]);
92f3b0ac34SDag-Erling Smørgrav ret = 0;
93f3b0ac34SDag-Erling Smørgrav }
942f3ed619SDag-Erling Smørgrav }
952f3ed619SDag-Erling Smørgrav }
962f3ed619SDag-Erling Smørgrav FREEV(gotc, gotv);
972f3ed619SDag-Erling Smørgrav if (lineno != lines) {
98*49e56509SDag-Erling Smørgrav t_printv("expected to advance %d lines, advanced %d lines\n",
992f3ed619SDag-Erling Smørgrav lines, lineno);
100f3b0ac34SDag-Erling Smørgrav ret = 0;
1012f3ed619SDag-Erling Smørgrav }
102ce77a8d6SDag-Erling Smørgrav if (eof && !t_feof(tf)) {
103*49e56509SDag-Erling Smørgrav t_printv("expected EOF, but didn't get it\n");
104f3b0ac34SDag-Erling Smørgrav ret = 0;
105f3b0ac34SDag-Erling Smørgrav } else if (!eof && t_feof(tf)) {
106*49e56509SDag-Erling Smørgrav t_printv("didn't expect EOF, but got it anyway\n");
107f3b0ac34SDag-Erling Smørgrav ret = 0;
1082f3ed619SDag-Erling Smørgrav }
109f3b0ac34SDag-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 * Commonly-used lines
1152f3ed619SDag-Erling Smørgrav */
1162f3ed619SDag-Erling Smørgrav
1172f3ed619SDag-Erling Smørgrav static const char *empty[] = {
1182f3ed619SDag-Erling Smørgrav NULL
1192f3ed619SDag-Erling Smørgrav };
1202f3ed619SDag-Erling Smørgrav
1212f3ed619SDag-Erling Smørgrav static const char *hello[] = {
1222f3ed619SDag-Erling Smørgrav "hello",
1232f3ed619SDag-Erling Smørgrav NULL
1242f3ed619SDag-Erling Smørgrav };
1252f3ed619SDag-Erling Smørgrav
1262f3ed619SDag-Erling Smørgrav static const char *hello_world[] = {
1272f3ed619SDag-Erling Smørgrav "hello",
1282f3ed619SDag-Erling Smørgrav "world",
1292f3ed619SDag-Erling Smørgrav NULL
1302f3ed619SDag-Erling Smørgrav };
1312f3ed619SDag-Erling Smørgrav
132f3b0ac34SDag-Erling Smørgrav static const char *numbers[] = {
133f3b0ac34SDag-Erling Smørgrav "zero", "one", "two", "three", "four", "five", "six", "seven",
134f3b0ac34SDag-Erling Smørgrav "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
135f3b0ac34SDag-Erling Smørgrav "fifteen", "sixteen", "seventeen", "nineteen", "twenty",
136f3b0ac34SDag-Erling Smørgrav "twenty-one", "twenty-two", "twenty-three", "twenty-four",
137f3b0ac34SDag-Erling Smørgrav "twenty-five", "twenty-six", "twenty-seven", "twenty-eight",
138f3b0ac34SDag-Erling Smørgrav "twenty-nine", "thirty", "thirty-one", "thirty-two", "thirty-three",
139f3b0ac34SDag-Erling Smørgrav "thirty-four", "thirty-five", "thirty-six", "thirty-seven",
140f3b0ac34SDag-Erling Smørgrav "thirty-eight", "thirty-nine", "fourty", "fourty-one", "fourty-two",
141f3b0ac34SDag-Erling Smørgrav "fourty-three", "fourty-four", "fourty-five", "fourty-six",
142f3b0ac34SDag-Erling Smørgrav "fourty-seven", "fourty-eight", "fourty-nine", "fifty", "fifty-one",
143f3b0ac34SDag-Erling Smørgrav "fifty-two", "fifty-three", "fifty-four", "fifty-five", "fifty-six",
144f3b0ac34SDag-Erling Smørgrav "fifty-seven", "fifty-eight", "fifty-nine", "sixty", "sixty-one",
145f3b0ac34SDag-Erling Smørgrav "sixty-two", "sixty-three",
146f3b0ac34SDag-Erling Smørgrav NULL
147f3b0ac34SDag-Erling Smørgrav };
148f3b0ac34SDag-Erling Smørgrav
1492f3ed619SDag-Erling Smørgrav
1502f3ed619SDag-Erling Smørgrav /***************************************************************************
1512f3ed619SDag-Erling Smørgrav * Lines without words
1522f3ed619SDag-Erling Smørgrav */
1532f3ed619SDag-Erling Smørgrav
1542f3ed619SDag-Erling Smørgrav T_FUNC(empty_input, "empty input")
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 ret = orlv_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/);
161ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
1622f3ed619SDag-Erling Smørgrav return (ret);
1632f3ed619SDag-Erling Smørgrav }
1642f3ed619SDag-Erling Smørgrav
1652f3ed619SDag-Erling Smørgrav T_FUNC(empty_line, "empty line")
1662f3ed619SDag-Erling Smørgrav {
167ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
1682f3ed619SDag-Erling Smørgrav int ret;
1692f3ed619SDag-Erling Smørgrav
170ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
171ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\n");
172ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
173ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
174ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
1752f3ed619SDag-Erling Smørgrav return (ret);
1762f3ed619SDag-Erling Smørgrav }
1772f3ed619SDag-Erling Smørgrav
1782f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_empty_line, "unterminated empty line")
1792f3ed619SDag-Erling Smørgrav {
180ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
1812f3ed619SDag-Erling Smørgrav int ret;
1822f3ed619SDag-Erling Smørgrav
183ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
184ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " ");
185ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
186ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/);
187ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
1882f3ed619SDag-Erling Smørgrav return (ret);
1892f3ed619SDag-Erling Smørgrav }
1902f3ed619SDag-Erling Smørgrav
1912f3ed619SDag-Erling Smørgrav T_FUNC(whitespace, "whitespace")
1922f3ed619SDag-Erling Smørgrav {
193ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
1942f3ed619SDag-Erling Smørgrav int ret;
1952f3ed619SDag-Erling Smørgrav
196ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
197ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " \n");
198ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
199ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
200ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
2012f3ed619SDag-Erling Smørgrav return (ret);
2022f3ed619SDag-Erling Smørgrav }
2032f3ed619SDag-Erling Smørgrav
2042f3ed619SDag-Erling Smørgrav T_FUNC(comment, "comment")
2052f3ed619SDag-Erling Smørgrav {
206ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
2072f3ed619SDag-Erling Smørgrav int ret;
2082f3ed619SDag-Erling Smørgrav
209ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
210ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "# comment\n");
211ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
212ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
213ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
2142f3ed619SDag-Erling Smørgrav return (ret);
2152f3ed619SDag-Erling Smørgrav }
2162f3ed619SDag-Erling Smørgrav
2172f3ed619SDag-Erling Smørgrav T_FUNC(whitespace_before_comment, "whitespace before comment")
2182f3ed619SDag-Erling Smørgrav {
219ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
2202f3ed619SDag-Erling Smørgrav int ret;
2212f3ed619SDag-Erling Smørgrav
222ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
223ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " # comment\n");
224ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
225ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, empty, 1 /*lines*/, 0 /*eof*/);
226ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
2272f3ed619SDag-Erling Smørgrav return (ret);
2282f3ed619SDag-Erling Smørgrav }
2292f3ed619SDag-Erling Smørgrav
230f3b0ac34SDag-Erling Smørgrav T_FUNC(line_continuation_within_whitespace, "line continuation within whitespace")
231f3b0ac34SDag-Erling Smørgrav {
232f3b0ac34SDag-Erling Smørgrav struct t_file *tf;
233f3b0ac34SDag-Erling Smørgrav int ret;
234f3b0ac34SDag-Erling Smørgrav
235f3b0ac34SDag-Erling Smørgrav tf = t_fopen(NULL);
236f3b0ac34SDag-Erling Smørgrav t_fprintf(tf, "%s \\\n %s\n", hello_world[0], hello_world[1]);
237f3b0ac34SDag-Erling Smørgrav t_frewind(tf);
238f3b0ac34SDag-Erling Smørgrav ret = orlv_expect(tf, hello_world, 2 /*lines*/, 0 /*eof*/) &&
239f3b0ac34SDag-Erling Smørgrav orlv_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/);
240f3b0ac34SDag-Erling Smørgrav t_fclose(tf);
241f3b0ac34SDag-Erling Smørgrav return (ret);
242f3b0ac34SDag-Erling Smørgrav }
243f3b0ac34SDag-Erling Smørgrav
2442f3ed619SDag-Erling Smørgrav
2452f3ed619SDag-Erling Smørgrav /***************************************************************************
2462f3ed619SDag-Erling Smørgrav * Simple words
2472f3ed619SDag-Erling Smørgrav */
2482f3ed619SDag-Erling Smørgrav
2492f3ed619SDag-Erling Smørgrav T_FUNC(one_word, "one word")
2502f3ed619SDag-Erling Smørgrav {
251ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
2522f3ed619SDag-Erling Smørgrav int ret;
2532f3ed619SDag-Erling Smørgrav
254ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
255ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello\n");
256ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
257ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, hello, 1 /*lines*/, 0 /*eof*/);
258ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
2592f3ed619SDag-Erling Smørgrav return (ret);
2602f3ed619SDag-Erling Smørgrav }
2612f3ed619SDag-Erling Smørgrav
2622f3ed619SDag-Erling Smørgrav T_FUNC(two_words, "two words")
2632f3ed619SDag-Erling Smørgrav {
264ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
2652f3ed619SDag-Erling Smørgrav int ret;
2662f3ed619SDag-Erling Smørgrav
267ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
268ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello world\n");
269ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
270ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, hello_world, 1 /*lines*/, 0 /*eof*/);
271ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
2722f3ed619SDag-Erling Smørgrav return (ret);
2732f3ed619SDag-Erling Smørgrav }
2742f3ed619SDag-Erling Smørgrav
275f3b0ac34SDag-Erling Smørgrav T_FUNC(many_words, "many words")
276f3b0ac34SDag-Erling Smørgrav {
277f3b0ac34SDag-Erling Smørgrav struct t_file *tf;
278f3b0ac34SDag-Erling Smørgrav const char **word;
279f3b0ac34SDag-Erling Smørgrav int ret;
280f3b0ac34SDag-Erling Smørgrav
281f3b0ac34SDag-Erling Smørgrav tf = t_fopen(NULL);
282f3b0ac34SDag-Erling Smørgrav for (word = numbers; *word; ++word)
283f3b0ac34SDag-Erling Smørgrav t_fprintf(tf, " %s", *word);
284f3b0ac34SDag-Erling Smørgrav t_fprintf(tf, "\n");
285f3b0ac34SDag-Erling Smørgrav t_frewind(tf);
286f3b0ac34SDag-Erling Smørgrav ret = orlv_expect(tf, numbers, 1 /*lines*/, 0 /*eof*/);
287f3b0ac34SDag-Erling Smørgrav t_fclose(tf);
288f3b0ac34SDag-Erling Smørgrav return (ret);
289f3b0ac34SDag-Erling Smørgrav }
290f3b0ac34SDag-Erling Smørgrav
2912f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_line, "unterminated line")
2922f3ed619SDag-Erling Smørgrav {
293ce77a8d6SDag-Erling Smørgrav struct t_file *tf;
2942f3ed619SDag-Erling Smørgrav int ret;
2952f3ed619SDag-Erling Smørgrav
296ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL);
297ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello world");
298ce77a8d6SDag-Erling Smørgrav t_frewind(tf);
299ce77a8d6SDag-Erling Smørgrav ret = orlv_expect(tf, hello_world, 0 /*lines*/, 1 /*eof*/);
300ce77a8d6SDag-Erling Smørgrav t_fclose(tf);
3012f3ed619SDag-Erling Smørgrav return (ret);
3022f3ed619SDag-Erling Smørgrav }
3032f3ed619SDag-Erling Smørgrav
3042f3ed619SDag-Erling Smørgrav
3052f3ed619SDag-Erling Smørgrav /***************************************************************************
3062f3ed619SDag-Erling Smørgrav * Boilerplate
3072f3ed619SDag-Erling Smørgrav */
3082f3ed619SDag-Erling Smørgrav
309f3b0ac34SDag-Erling Smørgrav static int
t_prepare(int argc,char * argv[])3102f3ed619SDag-Erling Smørgrav t_prepare(int argc, char *argv[])
3112f3ed619SDag-Erling Smørgrav {
3122f3ed619SDag-Erling Smørgrav
3132f3ed619SDag-Erling Smørgrav (void)argc;
3142f3ed619SDag-Erling Smørgrav (void)argv;
315f3b0ac34SDag-Erling Smørgrav
316f3b0ac34SDag-Erling Smørgrav T(empty_input);
317f3b0ac34SDag-Erling Smørgrav T(empty_line);
318f3b0ac34SDag-Erling Smørgrav T(unterminated_empty_line);
319f3b0ac34SDag-Erling Smørgrav T(whitespace);
320f3b0ac34SDag-Erling Smørgrav T(comment);
321f3b0ac34SDag-Erling Smørgrav T(whitespace_before_comment);
322f3b0ac34SDag-Erling Smørgrav T(line_continuation_within_whitespace);
323f3b0ac34SDag-Erling Smørgrav
324f3b0ac34SDag-Erling Smørgrav T(one_word);
325f3b0ac34SDag-Erling Smørgrav T(two_words);
326f3b0ac34SDag-Erling Smørgrav T(many_words);
327f3b0ac34SDag-Erling Smørgrav T(unterminated_line);
328f3b0ac34SDag-Erling Smørgrav
329f3b0ac34SDag-Erling Smørgrav return (0);
3302f3ed619SDag-Erling Smørgrav }
3312f3ed619SDag-Erling Smørgrav
332f3b0ac34SDag-Erling Smørgrav int
main(int argc,char * argv[])333f3b0ac34SDag-Erling Smørgrav main(int argc, char *argv[])
3342f3ed619SDag-Erling Smørgrav {
335f3b0ac34SDag-Erling Smørgrav
336f3b0ac34SDag-Erling Smørgrav t_main(t_prepare, NULL, argc, argv);
3372f3ed619SDag-Erling Smørgrav }
338