Home | History | Annotate | Line # | Download | only in stdio
t_fmemopen.c revision 1.5
      1  1.5  christos /* $NetBSD: t_fmemopen.c,v 1.5 2021/07/10 07:50:33 christos Exp $ */
      2  1.1   tnozaki 
      3  1.1   tnozaki /*-
      4  1.1   tnozaki  * Copyright (c)2010 Takehiko NOZAKI,
      5  1.1   tnozaki  * All rights reserved.
      6  1.1   tnozaki  *
      7  1.1   tnozaki  * Redistribution and use in source and binary forms, with or without
      8  1.1   tnozaki  * modification, are permitted provided that the following conditions
      9  1.1   tnozaki  * are met:
     10  1.1   tnozaki  * 1. Redistributions of source code must retain the above copyright
     11  1.1   tnozaki  *    notice, this list of conditions and the following disclaimer.
     12  1.1   tnozaki  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1   tnozaki  *    notice, this list of conditions and the following disclaimer in the
     14  1.1   tnozaki  *    documentation and/or other materials provided with the distribution.
     15  1.1   tnozaki  *
     16  1.1   tnozaki  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17  1.1   tnozaki  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  1.1   tnozaki  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  1.1   tnozaki  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20  1.1   tnozaki  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  1.1   tnozaki  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  1.1   tnozaki  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  1.1   tnozaki  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  1.1   tnozaki  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.1   tnozaki  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.1   tnozaki  * SUCH DAMAGE.
     27  1.1   tnozaki  *
     28  1.1   tnozaki  */
     29  1.1   tnozaki 
     30  1.1   tnozaki #if defined(__NetBSD__)
     31  1.1   tnozaki #include <atf-c.h>
     32  1.1   tnozaki #else
     33  1.1   tnozaki #if defined(__linux__)
     34  1.1   tnozaki #define _GNU_SOURCE
     35  1.1   tnozaki #include <features.h>
     36  1.1   tnozaki #endif
     37  1.1   tnozaki #include <assert.h>
     38  1.1   tnozaki #include <stdio.h>
     39  1.1   tnozaki #define ATF_TC(arg0)		static void arg0##_head(void)
     40  1.1   tnozaki #define ATF_TC_HEAD(arg0, arg1)	static void arg0##_head()
     41  1.1   tnozaki #define atf_tc_set_md_var(arg0, arg1, ...) do {	\
     42  1.1   tnozaki 	printf(__VA_ARGS__);			\
     43  1.1   tnozaki 	puts("");				\
     44  1.1   tnozaki } while (/*CONSTCOND*/0)
     45  1.1   tnozaki #define ATF_TC_BODY(arg0, arg1)	static void arg0##_body()
     46  1.1   tnozaki #define ATF_CHECK(arg0)		assert(arg0)
     47  1.1   tnozaki #define ATF_TP_ADD_TCS(arg0)	int main(void)
     48  1.1   tnozaki #define ATF_TP_ADD_TC(arg0, arg1) arg1##_head(); arg1##_body()
     49  1.1   tnozaki #define atf_no_error()		0
     50  1.1   tnozaki #endif
     51  1.1   tnozaki 
     52  1.1   tnozaki #include <errno.h>
     53  1.3  dholland #include <stdint.h>
     54  1.1   tnozaki #include <stdio.h>
     55  1.1   tnozaki #include <limits.h>
     56  1.1   tnozaki #include <stdlib.h>
     57  1.1   tnozaki #include <string.h>
     58  1.1   tnozaki 
     59  1.1   tnozaki const char *mode_rwa[] = {
     60  1.1   tnozaki     "r", "rb", "r+", "rb+", "r+b",
     61  1.1   tnozaki     "w", "wb", "w+", "wb+", "w+b",
     62  1.1   tnozaki     "a", "ab", "a+", "ab+", "a+b",
     63  1.1   tnozaki     NULL
     64  1.1   tnozaki };
     65  1.1   tnozaki 
     66  1.1   tnozaki const char *mode_r[] = { "r", "rb", "r+", "rb+", "r+b", NULL };
     67  1.1   tnozaki const char *mode_w[] = { "w", "wb", "w+", "wb+", "w+b", NULL };
     68  1.1   tnozaki const char *mode_a[] = { "a", "ab", "a+", "ab+", "a+b", NULL };
     69  1.1   tnozaki 
     70  1.1   tnozaki struct testcase {
     71  1.1   tnozaki 	const char *s;
     72  1.2  christos 	off_t n;
     73  1.1   tnozaki } testcases[] = {
     74  1.1   tnozaki #define TESTSTR(s)	{ s, sizeof(s)-1 }
     75  1.1   tnozaki 	TESTSTR("\0he quick brown fox jumps over the lazy dog"),
     76  1.1   tnozaki 	TESTSTR("T\0e quick brown fox jumps over the lazy dog"),
     77  1.1   tnozaki 	TESTSTR("Th\0 quick brown fox jumps over the lazy dog"),
     78  1.1   tnozaki 	TESTSTR("The\0quick brown fox jumps over the lazy dog"),
     79  1.1   tnozaki 	TESTSTR("The \0uick brown fox jumps over the lazy dog"),
     80  1.1   tnozaki 	TESTSTR("The q\0ick brown fox jumps over the lazy dog"),
     81  1.1   tnozaki 	TESTSTR("The qu\0ck brown fox jumps over the lazy dog"),
     82  1.1   tnozaki 	TESTSTR("The qui\0k brown fox jumps over the lazy dog"),
     83  1.1   tnozaki 	TESTSTR("The quic\0 brown fox jumps over the lazy dog"),
     84  1.1   tnozaki 	TESTSTR("The quick\0brown fox jumps over the lazy dog"),
     85  1.1   tnozaki 	TESTSTR("The quick \0rown fox jumps over the lazy dog"),
     86  1.1   tnozaki 	TESTSTR("The quick b\0own fox jumps over the lazy dog"),
     87  1.1   tnozaki 	TESTSTR("The quick br\0wn fox jumps over the lazy dog"),
     88  1.1   tnozaki 	TESTSTR("The quick bro\0n fox jumps over the lazy dog"),
     89  1.1   tnozaki 	TESTSTR("The quick brow\0 fox jumps over the lazy dog"),
     90  1.1   tnozaki 	TESTSTR("The quick brown\0fox jumps over the lazy dog"),
     91  1.1   tnozaki 	TESTSTR("The quick brown \0ox jumps over the lazy dog"),
     92  1.1   tnozaki 	TESTSTR("The quick brown f\0x jumps over the lazy dog"),
     93  1.1   tnozaki 	TESTSTR("The quick brown fo\0 jumps over the lazy dog"),
     94  1.1   tnozaki 	TESTSTR("The quick brown fox\0jumps over the lazy dog"),
     95  1.1   tnozaki 	TESTSTR("The quick brown fox \0umps over the lazy dog"),
     96  1.1   tnozaki 	TESTSTR("The quick brown fox j\0mps over the lazy dog"),
     97  1.1   tnozaki 	TESTSTR("The quick brown fox ju\0ps over the lazy dog"),
     98  1.1   tnozaki 	TESTSTR("The quick brown fox jum\0s over the lazy dog"),
     99  1.1   tnozaki 	TESTSTR("The quick brown fox jump\0 over the lazy dog"),
    100  1.1   tnozaki 	TESTSTR("The quick brown fox jumps\0over the lazy dog"),
    101  1.1   tnozaki 	TESTSTR("The quick brown fox jumps \0ver the lazy dog"),
    102  1.1   tnozaki 	TESTSTR("The quick brown fox jumps o\0er the lazy dog"),
    103  1.1   tnozaki 	TESTSTR("The quick brown fox jumps ov\0r the lazy dog"),
    104  1.1   tnozaki 	TESTSTR("The quick brown fox jumps ove\0 the lazy dog"),
    105  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over\0the lazy dog"),
    106  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over \0he lazy dog"),
    107  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over t\0e lazy dog"),
    108  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over th\0 lazy dog"),
    109  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the\0lazy dog"),
    110  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the \0azy dog"),
    111  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the l\0zy dog"),
    112  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the la\0y dog"),
    113  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the laz\0 dog"),
    114  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the lazy\0dog"),
    115  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the lazy \0og"),
    116  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the lazy d\0g"),
    117  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the lazy do\0"),
    118  1.1   tnozaki 	TESTSTR("The quick brown fox jumps over the lazy dog"),
    119  1.1   tnozaki 	{ NULL, 0 },
    120  1.1   tnozaki };
    121  1.1   tnozaki 
    122  1.1   tnozaki ATF_TC(test00);
    123  1.1   tnozaki ATF_TC_HEAD(test00, tc)
    124  1.1   tnozaki {
    125  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test00");
    126  1.1   tnozaki }
    127  1.1   tnozaki ATF_TC_BODY(test00, tc)
    128  1.1   tnozaki {
    129  1.1   tnozaki 	const char **p;
    130  1.1   tnozaki 	char buf[BUFSIZ];
    131  1.1   tnozaki 	FILE *fp;
    132  1.1   tnozaki 
    133  1.1   tnozaki 	for (p = &mode_rwa[0]; *p != NULL; ++p) {
    134  1.1   tnozaki 		fp = fmemopen(&buf[0], sizeof(buf), *p);
    135  1.1   tnozaki /*
    136  1.1   tnozaki  * Upon successful completion, fmemopen() shall return a pointer to the
    137  1.1   tnozaki  * object controlling the stream.
    138  1.1   tnozaki  */
    139  1.1   tnozaki 		ATF_CHECK(fp != NULL);
    140  1.1   tnozaki 
    141  1.1   tnozaki 		ATF_CHECK(fclose(fp) == 0);
    142  1.1   tnozaki 	}
    143  1.1   tnozaki }
    144  1.1   tnozaki 
    145  1.1   tnozaki ATF_TC(test01);
    146  1.1   tnozaki ATF_TC_HEAD(test01, tc)
    147  1.1   tnozaki {
    148  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test01");
    149  1.1   tnozaki }
    150  1.1   tnozaki ATF_TC_BODY(test01, tc)
    151  1.1   tnozaki {
    152  1.1   tnozaki 	const char **p;
    153  1.1   tnozaki 	const char *mode[] = {
    154  1.1   tnozaki 	    "r+", "rb+", "r+b",
    155  1.1   tnozaki 	    "w+", "wb+", "w+b",
    156  1.1   tnozaki 	    "a+", "ab+", "a+b",
    157  1.1   tnozaki 	    NULL
    158  1.1   tnozaki 	};
    159  1.1   tnozaki 	FILE *fp;
    160  1.1   tnozaki 
    161  1.1   tnozaki 	for (p = &mode[0]; *p != NULL; ++p) {
    162  1.1   tnozaki /*
    163  1.1   tnozaki  * If a null pointer is specified as the buf argument, fmemopen() shall
    164  1.1   tnozaki  * allocate size bytes of memory as if by a call to malloc().
    165  1.1   tnozaki  */
    166  1.1   tnozaki 		fp = fmemopen(NULL, BUFSIZ, *p);
    167  1.1   tnozaki 		ATF_CHECK(fp != NULL);
    168  1.1   tnozaki 
    169  1.1   tnozaki /*
    170  1.1   tnozaki  * If buf is a null pointer, the initial position shall always be set
    171  1.1   tnozaki  * to the beginning of the buffer.
    172  1.1   tnozaki  */
    173  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)0);
    174  1.1   tnozaki 
    175  1.1   tnozaki 		ATF_CHECK(fclose(fp) == 0);
    176  1.1   tnozaki 	}
    177  1.1   tnozaki }
    178  1.1   tnozaki 
    179  1.1   tnozaki ATF_TC(test02);
    180  1.1   tnozaki ATF_TC_HEAD(test02, tc)
    181  1.1   tnozaki {
    182  1.1   tnozaki         atf_tc_set_md_var(tc, "descr", "test02");
    183  1.1   tnozaki }
    184  1.1   tnozaki ATF_TC_BODY(test02, tc)
    185  1.1   tnozaki {
    186  1.1   tnozaki 	const char **p;
    187  1.1   tnozaki 	char buf[BUFSIZ];
    188  1.1   tnozaki 	FILE *fp;
    189  1.1   tnozaki 
    190  1.1   tnozaki 	for (p = &mode_r[0]; *p != NULL; ++p) {
    191  1.1   tnozaki 
    192  1.1   tnozaki 		memset(&buf[0], 0x1, sizeof(buf));
    193  1.1   tnozaki 		fp = fmemopen(&buf[0], sizeof(buf), *p);
    194  1.1   tnozaki 		ATF_CHECK(fp != NULL);
    195  1.1   tnozaki 
    196  1.1   tnozaki /*
    197  1.1   tnozaki  * This position is initially set to either the beginning of the buffer
    198  1.1   tnozaki  * (for r and w modes)
    199  1.1   tnozaki  */
    200  1.1   tnozaki 		ATF_CHECK((unsigned char)buf[0] == 0x1);
    201  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)0);
    202  1.1   tnozaki 
    203  1.1   tnozaki /*
    204  1.1   tnozaki  * The stream also maintains the size of the current buffer contents.
    205  1.1   tnozaki  * For modes r and r+ the size is set to the value given by the size argument.
    206  1.1   tnozaki  */
    207  1.1   tnozaki #if !defined(__GLIBC__)
    208  1.1   tnozaki 		ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
    209  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
    210  1.1   tnozaki #endif
    211  1.1   tnozaki 		ATF_CHECK(fclose(fp) == 0);
    212  1.1   tnozaki 	}
    213  1.1   tnozaki }
    214  1.1   tnozaki 
    215  1.1   tnozaki ATF_TC(test03);
    216  1.1   tnozaki ATF_TC_HEAD(test03, tc)
    217  1.1   tnozaki {
    218  1.1   tnozaki         atf_tc_set_md_var(tc, "descr", "test03");
    219  1.1   tnozaki }
    220  1.1   tnozaki ATF_TC_BODY(test03, tc)
    221  1.1   tnozaki {
    222  1.1   tnozaki 	const char **p;
    223  1.1   tnozaki 	char buf[BUFSIZ];
    224  1.1   tnozaki 	FILE *fp;
    225  1.1   tnozaki 
    226  1.1   tnozaki 	for (p = &mode_w[0]; *p != NULL; ++p) {
    227  1.1   tnozaki 
    228  1.1   tnozaki 		memset(&buf[0], 0x1, sizeof(buf));
    229  1.1   tnozaki 		fp = fmemopen(&buf[0], sizeof(buf), *p);
    230  1.1   tnozaki 		ATF_CHECK(fp != NULL);
    231  1.1   tnozaki 
    232  1.1   tnozaki /*
    233  1.1   tnozaki  * This position is initially set to either the beginning of the buffer
    234  1.1   tnozaki  * (for r and w modes)
    235  1.1   tnozaki  */
    236  1.1   tnozaki 		ATF_CHECK(buf[0] == '\0');
    237  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)0);
    238  1.1   tnozaki 
    239  1.1   tnozaki /*
    240  1.1   tnozaki  * For modes w and w+ the initial size is zero
    241  1.1   tnozaki  */
    242  1.1   tnozaki 		ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
    243  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)0);
    244  1.1   tnozaki 
    245  1.1   tnozaki 		ATF_CHECK(fclose(fp) == 0);
    246  1.1   tnozaki 	}
    247  1.1   tnozaki }
    248  1.1   tnozaki 
    249  1.1   tnozaki ATF_TC(test04);
    250  1.1   tnozaki ATF_TC_HEAD(test04, tc)
    251  1.1   tnozaki {
    252  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test04");
    253  1.1   tnozaki }
    254  1.1   tnozaki ATF_TC_BODY(test04, tc)
    255  1.1   tnozaki {
    256  1.1   tnozaki 	const char **p;
    257  1.1   tnozaki 	char buf[BUFSIZ];
    258  1.1   tnozaki 	FILE *fp;
    259  1.1   tnozaki 
    260  1.1   tnozaki /*
    261  1.1   tnozaki  * or to the first null byte in the buffer (for a modes)
    262  1.1   tnozaki  */
    263  1.1   tnozaki 	for (p = &mode_a[0]; *p != NULL; ++p) {
    264  1.1   tnozaki 
    265  1.1   tnozaki 		memset(&buf[0], 0x1, sizeof(buf));
    266  1.1   tnozaki 		fp = fmemopen(&buf[0], sizeof(buf), *p);
    267  1.1   tnozaki 		ATF_CHECK(fp != NULL);
    268  1.1   tnozaki 
    269  1.1   tnozaki 		ATF_CHECK((unsigned char)buf[0] == 0x1);
    270  1.1   tnozaki 
    271  1.1   tnozaki /* If no null byte is found in append mode,
    272  1.1   tnozaki  * the initial position is set to one byte after the end of the buffer.
    273  1.1   tnozaki  */
    274  1.1   tnozaki #if !defined(__GLIBC__)
    275  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
    276  1.1   tnozaki #endif
    277  1.1   tnozaki 
    278  1.1   tnozaki /*
    279  1.1   tnozaki  * and for modes a and a+ the initial size is either the position of the
    280  1.1   tnozaki  * first null byte in the buffer or the value of the size argument
    281  1.1   tnozaki  * if no null byte is found.
    282  1.1   tnozaki  */
    283  1.1   tnozaki #if !defined(__GLIBC__)
    284  1.1   tnozaki 		ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
    285  1.1   tnozaki 		ATF_CHECK(ftello(fp) == (off_t)sizeof(buf));
    286  1.1   tnozaki #endif
    287  1.1   tnozaki 
    288  1.1   tnozaki 		ATF_CHECK(fclose(fp) == 0);
    289  1.1   tnozaki 	}
    290  1.1   tnozaki }
    291  1.1   tnozaki 
    292  1.1   tnozaki ATF_TC(test05);
    293  1.1   tnozaki ATF_TC_HEAD(test05, tc)
    294  1.1   tnozaki {
    295  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test05");
    296  1.1   tnozaki }
    297  1.1   tnozaki ATF_TC_BODY(test05, tc)
    298  1.1   tnozaki {
    299  1.1   tnozaki 	const char **p;
    300  1.1   tnozaki 	FILE *fp;
    301  1.1   tnozaki 	char buf[BUFSIZ];
    302  1.1   tnozaki 
    303  1.1   tnozaki 	for (p = &mode_rwa[0]; *p != NULL; ++p) {
    304  1.1   tnozaki /*
    305  1.1   tnozaki  * Otherwise, a null pointer shall be returned, and errno shall be set
    306  1.1   tnozaki  * to indicate the error.
    307  1.1   tnozaki  */
    308  1.1   tnozaki 		errno = 0;
    309  1.1   tnozaki 		fp = fmemopen(NULL, (size_t)0, *p);
    310  1.1   tnozaki 		ATF_CHECK(fp == NULL);
    311  1.1   tnozaki 		ATF_CHECK(errno == EINVAL);
    312  1.1   tnozaki 
    313  1.1   tnozaki 		errno = 0;
    314  1.1   tnozaki 		fp = fmemopen((void *)&buf[0], 0, *p);
    315  1.1   tnozaki 		ATF_CHECK(fp == NULL);
    316  1.1   tnozaki 		ATF_CHECK(errno == EINVAL);
    317  1.1   tnozaki 	}
    318  1.1   tnozaki }
    319  1.1   tnozaki 
    320  1.1   tnozaki ATF_TC(test06);
    321  1.1   tnozaki ATF_TC_HEAD(test06, tc)
    322  1.1   tnozaki {
    323  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test06");
    324  1.1   tnozaki }
    325  1.1   tnozaki ATF_TC_BODY(test06, tc)
    326  1.1   tnozaki {
    327  1.1   tnozaki 	const char **p;
    328  1.1   tnozaki 	const char *mode[] = { "", " ", "???", NULL };
    329  1.1   tnozaki 	FILE *fp;
    330  1.1   tnozaki 
    331  1.1   tnozaki 	for (p = &mode[0]; *p != NULL; ++p) {
    332  1.1   tnozaki /*
    333  1.1   tnozaki  * The value of the mode argument is not valid.
    334  1.1   tnozaki  */
    335  1.1   tnozaki 		fp = fmemopen(NULL, 1, *p);
    336  1.1   tnozaki 		ATF_CHECK(fp == NULL);
    337  1.1   tnozaki 		ATF_CHECK(errno == EINVAL);
    338  1.1   tnozaki 	}
    339  1.1   tnozaki }
    340  1.1   tnozaki 
    341  1.1   tnozaki ATF_TC(test07);
    342  1.1   tnozaki ATF_TC_HEAD(test07, tc)
    343  1.1   tnozaki {
    344  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test07");
    345  1.1   tnozaki }
    346  1.1   tnozaki ATF_TC_BODY(test07, tc)
    347  1.1   tnozaki {
    348  1.1   tnozaki #if !defined(__GLIBC__)
    349  1.1   tnozaki 	const char **p;
    350  1.1   tnozaki 	const char *mode[] = {
    351  1.1   tnozaki 	    "r", "rb",
    352  1.1   tnozaki 	    "w", "wb",
    353  1.1   tnozaki 	    "a", "ab",
    354  1.1   tnozaki 	    NULL
    355  1.1   tnozaki 	};
    356  1.1   tnozaki 	FILE *fp;
    357  1.1   tnozaki 
    358  1.1   tnozaki 	for (p = &mode[0]; *p != NULL; ++p) {
    359  1.1   tnozaki /*
    360  1.1   tnozaki  * Because this feature is only useful when the stream is opened for updating
    361  1.1   tnozaki  * (because there is no way to get a pointer to the buffer) the fmemopen()
    362  1.1   tnozaki  * call may fail if the mode argument does not include a '+' .
    363  1.1   tnozaki  */
    364  1.1   tnozaki 		errno = 0;
    365  1.1   tnozaki 		fp = fmemopen(NULL, 1, *p);
    366  1.1   tnozaki 		ATF_CHECK(fp == NULL);
    367  1.1   tnozaki 		ATF_CHECK(errno == EINVAL);
    368  1.1   tnozaki 	}
    369  1.1   tnozaki #endif
    370  1.1   tnozaki }
    371  1.1   tnozaki 
    372  1.1   tnozaki ATF_TC(test08);
    373  1.1   tnozaki ATF_TC_HEAD(test08, tc)
    374  1.1   tnozaki {
    375  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test08");
    376  1.1   tnozaki }
    377  1.1   tnozaki ATF_TC_BODY(test08, tc)
    378  1.1   tnozaki {
    379  1.1   tnozaki #if !defined(__GLIBC__)
    380  1.1   tnozaki 	const char **p;
    381  1.1   tnozaki 	const char *mode[] = {
    382  1.1   tnozaki 	    "r+", "rb+", "r+b",
    383  1.1   tnozaki 	    "w+", "wb+", "w+b",
    384  1.1   tnozaki 	    "a+", "ab+", "a+b",
    385  1.1   tnozaki 	    NULL
    386  1.1   tnozaki 	};
    387  1.1   tnozaki 	FILE *fp;
    388  1.1   tnozaki 
    389  1.1   tnozaki 	for (p = &mode[0]; *p != NULL; ++p) {
    390  1.1   tnozaki /*
    391  1.1   tnozaki  * The buf argument is a null pointer and the allocation of a buffer of
    392  1.1   tnozaki  * length size has failed.
    393  1.1   tnozaki  */
    394  1.1   tnozaki 		fp = fmemopen(NULL, SIZE_MAX, *p);
    395  1.1   tnozaki 		ATF_CHECK(fp == NULL);
    396  1.1   tnozaki 		ATF_CHECK(errno == ENOMEM);
    397  1.1   tnozaki 	}
    398  1.1   tnozaki #endif
    399  1.1   tnozaki }
    400  1.1   tnozaki 
    401  1.1   tnozaki /*
    402  1.1   tnozaki  * test09 - test14:
    403  1.1   tnozaki  * An attempt to seek a memory buffer stream to a negative position or to a
    404  1.1   tnozaki  * position larger than the buffer size given in the size argument shall fail.
    405  1.1   tnozaki  */
    406  1.1   tnozaki 
    407  1.1   tnozaki ATF_TC(test09);
    408  1.1   tnozaki ATF_TC_HEAD(test09, tc)
    409  1.1   tnozaki {
    410  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test09");
    411  1.1   tnozaki }
    412  1.1   tnozaki ATF_TC_BODY(test09, tc)
    413  1.1   tnozaki {
    414  1.1   tnozaki 	struct testcase *t;
    415  1.1   tnozaki 	const char **p;
    416  1.1   tnozaki 	char buf[BUFSIZ];
    417  1.1   tnozaki 	FILE *fp;
    418  1.1   tnozaki 	off_t i;
    419  1.1   tnozaki 
    420  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    421  1.1   tnozaki 		for (p = &mode_rwa[0]; *p != NULL; ++p) {
    422  1.1   tnozaki 
    423  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
    424  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    425  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    426  1.1   tnozaki 
    427  1.1   tnozaki /*
    428  1.1   tnozaki  * test fmemopen_seek(SEEK_SET)
    429  1.1   tnozaki  */
    430  1.1   tnozaki 			/* zero */
    431  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)0, SEEK_SET) == 0);
    432  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    433  1.1   tnozaki 
    434  1.1   tnozaki 			/* positive */
    435  1.1   tnozaki 			for (i = (off_t)1; i <= (off_t)t->n; ++i) {
    436  1.1   tnozaki 				ATF_CHECK(fseeko(fp, i, SEEK_SET) == 0);
    437  1.1   tnozaki 				ATF_CHECK(ftello(fp) == i);
    438  1.1   tnozaki 			}
    439  1.1   tnozaki 			/* positive + OOB */
    440  1.1   tnozaki 			ATF_CHECK(fseeko(fp, t->n + 1, SEEK_SET) == -1);
    441  1.1   tnozaki 			ATF_CHECK(ftello(fp) == t->n);
    442  1.1   tnozaki 
    443  1.1   tnozaki 			/* negative + OOB */
    444  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_SET) == -1);
    445  1.1   tnozaki 			ATF_CHECK(ftello(fp) == t->n);
    446  1.1   tnozaki 
    447  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    448  1.1   tnozaki 		}
    449  1.1   tnozaki 	}
    450  1.1   tnozaki }
    451  1.1   tnozaki 
    452  1.1   tnozaki const char *mode_rw[] = {
    453  1.1   tnozaki     "r", "rb", "r+", "rb+", "r+b",
    454  1.1   tnozaki     "w", "wb", "w+", "wb+", "w+b",
    455  1.1   tnozaki     NULL
    456  1.1   tnozaki };
    457  1.1   tnozaki 
    458  1.1   tnozaki ATF_TC(test10);
    459  1.1   tnozaki ATF_TC_HEAD(test10, tc)
    460  1.1   tnozaki {
    461  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test10");
    462  1.1   tnozaki }
    463  1.1   tnozaki ATF_TC_BODY(test10, tc)
    464  1.1   tnozaki {
    465  1.1   tnozaki 	struct testcase *t;
    466  1.4  christos 	off_t i;
    467  1.1   tnozaki 	const char **p;
    468  1.1   tnozaki 	char buf[BUFSIZ];
    469  1.1   tnozaki 	FILE *fp;
    470  1.1   tnozaki 
    471  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    472  1.1   tnozaki 		for (p = &mode_rw[0]; *p != NULL; ++p) {
    473  1.1   tnozaki 
    474  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
    475  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    476  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    477  1.1   tnozaki 
    478  1.1   tnozaki /*
    479  1.1   tnozaki  * test fmemopen_seek(SEEK_CUR)
    480  1.1   tnozaki  */
    481  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    482  1.1   tnozaki 
    483  1.1   tnozaki 			/* zero */
    484  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)0, SEEK_CUR) == 0);
    485  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    486  1.1   tnozaki 
    487  1.1   tnozaki 			/* negative & OOB */
    488  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == -1);
    489  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    490  1.1   tnozaki 
    491  1.1   tnozaki 			/* positive */
    492  1.1   tnozaki 			for (i = 0; i < (off_t)t->n; ++i) {
    493  1.1   tnozaki 				ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == 0);
    494  1.1   tnozaki 				ATF_CHECK(ftello(fp) == i + 1);
    495  1.1   tnozaki 			}
    496  1.1   tnozaki 
    497  1.1   tnozaki 			/* positive & OOB */
    498  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == -1);
    499  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
    500  1.1   tnozaki 
    501  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    502  1.1   tnozaki 		}
    503  1.1   tnozaki 	}
    504  1.1   tnozaki }
    505  1.1   tnozaki 
    506  1.1   tnozaki ATF_TC(test11);
    507  1.1   tnozaki ATF_TC_HEAD(test11, tc)
    508  1.1   tnozaki {
    509  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test11");
    510  1.1   tnozaki }
    511  1.1   tnozaki ATF_TC_BODY(test11, tc)
    512  1.1   tnozaki {
    513  1.1   tnozaki 	struct testcase *t;
    514  1.1   tnozaki 	off_t len, rest, i;
    515  1.1   tnozaki 	const char **p;
    516  1.1   tnozaki 	char buf[BUFSIZ];
    517  1.1   tnozaki 	FILE *fp;
    518  1.1   tnozaki 
    519  1.1   tnozaki 	/* test fmemopen_seek(SEEK_CUR) */
    520  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    521  1.1   tnozaki 		len = (off_t)strnlen(t->s, t->n);
    522  1.1   tnozaki 		rest = (off_t)t->n - len;
    523  1.1   tnozaki 		for (p = &mode_a[0]; *p != NULL; ++p) {
    524  1.1   tnozaki 
    525  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
    526  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    527  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    528  1.1   tnozaki /*
    529  1.1   tnozaki  * test fmemopen_seek(SEEK_CUR)
    530  1.1   tnozaki  */
    531  1.1   tnozaki #if defined(__GLIBC__)
    532  1.1   tnozaki 			if (i < (off_t)t->n) {
    533  1.1   tnozaki #endif
    534  1.1   tnozaki 			/* zero */
    535  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)0, SEEK_CUR) == 0);
    536  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    537  1.1   tnozaki 
    538  1.1   tnozaki 			/* posive */
    539  1.1   tnozaki 			for (i = (off_t)1; i <= rest; ++i) {
    540  1.1   tnozaki 				ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == 0);
    541  1.1   tnozaki 				ATF_CHECK(ftello(fp) == len + i);
    542  1.1   tnozaki 			}
    543  1.1   tnozaki 
    544  1.1   tnozaki 			/* positive + OOB */
    545  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)1, SEEK_CUR) == -1);
    546  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
    547  1.1   tnozaki 
    548  1.1   tnozaki 			/* negative */
    549  1.1   tnozaki 			for (i = (off_t)1; i <= (off_t)t->n; ++i) {
    550  1.1   tnozaki 				ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == 0);
    551  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)t->n - i);
    552  1.1   tnozaki 			}
    553  1.1   tnozaki 
    554  1.1   tnozaki 			/* negative + OOB */
    555  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)-1, SEEK_CUR) == -1);
    556  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    557  1.1   tnozaki 
    558  1.1   tnozaki #if defined(__GLIBC__)
    559  1.1   tnozaki 			}
    560  1.1   tnozaki #endif
    561  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    562  1.1   tnozaki 		}
    563  1.1   tnozaki 	}
    564  1.1   tnozaki }
    565  1.1   tnozaki 
    566  1.1   tnozaki ATF_TC(test12);
    567  1.1   tnozaki ATF_TC_HEAD(test12, tc)
    568  1.1   tnozaki {
    569  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test12");
    570  1.1   tnozaki }
    571  1.1   tnozaki ATF_TC_BODY(test12, tc)
    572  1.1   tnozaki {
    573  1.1   tnozaki 	struct testcase *t;
    574  1.1   tnozaki 	off_t len, rest, i;
    575  1.1   tnozaki 	const char **p;
    576  1.1   tnozaki 	char buf[BUFSIZ];
    577  1.1   tnozaki 	FILE *fp;
    578  1.1   tnozaki 
    579  1.1   tnozaki 	/* test fmemopen_seek(SEEK_END) */
    580  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    581  1.1   tnozaki 		len = (off_t)strnlen(t->s, t->n);
    582  1.1   tnozaki 		rest = t->n - len;
    583  1.1   tnozaki 		for (p = &mode_r[0]; *p != NULL; ++p) {
    584  1.1   tnozaki 
    585  1.1   tnozaki 			memcpy(buf, t->s, t->n);
    586  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    587  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    588  1.1   tnozaki 
    589  1.1   tnozaki /*
    590  1.1   tnozaki  * test fmemopen_seek(SEEK_END)
    591  1.1   tnozaki  */
    592  1.1   tnozaki #if !defined(__GLIBC__)
    593  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    594  1.1   tnozaki 
    595  1.1   tnozaki 			/* zero */
    596  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
    597  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    598  1.1   tnozaki 
    599  1.1   tnozaki 			/* positive + OOB */
    600  1.1   tnozaki 			ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
    601  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    602  1.1   tnozaki 
    603  1.1   tnozaki 			/* negative + OOB */
    604  1.1   tnozaki 			ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
    605  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    606  1.1   tnozaki 
    607  1.1   tnozaki 			/* positive */
    608  1.1   tnozaki 			for (i = 1; i <= rest; ++i) {
    609  1.1   tnozaki 				ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
    610  1.1   tnozaki 				ATF_CHECK(ftello(fp) == len + i);
    611  1.1   tnozaki 			}
    612  1.1   tnozaki 
    613  1.1   tnozaki 			/* negative */
    614  1.1   tnozaki 			for (i = 1; i < len; ++i) {
    615  1.1   tnozaki 				ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
    616  1.1   tnozaki 				ATF_CHECK(ftello(fp) == len - i);
    617  1.1   tnozaki 			}
    618  1.1   tnozaki #endif
    619  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    620  1.1   tnozaki 		}
    621  1.1   tnozaki 	}
    622  1.1   tnozaki }
    623  1.1   tnozaki 
    624  1.1   tnozaki ATF_TC(test13);
    625  1.1   tnozaki ATF_TC_HEAD(test13, tc)
    626  1.1   tnozaki {
    627  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test13");
    628  1.1   tnozaki }
    629  1.1   tnozaki ATF_TC_BODY(test13, tc)
    630  1.1   tnozaki {
    631  1.1   tnozaki 	struct testcase *t;
    632  1.4  christos 	off_t i;
    633  1.1   tnozaki 	const char **p;
    634  1.1   tnozaki 	char buf[BUFSIZ];
    635  1.1   tnozaki 	FILE *fp;
    636  1.1   tnozaki 
    637  1.1   tnozaki 	/* test fmemopen_seek(SEEK_END) */
    638  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    639  1.1   tnozaki 		for (p = &mode_w[0]; *p != NULL; ++p) {
    640  1.1   tnozaki 
    641  1.1   tnozaki 			memcpy(buf, t->s, t->n);
    642  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    643  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    644  1.1   tnozaki /*
    645  1.1   tnozaki  * test fmemopen_seek(SEEK_END)
    646  1.1   tnozaki  */
    647  1.1   tnozaki #if !defined(__GLIBC__)
    648  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    649  1.1   tnozaki 			ATF_CHECK(buf[0] == '\0');
    650  1.1   tnozaki 
    651  1.1   tnozaki 			/* zero */
    652  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)0, SEEK_END) == 0);
    653  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    654  1.1   tnozaki 
    655  1.1   tnozaki 			/* positive + OOB */
    656  1.1   tnozaki 			ATF_CHECK(fseeko(fp, (off_t)t->n + 1, SEEK_END) == -1);
    657  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    658  1.1   tnozaki 
    659  1.1   tnozaki 			/* negative + OOB */
    660  1.1   tnozaki 			ATF_CHECK(fseeko(fp, -1, SEEK_END) == -1);
    661  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    662  1.1   tnozaki 
    663  1.1   tnozaki 			/* positive */
    664  1.1   tnozaki 			for (i = 1; i <= t->n; ++i) {
    665  1.1   tnozaki 				ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
    666  1.1   tnozaki 				ATF_CHECK(ftello(fp) == i);
    667  1.1   tnozaki 			}
    668  1.1   tnozaki #endif
    669  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    670  1.1   tnozaki 		}
    671  1.1   tnozaki 	}
    672  1.1   tnozaki }
    673  1.1   tnozaki 
    674  1.1   tnozaki ATF_TC(test14);
    675  1.1   tnozaki ATF_TC_HEAD(test14, tc)
    676  1.1   tnozaki {
    677  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test14");
    678  1.1   tnozaki }
    679  1.1   tnozaki ATF_TC_BODY(test14, tc)
    680  1.1   tnozaki {
    681  1.1   tnozaki 	struct testcase *t;
    682  1.1   tnozaki 	off_t len, rest, i;
    683  1.1   tnozaki 	const char **p;
    684  1.1   tnozaki 	char buf[BUFSIZ];
    685  1.1   tnozaki 	FILE *fp;
    686  1.1   tnozaki 
    687  1.1   tnozaki 	/* test fmemopen_seek(SEEK_END) */
    688  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    689  1.1   tnozaki 		len = (off_t)strnlen(t->s, t->n);
    690  1.1   tnozaki 		rest = (off_t)t->n - len;
    691  1.1   tnozaki 		for (p = &mode_a[0]; *p != NULL; ++p) {
    692  1.1   tnozaki 
    693  1.1   tnozaki 			memcpy(buf, t->s, t->n);
    694  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    695  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    696  1.1   tnozaki /*
    697  1.1   tnozaki  * test fmemopen_seek(SEEK_END)
    698  1.1   tnozaki  */
    699  1.1   tnozaki #if !defined(__GLIBC__)
    700  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    701  1.1   tnozaki 
    702  1.1   tnozaki 			/* zero */
    703  1.1   tnozaki 			ATF_CHECK(fseeko(fp, 0, SEEK_END) == 0);
    704  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    705  1.1   tnozaki 
    706  1.1   tnozaki 			/* positive + OOB */
    707  1.1   tnozaki 			ATF_CHECK(fseeko(fp, rest + 1, SEEK_END) == -1);
    708  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    709  1.1   tnozaki 
    710  1.1   tnozaki 			/* negative + OOB */
    711  1.1   tnozaki 			ATF_CHECK(fseeko(fp, -(len + 1), SEEK_END) == -1);
    712  1.1   tnozaki 			ATF_CHECK(ftello(fp) == len);
    713  1.1   tnozaki 
    714  1.1   tnozaki 			/* positive */
    715  1.1   tnozaki 			for (i = 1; i <= rest; ++i) {
    716  1.1   tnozaki 				ATF_CHECK(fseeko(fp, i, SEEK_END) == 0);
    717  1.1   tnozaki 				ATF_CHECK(ftello(fp) == len + i);
    718  1.1   tnozaki 			}
    719  1.1   tnozaki 
    720  1.1   tnozaki 			/* negative */
    721  1.1   tnozaki 			for (i = 1; i < len; ++i) {
    722  1.1   tnozaki 				ATF_CHECK(fseeko(fp, -i, SEEK_END) == 0);
    723  1.1   tnozaki 				ATF_CHECK(ftello(fp) == len - i);
    724  1.1   tnozaki 			}
    725  1.1   tnozaki #endif
    726  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    727  1.1   tnozaki 		}
    728  1.1   tnozaki 	}
    729  1.1   tnozaki }
    730  1.1   tnozaki 
    731  1.1   tnozaki const char *mode_rw1[] = {
    732  1.1   tnozaki     "r", "rb", "r+", "rb+", "r+b",
    733  1.1   tnozaki     "w+", "wb+",
    734  1.1   tnozaki     NULL
    735  1.1   tnozaki };
    736  1.1   tnozaki 
    737  1.1   tnozaki /* test15 - 18:
    738  1.1   tnozaki  * When a stream open for writing is flushed or closed, a null byte is written
    739  1.1   tnozaki  * at the current position or at the end of the buffer, depending on the size
    740  1.1   tnozaki  * of the contents.
    741  1.1   tnozaki  */
    742  1.1   tnozaki 
    743  1.1   tnozaki ATF_TC(test15);
    744  1.1   tnozaki ATF_TC_HEAD(test15, tc)
    745  1.1   tnozaki {
    746  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test15");
    747  1.1   tnozaki }
    748  1.1   tnozaki ATF_TC_BODY(test15, tc)
    749  1.1   tnozaki {
    750  1.1   tnozaki 	struct testcase *t;
    751  1.1   tnozaki 	const char **p;
    752  1.2  christos 	char buf0[BUFSIZ];
    753  1.1   tnozaki 	FILE *fp;
    754  1.2  christos 	int i;
    755  1.1   tnozaki 
    756  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    757  1.1   tnozaki 		for (p = &mode_rw1[0]; *p != NULL; ++p) {
    758  1.1   tnozaki 
    759  1.1   tnozaki 			memcpy(&buf0[0], t->s, t->n);
    760  1.1   tnozaki 			fp = fmemopen(&buf0[0], t->n, *p);
    761  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    762  1.1   tnozaki /*
    763  1.1   tnozaki  * test fmemopen_read + fgetc(3)
    764  1.1   tnozaki  */
    765  1.2  christos 			for (i = 0; i < t->n; ++i) {
    766  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i);
    767  1.1   tnozaki 				ATF_CHECK(fgetc(fp) == buf0[i]);
    768  1.1   tnozaki 				ATF_CHECK(feof(fp) == 0);
    769  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i + 1);
    770  1.1   tnozaki 			}
    771  1.1   tnozaki 			ATF_CHECK(fgetc(fp) == EOF);
    772  1.1   tnozaki 			ATF_CHECK(feof(fp) != 0);
    773  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
    774  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    775  1.1   tnozaki 		}
    776  1.1   tnozaki 	}
    777  1.1   tnozaki }
    778  1.1   tnozaki 
    779  1.1   tnozaki ATF_TC(test16);
    780  1.1   tnozaki ATF_TC_HEAD(test16, tc)
    781  1.1   tnozaki {
    782  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test16");
    783  1.1   tnozaki }
    784  1.1   tnozaki ATF_TC_BODY(test16, tc)
    785  1.1   tnozaki {
    786  1.1   tnozaki 	struct testcase *t;
    787  1.1   tnozaki 	const char **p;
    788  1.1   tnozaki 	char buf0[BUFSIZ], buf1[BUFSIZ];
    789  1.1   tnozaki 	FILE *fp;
    790  1.1   tnozaki 
    791  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    792  1.1   tnozaki 		for (p = &mode_rw1[0]; *p != NULL; ++p) {
    793  1.1   tnozaki 
    794  1.1   tnozaki 			memcpy(&buf0[0], t->s, t->n);
    795  1.1   tnozaki 			buf1[t->n] = 0x1;
    796  1.1   tnozaki 			fp = fmemopen(&buf0[0], t->n, *p);
    797  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    798  1.1   tnozaki /*
    799  1.1   tnozaki  * test fmemopen_read + fread(4)
    800  1.1   tnozaki  */
    801  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    802  1.2  christos 			ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp) == (size_t)t->n);
    803  1.1   tnozaki 			ATF_CHECK(feof(fp) != 0);
    804  1.1   tnozaki 			ATF_CHECK(memcmp(&buf0[0], &buf1[0], t->n) == 0);
    805  1.1   tnozaki 			ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
    806  1.1   tnozaki 
    807  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    808  1.1   tnozaki 		}
    809  1.1   tnozaki 	}
    810  1.1   tnozaki }
    811  1.1   tnozaki 
    812  1.1   tnozaki const char *mode_a1[] = { "a+", "ab+", NULL };
    813  1.1   tnozaki 
    814  1.1   tnozaki ATF_TC(test17);
    815  1.1   tnozaki ATF_TC_HEAD(test17, tc)
    816  1.1   tnozaki {
    817  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test17");
    818  1.1   tnozaki }
    819  1.1   tnozaki ATF_TC_BODY(test17, tc)
    820  1.1   tnozaki {
    821  1.1   tnozaki 	struct testcase *t;
    822  1.2  christos 	size_t len;
    823  1.2  christos 	int i;
    824  1.1   tnozaki 	const char **p;
    825  1.1   tnozaki 	char buf[BUFSIZ];
    826  1.1   tnozaki 	FILE *fp;
    827  1.1   tnozaki 
    828  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    829  1.1   tnozaki 		len = strnlen(t->s, t->n);
    830  1.1   tnozaki 		for (p = &mode_a1[0]; *p != NULL; ++p) {
    831  1.1   tnozaki 
    832  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
    833  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
    834  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    835  1.1   tnozaki /*
    836  1.1   tnozaki  * test fmemopen_read + fgetc(3)
    837  1.1   tnozaki  */
    838  1.1   tnozaki #if defined(__GLIBC__)
    839  1.1   tnozaki 			if (i < t->n) {
    840  1.1   tnozaki #endif
    841  1.1   tnozaki 			for (i = len; i < t->n; ++i) {
    842  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i);
    843  1.1   tnozaki 				ATF_CHECK(fgetc(fp) == buf[i]);
    844  1.1   tnozaki 				ATF_CHECK(feof(fp) == 0);
    845  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i + 1);
    846  1.1   tnozaki 			}
    847  1.1   tnozaki 			ATF_CHECK(fgetc(fp) == EOF);
    848  1.1   tnozaki 			ATF_CHECK(feof(fp) != 0);
    849  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
    850  1.1   tnozaki 			rewind(fp);
    851  1.2  christos 			for (i = 0; i < t->n; ++i) {
    852  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i);
    853  1.1   tnozaki 				ATF_CHECK(fgetc(fp) == buf[i]);
    854  1.1   tnozaki 				ATF_CHECK(feof(fp) == 0);
    855  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i + 1);
    856  1.1   tnozaki 			}
    857  1.1   tnozaki 			ATF_CHECK(fgetc(fp) == EOF);
    858  1.1   tnozaki 			ATF_CHECK(feof(fp) != 0);
    859  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
    860  1.1   tnozaki #if defined(__GLIBC__)
    861  1.1   tnozaki 			}
    862  1.1   tnozaki #endif
    863  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    864  1.1   tnozaki 		}
    865  1.1   tnozaki 	}
    866  1.1   tnozaki }
    867  1.1   tnozaki 
    868  1.1   tnozaki ATF_TC(test18);
    869  1.1   tnozaki ATF_TC_HEAD(test18, tc)
    870  1.1   tnozaki {
    871  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test18");
    872  1.1   tnozaki }
    873  1.1   tnozaki ATF_TC_BODY(test18, tc)
    874  1.1   tnozaki {
    875  1.1   tnozaki 	struct testcase *t;
    876  1.2  christos 	size_t len;
    877  1.1   tnozaki 	const char **p;
    878  1.1   tnozaki 	char buf0[BUFSIZ], buf1[BUFSIZ];
    879  1.1   tnozaki 	FILE *fp;
    880  1.1   tnozaki 
    881  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    882  1.1   tnozaki 		len = strnlen(t->s, t->n);
    883  1.1   tnozaki 		for (p = &mode_a1[0]; *p != NULL; ++p) {
    884  1.1   tnozaki 
    885  1.1   tnozaki 			memcpy(&buf0[0], t->s, t->n);
    886  1.1   tnozaki 			buf1[t->n - len] = 0x1;
    887  1.1   tnozaki 			fp = fmemopen(&buf0[0], t->n, *p);
    888  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    889  1.1   tnozaki /*
    890  1.1   tnozaki  * test fmemopen_read + fread(3)
    891  1.1   tnozaki  */
    892  1.1   tnozaki #if defined(__GLIBC__)
    893  1.1   tnozaki 			if (i < t->n) {
    894  1.1   tnozaki #endif
    895  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)len);
    896  1.1   tnozaki 			ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
    897  1.1   tnozaki 			    == t->n - len);
    898  1.1   tnozaki 			ATF_CHECK(feof(fp) != 0);
    899  1.1   tnozaki 			ATF_CHECK(!memcmp(&buf0[len], &buf1[0], t->n - len));
    900  1.1   tnozaki 			ATF_CHECK((unsigned char)buf1[t->n - len] == 0x1);
    901  1.1   tnozaki 			rewind(fp);
    902  1.1   tnozaki 			buf1[t->n] = 0x1;
    903  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)0);
    904  1.1   tnozaki 			ATF_CHECK(fread(&buf1[0], 1, sizeof(buf1), fp)
    905  1.2  christos 			    == (size_t)t->n);
    906  1.1   tnozaki 			ATF_CHECK(feof(fp) != 0);
    907  1.1   tnozaki 			ATF_CHECK(!memcmp(&buf0[0], &buf1[0], t->n));
    908  1.1   tnozaki 			ATF_CHECK((unsigned char)buf1[t->n] == 0x1);
    909  1.1   tnozaki #if defined(__GLIBC__)
    910  1.1   tnozaki 			}
    911  1.1   tnozaki #endif
    912  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    913  1.1   tnozaki 		}
    914  1.1   tnozaki 	}
    915  1.1   tnozaki }
    916  1.1   tnozaki 
    917  1.1   tnozaki /*
    918  1.1   tnozaki  * test19 - test22:
    919  1.1   tnozaki  * If a stream open for update is flushed or closed and the last write has
    920  1.1   tnozaki  * advanced the current buffer size, a null byte is written at the end of the
    921  1.1   tnozaki  * buffer if it fits.
    922  1.1   tnozaki  */
    923  1.1   tnozaki 
    924  1.1   tnozaki const char *mode_rw2[] = {
    925  1.1   tnozaki     "r+", "rb+", "r+b",
    926  1.1   tnozaki     "w", "wb", "w+", "wb+", "w+b",
    927  1.1   tnozaki     NULL
    928  1.1   tnozaki };
    929  1.1   tnozaki 
    930  1.1   tnozaki ATF_TC(test19);
    931  1.1   tnozaki ATF_TC_HEAD(test19, tc)
    932  1.1   tnozaki {
    933  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test19");
    934  1.1   tnozaki }
    935  1.1   tnozaki ATF_TC_BODY(test19, tc)
    936  1.1   tnozaki {
    937  1.1   tnozaki 	struct testcase *t;
    938  1.2  christos 	int i;
    939  1.1   tnozaki 	const char **p;
    940  1.1   tnozaki 	char buf[BUFSIZ];
    941  1.1   tnozaki 	FILE *fp;
    942  1.1   tnozaki 
    943  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
    944  1.1   tnozaki 		for (p = &mode_rw2[0]; *p != NULL; ++p) {
    945  1.1   tnozaki 
    946  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
    947  1.1   tnozaki 			buf[t->n] = 0x1;
    948  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n + 1, *p);
    949  1.1   tnozaki 			ATF_CHECK(fp != NULL);
    950  1.1   tnozaki 			setbuf(fp, NULL);
    951  1.1   tnozaki /*
    952  1.1   tnozaki  * test fmemopen_write + fputc(3)
    953  1.1   tnozaki  */
    954  1.2  christos 			for (i = 0; i < t->n; ++i) {
    955  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i);
    956  1.1   tnozaki 				ATF_CHECK(fputc(t->s[i], fp) == t->s[i]);
    957  1.1   tnozaki 				ATF_CHECK(buf[i] == t->s[i]);
    958  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)i + 1);
    959  1.1   tnozaki 				ATF_CHECK(buf[i] == t->s[i]);
    960  1.1   tnozaki #if !defined(__GLIBC__)
    961  1.1   tnozaki 				ATF_CHECK(buf[i + 1] == '\0');
    962  1.1   tnozaki #endif
    963  1.1   tnozaki 			}
    964  1.1   tnozaki 
    965  1.1   tnozaki /* don't accept non nul character at end of buffer */
    966  1.1   tnozaki 			ATF_CHECK(fputc(0x1, fp) == EOF);
    967  1.5  christos 			ATF_CHECK_MSG(ftello(fp) == (off_t)t->n,
    968  1.5  christos 				"%td != %td", ftello(fp), (off_t)t->n);
    969  1.1   tnozaki 			ATF_CHECK(feof(fp) == 0);
    970  1.1   tnozaki 
    971  1.1   tnozaki /* accept nul character at end of buffer */
    972  1.1   tnozaki 			ATF_CHECK(fputc('\0', fp) == '\0');
    973  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
    974  1.1   tnozaki 			ATF_CHECK(feof(fp) == 0);
    975  1.1   tnozaki 
    976  1.1   tnozaki /* reach EOF */
    977  1.1   tnozaki 			ATF_CHECK(fputc('\0', fp) == EOF);
    978  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
    979  1.1   tnozaki 
    980  1.1   tnozaki 			/* compare */
    981  1.1   tnozaki 			ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
    982  1.1   tnozaki 			ATF_CHECK(buf[t->n] == '\0');
    983  1.1   tnozaki 
    984  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
    985  1.1   tnozaki 		}
    986  1.1   tnozaki 	}
    987  1.1   tnozaki }
    988  1.1   tnozaki 
    989  1.1   tnozaki ATF_TC(test20);
    990  1.1   tnozaki ATF_TC_HEAD(test20, tc)
    991  1.1   tnozaki {
    992  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test20");
    993  1.1   tnozaki }
    994  1.1   tnozaki ATF_TC_BODY(test20, tc)
    995  1.1   tnozaki {
    996  1.1   tnozaki 	struct testcase *t;
    997  1.1   tnozaki 	const char **p;
    998  1.1   tnozaki 	char buf[BUFSIZ];
    999  1.1   tnozaki 	FILE *fp;
   1000  1.1   tnozaki 
   1001  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
   1002  1.1   tnozaki 		for (p = &mode_rw2[0]; *p != NULL; ++p) {
   1003  1.1   tnozaki 
   1004  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
   1005  1.1   tnozaki 			buf[t->n] = 0x1;
   1006  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n + 1, *p);
   1007  1.1   tnozaki 			ATF_CHECK(fp != NULL);
   1008  1.1   tnozaki 			setbuf(fp, NULL);
   1009  1.2  christos 			ATF_CHECK(fwrite(t->s, 1, t->n, fp) == (size_t)t->n);
   1010  1.1   tnozaki /*
   1011  1.1   tnozaki  * test fmemopen_write + fwrite(3)
   1012  1.1   tnozaki  */
   1013  1.1   tnozaki #if !defined(__GLIBC__)
   1014  1.1   tnozaki 			ATF_CHECK(buf[t->n] == '\0');
   1015  1.1   tnozaki 
   1016  1.1   tnozaki /* don't accept non nul character at end of buffer */
   1017  1.1   tnozaki 			ATF_CHECK(fwrite("\x1", 1, 1, fp) == 0);
   1018  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
   1019  1.1   tnozaki 			ATF_CHECK(feof(fp) == 0);
   1020  1.1   tnozaki #endif
   1021  1.1   tnozaki 
   1022  1.1   tnozaki /* accept nul character at end of buffer */
   1023  1.1   tnozaki 			ATF_CHECK(fwrite("\x0", 1, 1, fp) == 1);
   1024  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
   1025  1.1   tnozaki 			ATF_CHECK(feof(fp) == 0);
   1026  1.1   tnozaki 
   1027  1.1   tnozaki /* reach EOF */
   1028  1.1   tnozaki 			ATF_CHECK(fputc('\0', fp) == EOF);
   1029  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n + 1);
   1030  1.1   tnozaki 
   1031  1.1   tnozaki /* compare */
   1032  1.1   tnozaki 			ATF_CHECK(memcmp(&buf[0], t->s, t->n) == 0);
   1033  1.1   tnozaki 			ATF_CHECK(buf[t->n] == '\0');
   1034  1.1   tnozaki 
   1035  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
   1036  1.1   tnozaki 		}
   1037  1.1   tnozaki 	}
   1038  1.1   tnozaki }
   1039  1.1   tnozaki 
   1040  1.1   tnozaki ATF_TC(test21);
   1041  1.1   tnozaki ATF_TC_HEAD(test21, tc)
   1042  1.1   tnozaki {
   1043  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test21");
   1044  1.1   tnozaki }
   1045  1.1   tnozaki ATF_TC_BODY(test21, tc)
   1046  1.1   tnozaki {
   1047  1.1   tnozaki 	struct testcase *t;
   1048  1.2  christos 	int len, i;
   1049  1.1   tnozaki 	const char **p;
   1050  1.1   tnozaki 	char buf[BUFSIZ];
   1051  1.1   tnozaki 	FILE *fp;
   1052  1.1   tnozaki 
   1053  1.1   tnozaki 	for (t = &testcases[0]; t->s != NULL; ++t) {
   1054  1.1   tnozaki 		len = strnlen(t->s, t->n);
   1055  1.1   tnozaki 		for (p = &mode_a[0]; *p != NULL; ++p) {
   1056  1.1   tnozaki 			memcpy(&buf[0], t->s, t->n);
   1057  1.1   tnozaki 			fp = fmemopen(&buf[0], t->n, *p);
   1058  1.1   tnozaki 			ATF_CHECK(fp != NULL);
   1059  1.1   tnozaki 			setbuf(fp, NULL);
   1060  1.1   tnozaki /*
   1061  1.1   tnozaki  * test fmemopen_write + fputc(3)
   1062  1.1   tnozaki  */
   1063  1.1   tnozaki 			if (len < t->n) {
   1064  1.1   tnozaki 				for (i = len; i < t->n - 1; ++i) {
   1065  1.1   tnozaki 					ATF_CHECK(ftello(fp) == (off_t)i);
   1066  1.1   tnozaki 					ATF_CHECK(fputc(t->s[i - len], fp)
   1067  1.1   tnozaki 					    == t->s[i - len]);
   1068  1.1   tnozaki 					ATF_CHECK(buf[i] == t->s[i - len]);
   1069  1.1   tnozaki 					ATF_CHECK(ftello(fp) == (off_t)i + 1);
   1070  1.1   tnozaki #if !defined(__GLIBC__)
   1071  1.1   tnozaki 					ATF_CHECK(buf[i + 1] == '\0');
   1072  1.1   tnozaki #endif
   1073  1.1   tnozaki 				}
   1074  1.1   tnozaki 
   1075  1.1   tnozaki /* don't accept non nul character at end of buffer */
   1076  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
   1077  1.1   tnozaki 				ATF_CHECK(fputc(0x1, fp) == EOF);
   1078  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
   1079  1.1   tnozaki 
   1080  1.1   tnozaki /* accept nul character at end of buffer */
   1081  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)t->n - 1);
   1082  1.1   tnozaki 				ATF_CHECK(fputc('\0', fp) == '\0');
   1083  1.1   tnozaki 				ATF_CHECK(ftello(fp) == (off_t)t->n);
   1084  1.1   tnozaki 			}
   1085  1.1   tnozaki 
   1086  1.1   tnozaki /* reach EOF */
   1087  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
   1088  1.1   tnozaki 			ATF_CHECK(fputc('\0', fp) == EOF);
   1089  1.1   tnozaki 			ATF_CHECK(ftello(fp) == (off_t)t->n);
   1090  1.1   tnozaki 
   1091  1.1   tnozaki 			ATF_CHECK(fclose(fp) == 0);
   1092  1.1   tnozaki 		}
   1093  1.1   tnozaki 	}
   1094  1.1   tnozaki }
   1095  1.1   tnozaki 
   1096  1.1   tnozaki ATF_TC(test22);
   1097  1.1   tnozaki ATF_TC_HEAD(test22, tc)
   1098  1.1   tnozaki {
   1099  1.1   tnozaki 	atf_tc_set_md_var(tc, "descr", "test22");
   1100  1.1   tnozaki }
   1101  1.1   tnozaki ATF_TC_BODY(test22, tc)
   1102  1.1   tnozaki {
   1103  1.1   tnozaki 	struct testcase *t0, *t1;
   1104  1.2  christos 	size_t len0, len1, nleft;
   1105  1.1   tnozaki 	const char **p;
   1106  1.1   tnozaki 	char buf[BUFSIZ];
   1107  1.1   tnozaki 	FILE *fp;
   1108  1.1   tnozaki 
   1109  1.1   tnozaki 	for (t0 = &testcases[0]; t0->s != NULL; ++t0) {
   1110  1.1   tnozaki 		len0 = strnlen(t0->s, t0->n);
   1111  1.1   tnozaki 		for (t1 = &testcases[0]; t1->s != NULL; ++t1) {
   1112  1.1   tnozaki 			len1 = strnlen(t1->s, t1->n);
   1113  1.1   tnozaki 			for (p = &mode_a[0]; *p != NULL; ++p) {
   1114  1.1   tnozaki 
   1115  1.1   tnozaki 				memcpy(&buf[0], t0->s, t0->n);
   1116  1.1   tnozaki 				fp = fmemopen(&buf[0], t0->n, *p);
   1117  1.1   tnozaki 				ATF_CHECK(fp != NULL);
   1118  1.1   tnozaki 				setbuf(fp, NULL);
   1119  1.1   tnozaki /*
   1120  1.1   tnozaki  * test fmemopen_write + fwrite(3)
   1121  1.1   tnozaki  */
   1122  1.1   tnozaki 				nleft = t0->n - len0;
   1123  1.1   tnozaki #if !defined(__GLIBC__)
   1124  1.1   tnozaki 				if (nleft == 0 || len1 == nleft - 1) {
   1125  1.1   tnozaki 					ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
   1126  1.1   tnozaki 					    == nleft);
   1127  1.1   tnozaki 					ATF_CHECK(ftell(fp) == t1->n);
   1128  1.1   tnozaki 				} else {
   1129  1.1   tnozaki 					ATF_CHECK(fwrite(t1->s, 1, t1->n, fp)
   1130  1.1   tnozaki 					    == nleft - 1);
   1131  1.1   tnozaki 					ATF_CHECK(ftell(fp) == t1->n - 1);
   1132  1.1   tnozaki 				}
   1133  1.1   tnozaki #endif
   1134  1.1   tnozaki 				ATF_CHECK(fclose(fp) == 0);
   1135  1.1   tnozaki 			}
   1136  1.1   tnozaki 		}
   1137  1.1   tnozaki 	}
   1138  1.1   tnozaki }
   1139  1.1   tnozaki 
   1140  1.1   tnozaki ATF_TP_ADD_TCS(tp)
   1141  1.1   tnozaki {
   1142  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test00);
   1143  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test01);
   1144  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test02);
   1145  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test03);
   1146  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test04);
   1147  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test05);
   1148  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test06);
   1149  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test07);
   1150  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test08);
   1151  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test09);
   1152  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test10);
   1153  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test11);
   1154  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test12);
   1155  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test13);
   1156  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test14);
   1157  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test15);
   1158  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test16);
   1159  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test17);
   1160  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test18);
   1161  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test19);
   1162  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test20);
   1163  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test21);
   1164  1.1   tnozaki 	ATF_TP_ADD_TC(tp, test22);
   1165  1.1   tnozaki 
   1166  1.1   tnozaki 	return atf_no_error();
   1167  1.1   tnozaki }
   1168