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