12f3ed619SDag-Erling Smørgrav /*- 22f3ed619SDag-Erling Smørgrav * Copyright (c) 2012 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 9*ce77a8d6SDag-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*ce77a8d6SDag-Erling Smørgrav * $Id: t_openpam_readword.c 648 2013-03-05 17:54:27Z 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 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 "t.h" 462f3ed619SDag-Erling Smørgrav 472f3ed619SDag-Erling Smørgrav /* 482f3ed619SDag-Erling Smørgrav * Read a word from the temp file and verify that the result matches our 492f3ed619SDag-Erling Smørgrav * expectations: whether a word was read at all, how many lines were read 502f3ed619SDag-Erling Smørgrav * (in case of quoted or escaped newlines), whether we reached the end of 512f3ed619SDag-Erling Smørgrav * the file and whether we reached the end of the line. 522f3ed619SDag-Erling Smørgrav */ 532f3ed619SDag-Erling Smørgrav static int 54*ce77a8d6SDag-Erling Smørgrav orw_expect(struct t_file *tf, const char *expected, int lines, int eof, int eol) 552f3ed619SDag-Erling Smørgrav { 562f3ed619SDag-Erling Smørgrav int ch, lineno = 0; 572f3ed619SDag-Erling Smørgrav char *got; 582f3ed619SDag-Erling Smørgrav size_t len; 592f3ed619SDag-Erling Smørgrav 60*ce77a8d6SDag-Erling Smørgrav got = openpam_readword(tf->file, &lineno, &len); 61*ce77a8d6SDag-Erling Smørgrav if (t_ferror(tf)) 62*ce77a8d6SDag-Erling Smørgrav err(1, "%s(): %s", __func__, tf->name); 632f3ed619SDag-Erling Smørgrav if (expected != NULL && got == NULL) { 642f3ed619SDag-Erling Smørgrav t_verbose("expected <<%s>>, got nothing\n", expected); 652f3ed619SDag-Erling Smørgrav return (0); 662f3ed619SDag-Erling Smørgrav } 672f3ed619SDag-Erling Smørgrav if (expected == NULL && got != NULL) { 682f3ed619SDag-Erling Smørgrav t_verbose("expected nothing, got <<%s>>\n", got); 692f3ed619SDag-Erling Smørgrav return (0); 702f3ed619SDag-Erling Smørgrav } 712f3ed619SDag-Erling Smørgrav if (expected != NULL && got != NULL && strcmp(expected, got) != 0) { 722f3ed619SDag-Erling Smørgrav t_verbose("expected <<%s>>, got <<%s>>\n", expected, got); 732f3ed619SDag-Erling Smørgrav return (0); 742f3ed619SDag-Erling Smørgrav } 752f3ed619SDag-Erling Smørgrav if (lineno != lines) { 762f3ed619SDag-Erling Smørgrav t_verbose("expected to advance %d lines, advanced %d lines\n", 772f3ed619SDag-Erling Smørgrav lines, lineno); 782f3ed619SDag-Erling Smørgrav return (0); 792f3ed619SDag-Erling Smørgrav } 80*ce77a8d6SDag-Erling Smørgrav if (eof && !t_feof(tf)) { 812f3ed619SDag-Erling Smørgrav t_verbose("expected EOF, but didn't get it\n"); 822f3ed619SDag-Erling Smørgrav return (0); 832f3ed619SDag-Erling Smørgrav } 84*ce77a8d6SDag-Erling Smørgrav if (!eof && t_feof(tf)) { 852f3ed619SDag-Erling Smørgrav t_verbose("didn't expect EOF, but got it anyway\n"); 862f3ed619SDag-Erling Smørgrav return (0); 872f3ed619SDag-Erling Smørgrav } 88*ce77a8d6SDag-Erling Smørgrav ch = fgetc(tf->file); 89*ce77a8d6SDag-Erling Smørgrav if (t_ferror(tf)) 90*ce77a8d6SDag-Erling Smørgrav err(1, "%s(): %s", __func__, tf->name); 912f3ed619SDag-Erling Smørgrav if (eol && ch != '\n') { 922f3ed619SDag-Erling Smørgrav t_verbose("expected EOL, but didn't get it\n"); 932f3ed619SDag-Erling Smørgrav return (0); 942f3ed619SDag-Erling Smørgrav } 952f3ed619SDag-Erling Smørgrav if (!eol && ch == '\n') { 962f3ed619SDag-Erling Smørgrav t_verbose("didn't expect EOL, but got it anyway\n"); 972f3ed619SDag-Erling Smørgrav return (0); 982f3ed619SDag-Erling Smørgrav } 992f3ed619SDag-Erling Smørgrav if (ch != EOF) 100*ce77a8d6SDag-Erling Smørgrav ungetc(ch, tf->file); 1012f3ed619SDag-Erling Smørgrav return (1); 1022f3ed619SDag-Erling Smørgrav } 1032f3ed619SDag-Erling Smørgrav 1042f3ed619SDag-Erling Smørgrav 1052f3ed619SDag-Erling Smørgrav /*************************************************************************** 1062f3ed619SDag-Erling Smørgrav * Lines without words 1072f3ed619SDag-Erling Smørgrav */ 1082f3ed619SDag-Erling Smørgrav 1092f3ed619SDag-Erling Smørgrav T_FUNC(empty_input, "empty input") 1102f3ed619SDag-Erling Smørgrav { 111*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1122f3ed619SDag-Erling Smørgrav int ret; 1132f3ed619SDag-Erling Smørgrav 114*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 115*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); 116*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1172f3ed619SDag-Erling Smørgrav return (ret); 1182f3ed619SDag-Erling Smørgrav } 1192f3ed619SDag-Erling Smørgrav 1202f3ed619SDag-Erling Smørgrav T_FUNC(empty_line, "empty line") 1212f3ed619SDag-Erling Smørgrav { 122*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1232f3ed619SDag-Erling Smørgrav int ret; 1242f3ed619SDag-Erling Smørgrav 125*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 126*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\n"); 127*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 128*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 129*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1302f3ed619SDag-Erling Smørgrav return (ret); 1312f3ed619SDag-Erling Smørgrav } 1322f3ed619SDag-Erling Smørgrav 1332f3ed619SDag-Erling Smørgrav T_FUNC(unterminated_line, "unterminated line") 1342f3ed619SDag-Erling Smørgrav { 135*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1362f3ed619SDag-Erling Smørgrav int ret; 1372f3ed619SDag-Erling Smørgrav 138*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 139*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " "); 140*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 141*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); 142*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1432f3ed619SDag-Erling Smørgrav return (ret); 1442f3ed619SDag-Erling Smørgrav } 1452f3ed619SDag-Erling Smørgrav 1462f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace, "single whitespace") 1472f3ed619SDag-Erling Smørgrav { 148*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1492f3ed619SDag-Erling Smørgrav int ret; 1502f3ed619SDag-Erling Smørgrav 151*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 152*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " \n"); 153*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 154*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 155*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1562f3ed619SDag-Erling Smørgrav return (ret); 1572f3ed619SDag-Erling Smørgrav } 1582f3ed619SDag-Erling Smørgrav 1592f3ed619SDag-Erling Smørgrav T_FUNC(multiple_whitespace, "multiple whitespace") 1602f3ed619SDag-Erling Smørgrav { 161*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1622f3ed619SDag-Erling Smørgrav int ret; 1632f3ed619SDag-Erling Smørgrav 164*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 165*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " \t\r\n"); 166*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 167*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 168*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1692f3ed619SDag-Erling Smørgrav return (ret); 1702f3ed619SDag-Erling Smørgrav } 1712f3ed619SDag-Erling Smørgrav 1722f3ed619SDag-Erling Smørgrav T_FUNC(comment, "comment") 1732f3ed619SDag-Erling Smørgrav { 174*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1752f3ed619SDag-Erling Smørgrav int ret; 1762f3ed619SDag-Erling Smørgrav 177*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 178*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "# comment\n"); 179*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 180*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 181*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1822f3ed619SDag-Erling Smørgrav return (ret); 1832f3ed619SDag-Erling Smørgrav } 1842f3ed619SDag-Erling Smørgrav 1852f3ed619SDag-Erling Smørgrav T_FUNC(whitespace_before_comment, "whitespace before comment") 1862f3ed619SDag-Erling Smørgrav { 187*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 1882f3ed619SDag-Erling Smørgrav int ret; 1892f3ed619SDag-Erling Smørgrav 190*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 191*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " # comment\n"); 192*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 193*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 194*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 1952f3ed619SDag-Erling Smørgrav return (ret); 1962f3ed619SDag-Erling Smørgrav } 1972f3ed619SDag-Erling Smørgrav 1982f3ed619SDag-Erling Smørgrav 1992f3ed619SDag-Erling Smørgrav /*************************************************************************** 2002f3ed619SDag-Erling Smørgrav * Simple cases - no quotes or escapes 2012f3ed619SDag-Erling Smørgrav */ 2022f3ed619SDag-Erling Smørgrav 2032f3ed619SDag-Erling Smørgrav T_FUNC(single_word, "single word") 2042f3ed619SDag-Erling Smørgrav { 2052f3ed619SDag-Erling Smørgrav const char *word = "hello"; 206*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2072f3ed619SDag-Erling Smørgrav int ret; 2082f3ed619SDag-Erling Smørgrav 209*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 210*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "%s\n", word); 211*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 212*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 213*ce77a8d6SDag-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(single_whitespace_before_word, "single whitespace before word") 2182f3ed619SDag-Erling Smørgrav { 2192f3ed619SDag-Erling Smørgrav const char *word = "hello"; 220*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2212f3ed619SDag-Erling Smørgrav int ret; 2222f3ed619SDag-Erling Smørgrav 223*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 224*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " %s\n", word); 225*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 226*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 227*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 2282f3ed619SDag-Erling Smørgrav return (ret); 2292f3ed619SDag-Erling Smørgrav } 2302f3ed619SDag-Erling Smørgrav 2312f3ed619SDag-Erling Smørgrav T_FUNC(double_whitespace_before_word, "double whitespace before word") 2322f3ed619SDag-Erling Smørgrav { 2332f3ed619SDag-Erling Smørgrav const char *word = "hello"; 234*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2352f3ed619SDag-Erling Smørgrav int ret; 2362f3ed619SDag-Erling Smørgrav 237*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 238*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, " %s\n", word); 239*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 240*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 241*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 2422f3ed619SDag-Erling Smørgrav return (ret); 2432f3ed619SDag-Erling Smørgrav } 2442f3ed619SDag-Erling Smørgrav 2452f3ed619SDag-Erling Smørgrav T_FUNC(single_whitespace_after_word, "single whitespace after word") 2462f3ed619SDag-Erling Smørgrav { 2472f3ed619SDag-Erling Smørgrav const char *word = "hello"; 248*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2492f3ed619SDag-Erling Smørgrav int ret; 2502f3ed619SDag-Erling Smørgrav 251*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 252*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "%s \n", word); 253*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 254*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/); 255*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 2562f3ed619SDag-Erling Smørgrav return (ret); 2572f3ed619SDag-Erling Smørgrav } 2582f3ed619SDag-Erling Smørgrav 2592f3ed619SDag-Erling Smørgrav T_FUNC(double_whitespace_after_word, "double whitespace after word") 2602f3ed619SDag-Erling Smørgrav { 2612f3ed619SDag-Erling Smørgrav const char *word = "hello"; 262*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2632f3ed619SDag-Erling Smørgrav int ret; 2642f3ed619SDag-Erling Smørgrav 265*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 266*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "%s \n", word); 267*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 268*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/); 269*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 2702f3ed619SDag-Erling Smørgrav return (ret); 2712f3ed619SDag-Erling Smørgrav } 2722f3ed619SDag-Erling Smørgrav 2732f3ed619SDag-Erling Smørgrav T_FUNC(comment_after_word, "comment after word") 2742f3ed619SDag-Erling Smørgrav { 2752f3ed619SDag-Erling Smørgrav const char *word = "hello"; 276*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2772f3ed619SDag-Erling Smørgrav int ret; 2782f3ed619SDag-Erling Smørgrav 279*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 280*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "%s # comment\n", word); 281*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 282*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 283*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, NULL, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 284*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 2852f3ed619SDag-Erling Smørgrav return (ret); 2862f3ed619SDag-Erling Smørgrav } 2872f3ed619SDag-Erling Smørgrav 2882f3ed619SDag-Erling Smørgrav T_FUNC(word_containing_hash, "word containing hash") 2892f3ed619SDag-Erling Smørgrav { 2902f3ed619SDag-Erling Smørgrav const char *word = "hello#world"; 291*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 2922f3ed619SDag-Erling Smørgrav int ret; 2932f3ed619SDag-Erling Smørgrav 294*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 295*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "%s\n", word); 296*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 297*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word, 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 298*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 2992f3ed619SDag-Erling Smørgrav return (ret); 3002f3ed619SDag-Erling Smørgrav } 3012f3ed619SDag-Erling Smørgrav 3022f3ed619SDag-Erling Smørgrav T_FUNC(two_words, "two words") 3032f3ed619SDag-Erling Smørgrav { 3042f3ed619SDag-Erling Smørgrav const char *word[] = { "hello", "world" }; 305*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3062f3ed619SDag-Erling Smørgrav int ret; 3072f3ed619SDag-Erling Smørgrav 308*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 309*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "%s %s\n", word[0], word[1]); 310*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 311*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, word[0], 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 312*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, word[1], 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 313*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 3142f3ed619SDag-Erling Smørgrav return (ret); 3152f3ed619SDag-Erling Smørgrav } 3162f3ed619SDag-Erling Smørgrav 3172f3ed619SDag-Erling Smørgrav 3182f3ed619SDag-Erling Smørgrav /*************************************************************************** 3192f3ed619SDag-Erling Smørgrav * Escapes 3202f3ed619SDag-Erling Smørgrav */ 3212f3ed619SDag-Erling Smørgrav 3222f3ed619SDag-Erling Smørgrav T_FUNC(naked_escape, "naked escape") 3232f3ed619SDag-Erling Smørgrav { 324*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3252f3ed619SDag-Erling Smørgrav int ret; 3262f3ed619SDag-Erling Smørgrav 327*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 328*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\"); 329*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 330*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); 331*ce77a8d6SDag-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(escaped_escape, "escaped escape") 3362f3ed619SDag-Erling Smørgrav { 337*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3382f3ed619SDag-Erling Smørgrav int ret; 3392f3ed619SDag-Erling Smørgrav 340*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 341*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\\\\n"); 342*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 343*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 344*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 3452f3ed619SDag-Erling Smørgrav return (ret); 3462f3ed619SDag-Erling Smørgrav } 3472f3ed619SDag-Erling Smørgrav 3482f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace, "escaped whitespace") 3492f3ed619SDag-Erling Smørgrav { 350*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3512f3ed619SDag-Erling Smørgrav int ret; 3522f3ed619SDag-Erling Smørgrav 353*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 354*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\ \\\t \\\r \\\n\n"); 355*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 356*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 357*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 358*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 3592f3ed619SDag-Erling Smørgrav /* this last one is a line continuation */ 360*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, NULL, 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); 361*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 3622f3ed619SDag-Erling Smørgrav return (ret); 3632f3ed619SDag-Erling Smørgrav } 3642f3ed619SDag-Erling Smørgrav 3652f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_before_word, "escaped newline before word") 3662f3ed619SDag-Erling Smørgrav { 367*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3682f3ed619SDag-Erling Smørgrav int ret; 3692f3ed619SDag-Erling Smørgrav 370*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 371*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\\nhello world\n"); 372*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 373*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/); 374*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 3752f3ed619SDag-Erling Smørgrav return (ret); 3762f3ed619SDag-Erling Smørgrav } 3772f3ed619SDag-Erling Smørgrav 3782f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_within_word, "escaped newline within word") 3792f3ed619SDag-Erling Smørgrav { 380*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3812f3ed619SDag-Erling Smørgrav int ret; 3822f3ed619SDag-Erling Smørgrav 383*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 384*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello\\\nworld\n"); 385*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 386*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "helloworld", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); 387*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 3882f3ed619SDag-Erling Smørgrav return (ret); 3892f3ed619SDag-Erling Smørgrav } 3902f3ed619SDag-Erling Smørgrav 3912f3ed619SDag-Erling Smørgrav T_FUNC(escaped_newline_after_word, "escaped newline after word") 3922f3ed619SDag-Erling Smørgrav { 393*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 3942f3ed619SDag-Erling Smørgrav int ret; 3952f3ed619SDag-Erling Smørgrav 396*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 397*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello\\\n world\n"); 398*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 399*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello", 1 /*lines*/, 0 /*eof*/, 0 /*eol*/); 400*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4012f3ed619SDag-Erling Smørgrav return (ret); 4022f3ed619SDag-Erling Smørgrav } 4032f3ed619SDag-Erling Smørgrav 4042f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter, "escaped letter") 4052f3ed619SDag-Erling Smørgrav { 406*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4072f3ed619SDag-Erling Smørgrav int ret; 4082f3ed619SDag-Erling Smørgrav 409*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 410*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\z\n"); 411*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 412*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 413*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4142f3ed619SDag-Erling Smørgrav return (ret); 4152f3ed619SDag-Erling Smørgrav } 4162f3ed619SDag-Erling Smørgrav 4172f3ed619SDag-Erling Smørgrav 4182f3ed619SDag-Erling Smørgrav /*************************************************************************** 4192f3ed619SDag-Erling Smørgrav * Quotes 4202f3ed619SDag-Erling Smørgrav */ 4212f3ed619SDag-Erling Smørgrav 4222f3ed619SDag-Erling Smørgrav T_FUNC(naked_single_quote, "naked single quote") 4232f3ed619SDag-Erling Smørgrav { 424*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4252f3ed619SDag-Erling Smørgrav int ret; 4262f3ed619SDag-Erling Smørgrav 427*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 428*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'"); 429*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 430*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); 431*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4322f3ed619SDag-Erling Smørgrav return (ret); 4332f3ed619SDag-Erling Smørgrav } 4342f3ed619SDag-Erling Smørgrav 4352f3ed619SDag-Erling Smørgrav T_FUNC(naked_double_quote, "naked double quote") 4362f3ed619SDag-Erling Smørgrav { 437*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4382f3ed619SDag-Erling Smørgrav int ret; 4392f3ed619SDag-Erling Smørgrav 440*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 441*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\""); 442*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 443*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 0 /*lines*/, 1 /*eof*/, 0 /*eol*/); 444*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4452f3ed619SDag-Erling Smørgrav return (ret); 4462f3ed619SDag-Erling Smørgrav } 4472f3ed619SDag-Erling Smørgrav 4482f3ed619SDag-Erling Smørgrav T_FUNC(empty_single_quotes, "empty single quotes") 4492f3ed619SDag-Erling Smørgrav { 450*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4512f3ed619SDag-Erling Smørgrav int ret; 4522f3ed619SDag-Erling Smørgrav 453*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 454*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "''\n"); 455*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 456*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 457*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4582f3ed619SDag-Erling Smørgrav return (ret); 4592f3ed619SDag-Erling Smørgrav } 4602f3ed619SDag-Erling Smørgrav 4612f3ed619SDag-Erling Smørgrav T_FUNC(empty_double_quotes, "empty double quotes") 4622f3ed619SDag-Erling Smørgrav { 463*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4642f3ed619SDag-Erling Smørgrav int ret; 4652f3ed619SDag-Erling Smørgrav 466*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 467*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"\"\n"); 468*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 469*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 470*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4712f3ed619SDag-Erling Smørgrav return (ret); 4722f3ed619SDag-Erling Smørgrav } 4732f3ed619SDag-Erling Smørgrav 4742f3ed619SDag-Erling Smørgrav T_FUNC(single_quotes_within_double_quotes, "single quotes within double quotes") 4752f3ed619SDag-Erling Smørgrav { 476*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4772f3ed619SDag-Erling Smørgrav int ret; 4782f3ed619SDag-Erling Smørgrav 479*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 480*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"' '\"\n"); 481*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 482*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "' '", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 483*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4842f3ed619SDag-Erling Smørgrav return (ret); 4852f3ed619SDag-Erling Smørgrav } 4862f3ed619SDag-Erling Smørgrav 4872f3ed619SDag-Erling Smørgrav T_FUNC(double_quotes_within_single_quotes, "double quotes within single quotes") 4882f3ed619SDag-Erling Smørgrav { 489*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 4902f3ed619SDag-Erling Smørgrav int ret; 4912f3ed619SDag-Erling Smørgrav 492*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 493*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'\" \"'\n"); 494*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 495*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\" \"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 496*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 4972f3ed619SDag-Erling Smørgrav return (ret); 4982f3ed619SDag-Erling Smørgrav } 4992f3ed619SDag-Erling Smørgrav 5002f3ed619SDag-Erling Smørgrav T_FUNC(single_quoted_whitespace, "single-quoted whitespace") 5012f3ed619SDag-Erling Smørgrav { 502*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 5032f3ed619SDag-Erling Smørgrav int ret; 5042f3ed619SDag-Erling Smørgrav 505*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 506*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "' ' '\t' '\r' '\n'\n"); 507*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 508*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 509*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 510*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 511*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); 512*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 5132f3ed619SDag-Erling Smørgrav return (ret); 5142f3ed619SDag-Erling Smørgrav } 5152f3ed619SDag-Erling Smørgrav 5162f3ed619SDag-Erling Smørgrav T_FUNC(double_quoted_whitespace, "double-quoted whitespace") 5172f3ed619SDag-Erling Smørgrav { 518*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 5192f3ed619SDag-Erling Smørgrav int ret; 5202f3ed619SDag-Erling Smørgrav 521*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 522*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\" \" \"\t\" \"\r\" \"\n\"\n"); 523*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 524*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, " ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 525*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 526*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 527*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); 528*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 5292f3ed619SDag-Erling Smørgrav return (ret); 5302f3ed619SDag-Erling Smørgrav } 5312f3ed619SDag-Erling Smørgrav 5322f3ed619SDag-Erling Smørgrav T_FUNC(single_quoted_words, "single-quoted words") 5332f3ed619SDag-Erling Smørgrav { 534*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 5352f3ed619SDag-Erling Smørgrav int ret; 5362f3ed619SDag-Erling Smørgrav 537*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 538*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'hello world'\n"); 539*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 540*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 541*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 5422f3ed619SDag-Erling Smørgrav return (ret); 5432f3ed619SDag-Erling Smørgrav } 5442f3ed619SDag-Erling Smørgrav 5452f3ed619SDag-Erling Smørgrav T_FUNC(double_quoted_words, "double-quoted words") 5462f3ed619SDag-Erling Smørgrav { 547*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 5482f3ed619SDag-Erling Smørgrav int ret; 5492f3ed619SDag-Erling Smørgrav 550*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 551*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"hello world\"\n"); 552*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 553*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 554*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 555*ce77a8d6SDag-Erling Smørgrav return (ret); 556*ce77a8d6SDag-Erling Smørgrav } 557*ce77a8d6SDag-Erling Smørgrav 558*ce77a8d6SDag-Erling Smørgrav 559*ce77a8d6SDag-Erling Smørgrav /*************************************************************************** 560*ce77a8d6SDag-Erling Smørgrav * Combinations of quoted and unquoted text 561*ce77a8d6SDag-Erling Smørgrav */ 562*ce77a8d6SDag-Erling Smørgrav 563*ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_before_word, "single quote before word") 564*ce77a8d6SDag-Erling Smørgrav { 565*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 566*ce77a8d6SDag-Erling Smørgrav int ret; 567*ce77a8d6SDag-Erling Smørgrav 568*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 569*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'hello 'world\n"); 570*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 571*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 572*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 573*ce77a8d6SDag-Erling Smørgrav return (ret); 574*ce77a8d6SDag-Erling Smørgrav } 575*ce77a8d6SDag-Erling Smørgrav 576*ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_before_word, "double quote before word") 577*ce77a8d6SDag-Erling Smørgrav { 578*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 579*ce77a8d6SDag-Erling Smørgrav int ret; 580*ce77a8d6SDag-Erling Smørgrav 581*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 582*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"hello \"world\n"); 583*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 584*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 585*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 586*ce77a8d6SDag-Erling Smørgrav return (ret); 587*ce77a8d6SDag-Erling Smørgrav } 588*ce77a8d6SDag-Erling Smørgrav 589*ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_within_word, "single quote within word") 590*ce77a8d6SDag-Erling Smørgrav { 591*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 592*ce77a8d6SDag-Erling Smørgrav int ret; 593*ce77a8d6SDag-Erling Smørgrav 594*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 595*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello' 'world\n"); 596*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 597*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 598*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 599*ce77a8d6SDag-Erling Smørgrav return (ret); 600*ce77a8d6SDag-Erling Smørgrav } 601*ce77a8d6SDag-Erling Smørgrav 602*ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_within_word, "double quote within word") 603*ce77a8d6SDag-Erling Smørgrav { 604*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 605*ce77a8d6SDag-Erling Smørgrav int ret; 606*ce77a8d6SDag-Erling Smørgrav 607*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 608*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello\" \"world\n"); 609*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 610*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 611*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 612*ce77a8d6SDag-Erling Smørgrav return (ret); 613*ce77a8d6SDag-Erling Smørgrav } 614*ce77a8d6SDag-Erling Smørgrav 615*ce77a8d6SDag-Erling Smørgrav T_FUNC(single_quote_after_word, "single quote after word") 616*ce77a8d6SDag-Erling Smørgrav { 617*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 618*ce77a8d6SDag-Erling Smørgrav int ret; 619*ce77a8d6SDag-Erling Smørgrav 620*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 621*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello' world'\n"); 622*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 623*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 624*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 625*ce77a8d6SDag-Erling Smørgrav return (ret); 626*ce77a8d6SDag-Erling Smørgrav } 627*ce77a8d6SDag-Erling Smørgrav 628*ce77a8d6SDag-Erling Smørgrav T_FUNC(double_quote_after_word, "double quote after word") 629*ce77a8d6SDag-Erling Smørgrav { 630*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 631*ce77a8d6SDag-Erling Smørgrav int ret; 632*ce77a8d6SDag-Erling Smørgrav 633*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 634*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "hello\" world\"\n"); 635*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 636*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "hello world", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 637*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 6382f3ed619SDag-Erling Smørgrav return (ret); 6392f3ed619SDag-Erling Smørgrav } 6402f3ed619SDag-Erling Smørgrav 6412f3ed619SDag-Erling Smørgrav 6422f3ed619SDag-Erling Smørgrav /*************************************************************************** 6432f3ed619SDag-Erling Smørgrav * Combinations of escape and quotes 6442f3ed619SDag-Erling Smørgrav */ 6452f3ed619SDag-Erling Smørgrav 6462f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote, 6472f3ed619SDag-Erling Smørgrav "escaped single quote") 6482f3ed619SDag-Erling Smørgrav { 649*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 6502f3ed619SDag-Erling Smørgrav int ret; 6512f3ed619SDag-Erling Smørgrav 652*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 653*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\'\n"); 654*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 655*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 656*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 6572f3ed619SDag-Erling Smørgrav return (ret); 6582f3ed619SDag-Erling Smørgrav } 6592f3ed619SDag-Erling Smørgrav 6602f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote, 6612f3ed619SDag-Erling Smørgrav "escaped double quote") 6622f3ed619SDag-Erling Smørgrav { 663*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 6642f3ed619SDag-Erling Smørgrav int ret; 6652f3ed619SDag-Erling Smørgrav 666*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 667*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\\\"\n"); 668*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 669*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 670*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 6712f3ed619SDag-Erling Smørgrav return (ret); 6722f3ed619SDag-Erling Smørgrav } 6732f3ed619SDag-Erling Smørgrav 6742f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace_within_single_quotes, 6752f3ed619SDag-Erling Smørgrav "escaped whitespace within single quotes") 6762f3ed619SDag-Erling Smørgrav { 677*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 6782f3ed619SDag-Erling Smørgrav int ret; 6792f3ed619SDag-Erling Smørgrav 680*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 681*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'\\ ' '\\\t' '\\\r' '\\\n'\n"); 682*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 683*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 684*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 685*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 686*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\\\n", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); 687*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 6882f3ed619SDag-Erling Smørgrav return (ret); 6892f3ed619SDag-Erling Smørgrav } 6902f3ed619SDag-Erling Smørgrav 6912f3ed619SDag-Erling Smørgrav T_FUNC(escaped_whitespace_within_double_quotes, 6922f3ed619SDag-Erling Smørgrav "escaped whitespace within double quotes") 6932f3ed619SDag-Erling Smørgrav { 694*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 6952f3ed619SDag-Erling Smørgrav int ret; 6962f3ed619SDag-Erling Smørgrav 697*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 698*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"\\ \" \"\\\t\" \"\\\r\" \"\\\n\"\n"); 699*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 700*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\ ", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 701*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\\\t", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 702*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "\\\r", 0 /*lines*/, 0 /*eof*/, 0 /*eol*/) && 7032f3ed619SDag-Erling Smørgrav /* this last one is a line continuation */ 704*ce77a8d6SDag-Erling Smørgrav orw_expect(tf, "", 1 /*lines*/, 0 /*eof*/, 1 /*eol*/); 705*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 7062f3ed619SDag-Erling Smørgrav return (ret); 7072f3ed619SDag-Erling Smørgrav } 7082f3ed619SDag-Erling Smørgrav 7092f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter_within_single_quotes, 7102f3ed619SDag-Erling Smørgrav "escaped letter within single quotes") 7112f3ed619SDag-Erling Smørgrav { 712*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7132f3ed619SDag-Erling Smørgrav int ret; 7142f3ed619SDag-Erling Smørgrav 715*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 716*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'\\z'\n"); 717*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 718*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 719*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 7202f3ed619SDag-Erling Smørgrav return (ret); 7212f3ed619SDag-Erling Smørgrav } 7222f3ed619SDag-Erling Smørgrav 7232f3ed619SDag-Erling Smørgrav T_FUNC(escaped_letter_within_double_quotes, 7242f3ed619SDag-Erling Smørgrav "escaped letter within double quotes") 7252f3ed619SDag-Erling Smørgrav { 726*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7272f3ed619SDag-Erling Smørgrav int ret; 7282f3ed619SDag-Erling Smørgrav 729*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 730*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"\\z\"\n"); 731*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 732*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\z", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 733*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 7342f3ed619SDag-Erling Smørgrav return (ret); 7352f3ed619SDag-Erling Smørgrav } 7362f3ed619SDag-Erling Smørgrav 7372f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape_within_single_quotes, 7382f3ed619SDag-Erling Smørgrav "escaped escape within single quotes") 7392f3ed619SDag-Erling Smørgrav { 740*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7412f3ed619SDag-Erling Smørgrav int ret; 7422f3ed619SDag-Erling Smørgrav 743*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 744*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'\\\\'\n"); 745*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 746*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 747*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 7482f3ed619SDag-Erling Smørgrav return (ret); 7492f3ed619SDag-Erling Smørgrav } 7502f3ed619SDag-Erling Smørgrav 7512f3ed619SDag-Erling Smørgrav T_FUNC(escaped_escape_within_double_quotes, 7522f3ed619SDag-Erling Smørgrav "escaped escape within double quotes") 7532f3ed619SDag-Erling Smørgrav { 754*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7552f3ed619SDag-Erling Smørgrav int ret; 7562f3ed619SDag-Erling Smørgrav 757*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 758*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"\\\\\"\n"); 759*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 760*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 761*ce77a8d6SDag-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_single_quote_within_single_quotes, 7662f3ed619SDag-Erling Smørgrav "escaped single quote within single quotes") 7672f3ed619SDag-Erling Smørgrav { 768*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7692f3ed619SDag-Erling Smørgrav int ret; 7702f3ed619SDag-Erling Smørgrav 771*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 772*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'\\''\n"); 773*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 774*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, NULL, 1 /*lines*/, 1 /*eof*/, 0 /*eol*/); 775*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 7762f3ed619SDag-Erling Smørgrav return (ret); 7772f3ed619SDag-Erling Smørgrav } 7782f3ed619SDag-Erling Smørgrav 7792f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote_within_single_quotes, 7802f3ed619SDag-Erling Smørgrav "escaped double quote within single quotes") 7812f3ed619SDag-Erling Smørgrav { 782*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7832f3ed619SDag-Erling Smørgrav int ret; 7842f3ed619SDag-Erling Smørgrav 785*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 786*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "'\\\"'\n"); 787*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 788*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 789*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 7902f3ed619SDag-Erling Smørgrav return (ret); 7912f3ed619SDag-Erling Smørgrav } 7922f3ed619SDag-Erling Smørgrav 7932f3ed619SDag-Erling Smørgrav T_FUNC(escaped_single_quote_within_double_quotes, 7942f3ed619SDag-Erling Smørgrav "escaped single quote within double quotes") 7952f3ed619SDag-Erling Smørgrav { 796*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 7972f3ed619SDag-Erling Smørgrav int ret; 7982f3ed619SDag-Erling Smørgrav 799*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 800*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"\\'\"\n"); 801*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 802*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\\'", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 803*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 8042f3ed619SDag-Erling Smørgrav return (ret); 8052f3ed619SDag-Erling Smørgrav } 8062f3ed619SDag-Erling Smørgrav 8072f3ed619SDag-Erling Smørgrav T_FUNC(escaped_double_quote_within_double_quotes, 8082f3ed619SDag-Erling Smørgrav "escaped double quote within double quotes") 8092f3ed619SDag-Erling Smørgrav { 810*ce77a8d6SDag-Erling Smørgrav struct t_file *tf; 8112f3ed619SDag-Erling Smørgrav int ret; 8122f3ed619SDag-Erling Smørgrav 813*ce77a8d6SDag-Erling Smørgrav tf = t_fopen(NULL); 814*ce77a8d6SDag-Erling Smørgrav t_fprintf(tf, "\"\\\"\"\n"); 815*ce77a8d6SDag-Erling Smørgrav t_frewind(tf); 816*ce77a8d6SDag-Erling Smørgrav ret = orw_expect(tf, "\"", 0 /*lines*/, 0 /*eof*/, 1 /*eol*/); 817*ce77a8d6SDag-Erling Smørgrav t_fclose(tf); 8182f3ed619SDag-Erling Smørgrav return (ret); 8192f3ed619SDag-Erling Smørgrav } 8202f3ed619SDag-Erling Smørgrav 8212f3ed619SDag-Erling Smørgrav 8222f3ed619SDag-Erling Smørgrav /*************************************************************************** 8232f3ed619SDag-Erling Smørgrav * Boilerplate 8242f3ed619SDag-Erling Smørgrav */ 8252f3ed619SDag-Erling Smørgrav 8262f3ed619SDag-Erling Smørgrav const struct t_test *t_plan[] = { 8272f3ed619SDag-Erling Smørgrav T(empty_input), 8282f3ed619SDag-Erling Smørgrav T(empty_line), 8292f3ed619SDag-Erling Smørgrav T(single_whitespace), 8302f3ed619SDag-Erling Smørgrav T(multiple_whitespace), 8312f3ed619SDag-Erling Smørgrav T(comment), 8322f3ed619SDag-Erling Smørgrav T(whitespace_before_comment), 8332f3ed619SDag-Erling Smørgrav 8342f3ed619SDag-Erling Smørgrav T(single_word), 8352f3ed619SDag-Erling Smørgrav T(single_whitespace_before_word), 8362f3ed619SDag-Erling Smørgrav T(double_whitespace_before_word), 8372f3ed619SDag-Erling Smørgrav T(single_whitespace_after_word), 8382f3ed619SDag-Erling Smørgrav T(double_whitespace_after_word), 8392f3ed619SDag-Erling Smørgrav T(comment_after_word), 8402f3ed619SDag-Erling Smørgrav T(word_containing_hash), 8412f3ed619SDag-Erling Smørgrav T(two_words), 8422f3ed619SDag-Erling Smørgrav 8432f3ed619SDag-Erling Smørgrav T(naked_escape), 8442f3ed619SDag-Erling Smørgrav T(escaped_escape), 8452f3ed619SDag-Erling Smørgrav T(escaped_whitespace), 8462f3ed619SDag-Erling Smørgrav T(escaped_newline_before_word), 8472f3ed619SDag-Erling Smørgrav T(escaped_newline_within_word), 8482f3ed619SDag-Erling Smørgrav T(escaped_newline_after_word), 8492f3ed619SDag-Erling Smørgrav T(escaped_letter), 8502f3ed619SDag-Erling Smørgrav 8512f3ed619SDag-Erling Smørgrav T(naked_single_quote), 8522f3ed619SDag-Erling Smørgrav T(naked_double_quote), 8532f3ed619SDag-Erling Smørgrav T(empty_single_quotes), 8542f3ed619SDag-Erling Smørgrav T(empty_double_quotes), 8552f3ed619SDag-Erling Smørgrav T(single_quotes_within_double_quotes), 8562f3ed619SDag-Erling Smørgrav T(double_quotes_within_single_quotes), 8572f3ed619SDag-Erling Smørgrav T(single_quoted_whitespace), 8582f3ed619SDag-Erling Smørgrav T(double_quoted_whitespace), 8592f3ed619SDag-Erling Smørgrav T(single_quoted_words), 8602f3ed619SDag-Erling Smørgrav T(double_quoted_words), 8612f3ed619SDag-Erling Smørgrav 862*ce77a8d6SDag-Erling Smørgrav T(single_quote_before_word), 863*ce77a8d6SDag-Erling Smørgrav T(double_quote_before_word), 864*ce77a8d6SDag-Erling Smørgrav T(single_quote_within_word), 865*ce77a8d6SDag-Erling Smørgrav T(double_quote_within_word), 866*ce77a8d6SDag-Erling Smørgrav T(single_quote_after_word), 867*ce77a8d6SDag-Erling Smørgrav T(double_quote_after_word), 868*ce77a8d6SDag-Erling Smørgrav 8692f3ed619SDag-Erling Smørgrav T(escaped_single_quote), 8702f3ed619SDag-Erling Smørgrav T(escaped_double_quote), 8712f3ed619SDag-Erling Smørgrav T(escaped_whitespace_within_single_quotes), 8722f3ed619SDag-Erling Smørgrav T(escaped_whitespace_within_double_quotes), 8732f3ed619SDag-Erling Smørgrav T(escaped_letter_within_single_quotes), 8742f3ed619SDag-Erling Smørgrav T(escaped_letter_within_double_quotes), 8752f3ed619SDag-Erling Smørgrav T(escaped_escape_within_single_quotes), 8762f3ed619SDag-Erling Smørgrav T(escaped_escape_within_double_quotes), 8772f3ed619SDag-Erling Smørgrav T(escaped_single_quote_within_single_quotes), 8782f3ed619SDag-Erling Smørgrav T(escaped_double_quote_within_single_quotes), 8792f3ed619SDag-Erling Smørgrav T(escaped_single_quote_within_double_quotes), 8802f3ed619SDag-Erling Smørgrav T(escaped_double_quote_within_double_quotes), 8812f3ed619SDag-Erling Smørgrav 8822f3ed619SDag-Erling Smørgrav NULL 8832f3ed619SDag-Erling Smørgrav }; 8842f3ed619SDag-Erling Smørgrav 8852f3ed619SDag-Erling Smørgrav const struct t_test ** 8862f3ed619SDag-Erling Smørgrav t_prepare(int argc, char *argv[]) 8872f3ed619SDag-Erling Smørgrav { 8882f3ed619SDag-Erling Smørgrav 8892f3ed619SDag-Erling Smørgrav (void)argc; 8902f3ed619SDag-Erling Smørgrav (void)argv; 8912f3ed619SDag-Erling Smørgrav return (t_plan); 8922f3ed619SDag-Erling Smørgrav } 8932f3ed619SDag-Erling Smørgrav 8942f3ed619SDag-Erling Smørgrav void 8952f3ed619SDag-Erling Smørgrav t_cleanup(void) 8962f3ed619SDag-Erling Smørgrav { 8972f3ed619SDag-Erling Smørgrav } 898