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