3 This file is part of the Public Domain C Library (PDCLib).
4 Permission is granted to use, modify, and / or redistribute at will.
13 #include <_PDCLIB_io.h>
15 long int _PDCLIB_ftell_unlocked( FILE * stream )
17 uint_fast64_t off64 = _PDCLIB_ftell64_unlocked( stream );
19 if ( off64 > LONG_MAX )
21 /* integer overflow */
28 long int ftell( FILE * stream )
30 _PDCLIB_flockfile( stream );
31 long int off = _PDCLIB_ftell_unlocked( stream );
32 _PDCLIB_funlockfile( stream );
39 #include <_PDCLIB_test.h>
42 #include <_PDCLIB_io.h>
47 /* Testing all the basic I/O functions individually would result in lots
48 of duplicated code, so I took the liberty of lumping it all together
51 /* The following functions delegate their tests to here:
52 fgetc fflush rewind fputc ungetc fseek
53 flushbuffer seek fillbuffer prepread prepwrite
55 char * buffer = (char*)malloc( 4 );
57 TESTCASE( ( fh = tmpfile() ) != NULL );
58 TESTCASE( setvbuf( fh, buffer, _IOLBF, 4 ) == 0 );
59 /* Testing ungetc() at offset 0 */
61 TESTCASE( ungetc( 'x', fh ) == 'x' );
62 TESTCASE( ftell( fh ) == -1l );
64 TESTCASE( ftell( fh ) == 0l );
65 /* Commence "normal" tests */
66 TESTCASE( fputc( '1', fh ) == '1' );
67 TESTCASE( fputc( '2', fh ) == '2' );
68 TESTCASE( fputc( '3', fh ) == '3' );
69 /* Positions incrementing as expected? */
70 TESTCASE( ftell( fh ) == 3l );
71 TESTCASE_NOREG( fh->pos.offset == 0l );
72 TESTCASE_NOREG( fh->bufidx == 3l );
73 /* Buffer properly flushed when full? */
74 TESTCASE( fputc( '4', fh ) == '4' );
75 TESTCASE_NOREG( fh->pos.offset == 4l );
76 TESTCASE_NOREG( fh->bufidx == 0 );
77 /* fflush() resetting positions as expected? */
78 TESTCASE( fputc( '5', fh ) == '5' );
79 TESTCASE( fflush( fh ) == 0 );
80 TESTCASE( ftell( fh ) == 5l );
81 TESTCASE_NOREG( fh->pos.offset == 5l );
82 TESTCASE_NOREG( fh->bufidx == 0l );
83 /* rewind() resetting positions as expected? */
85 TESTCASE( ftell( fh ) == 0l );
86 TESTCASE_NOREG( fh->pos.offset == 0 );
87 TESTCASE_NOREG( fh->bufidx == 0 );
88 /* Reading back first character after rewind for basic read check */
89 TESTCASE( fgetc( fh ) == '1' );
91 TESTCASE( fclose( fh ) == 0 );