Path: blob/master/waterbox/libc/functions/stdio/_PDCLIB_filemode.c
2 views
/* _PDCLIB_filemode( const char * )12This file is part of the Public Domain C Library (PDCLib).3Permission is granted to use, modify, and / or redistribute at will.4*/56#include <stddef.h>78#ifndef REGTEST9#include "_PDCLIB_io.h"10/* Helper function that parses the C-style mode string passed to fopen() into11the PDCLib flags FREAD, FWRITE, FAPPEND, FRW (read-write) and FBIN (binary12mode).13*/14unsigned int _PDCLIB_filemode( char const * const mode )15{16if(!mode) return 0;1718unsigned rc = 0;19switch ( mode[0] )20{21case 'r':22rc |= _PDCLIB_FREAD;23break;24case 'w':25rc |= _PDCLIB_FWRITE;26break;27case 'a':28rc |= _PDCLIB_FAPPEND | _PDCLIB_FWRITE;29break;30default:31/* Other than read, write, or append - invalid */32return 0;33}34for ( size_t i = 1; i < 4; ++i )35{36switch ( mode[i] )37{38case '+':39if ( rc & _PDCLIB_FRW ) return 0; /* Duplicates are invalid */40rc |= _PDCLIB_FRW;41break;42case 'b':43if ( rc & _PDCLIB_FBIN ) return 0; /* Duplicates are invalid */44rc |= _PDCLIB_FBIN;45break;46case '\0':47/* End of mode */48return rc;49default:50/* Other than read/write or binary - invalid. */51return 0;52}53}54/* Longer than three chars - invalid. */55return 0;56}57#endif5859#ifdef TEST60#include "_PDCLIB_test.h"6162int main( void )63{64#ifndef REGTEST65TESTCASE( _PDCLIB_filemode( "r" ) == _PDCLIB_FREAD );66TESTCASE( _PDCLIB_filemode( "w" ) == _PDCLIB_FWRITE );67TESTCASE( _PDCLIB_filemode( "a" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE ) );68TESTCASE( _PDCLIB_filemode( "r+" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW ) );69TESTCASE( _PDCLIB_filemode( "w+" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW ) );70TESTCASE( _PDCLIB_filemode( "a+" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FRW ) );71TESTCASE( _PDCLIB_filemode( "rb" ) == ( _PDCLIB_FREAD | _PDCLIB_FBIN ) );72TESTCASE( _PDCLIB_filemode( "wb" ) == ( _PDCLIB_FWRITE | _PDCLIB_FBIN ) );73TESTCASE( _PDCLIB_filemode( "ab" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FBIN ) );74TESTCASE( _PDCLIB_filemode( "r+b" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW | _PDCLIB_FBIN ) );75TESTCASE( _PDCLIB_filemode( "w+b" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) );76TESTCASE( _PDCLIB_filemode( "a+b" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) );77TESTCASE( _PDCLIB_filemode( "rb+" ) == ( _PDCLIB_FREAD | _PDCLIB_FRW | _PDCLIB_FBIN ) );78TESTCASE( _PDCLIB_filemode( "wb+" ) == ( _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) );79TESTCASE( _PDCLIB_filemode( "ab+" ) == ( _PDCLIB_FAPPEND | _PDCLIB_FWRITE | _PDCLIB_FRW | _PDCLIB_FBIN ) );80TESTCASE( _PDCLIB_filemode( "x" ) == 0 );81TESTCASE( _PDCLIB_filemode( "r++" ) == 0 );82TESTCASE( _PDCLIB_filemode( "wbb" ) == 0 );83TESTCASE( _PDCLIB_filemode( "a+bx" ) == 0 );84#endif85return TEST_RESULTS;86}8788#endif89909192