/*             ----> DO NOT REMOVE THE FOLLOWING NOTICE <----
 *
 *                 Copyright (c) 2014-2015 Datalight, Inc.
 *                     All Rights Reserved Worldwide.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; use version 2 of the License.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but "AS-IS," WITHOUT ANY WARRANTY; without even the implied warranty
 *  of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

/*  Businesses and individuals that for commercial or other reasons cannot
 *  comply with the terms of the GPLv2 license may obtain a commercial license
 *  before incorporating Reliance Edge into proprietary software for
 *  distribution in any form.  Visit http://www.datalight.com/reliance-edge for
 *  more information.
 */

/** @file
 *  @brief Defines macros which make the Reliance Edge POSIX-like API look more
 *         like the actual POSIX API.
 *
 *  This file is intended for porting POSIX file system tests; it is not
 *  intended for application use.
 */
#ifndef REDPOSIXCOMPAT_H
#define REDPOSIXCOMPAT_H


#ifndef assert
    #define assert( x )    REDASSERT( x )
#endif


#undef O_RDONLY
#undef O_WRONLY
#undef O_RDWR
#undef O_APPEND
#undef O_CREAT
#undef O_EXCL
#undef O_TRUNC
#define O_RDONLY    RED_O_RDONLY
#define O_WRONLY    RED_O_WRONLY
#define O_RDWR      RED_O_RDWR
#define O_APPEND    RED_O_APPEND
#define O_CREAT     RED_O_CREAT
#define O_EXCL      RED_O_EXCL
#define O_TRUNC     RED_O_TRUNC

#undef SEEK_SET
#undef SEEK_CUR
#undef SEEK_END
#define SEEK_SET    RED_SEEK_SET
#define SEEK_CUR    RED_SEEK_CUR
#define SEEK_END    RED_SEEK_END

/*  Old-fashioned Linux seek names.
 */
#undef L_SET
#undef L_INCR
#undef L_XTND
#define L_SET     SEEK_SET
#define L_INCR    SEEK_CUR
#define L_XTND    SEEK_END

#undef S_IFDIR
#undef S_IFREG
#undef S_ISDIR
#undef S_ISREG
#define S_IFDIR    RED_S_IFDIR
#define S_IFREG    RED_S_IFREG
#define S_ISDIR( m )    RED_S_ISDIR( m )
#define S_ISREG( m )    RED_S_ISREG( m )

#undef ST_RDONLY
#undef ST_NOSUID
#define ST_RDONLY    RED_ST_RDONLY
#define ST_NOSUID    RED_ST_NOSUID

#undef open
#undef creat
#undef unlink
#undef mkdir
#undef rmdir
#undef rename
#undef link
#undef close
#undef read
#undef write
#undef fsync
#undef fdatasync
#undef lseek
#undef ftruncate
#undef fstat
#undef opendir
#undef readdir
#undef rewinddir
#undef closedir
#define open( path, oflag )              red_open( path, oflag )
#define creat( path, mode )              open( path, O_WRONLY | O_CREAT | O_TRUNC )
#define unlink( path )                   red_unlink( path )
#define mkdir( path )                    red_mkdir( path )
#define rmdir( path )                    red_rmdir( path )
#define rename( old, new )               red_rename( old, new )
#define link( path, hardlink )           red_link( path, hardlink )
#define close( fd )                      red_close( fd )
#define read( fd, buf, len )             red_read( fd, buf, len )
#define write( fd, buf, len )            red_write( fd, buf, len )
#define fsync( fd )                      red_fsync( fd )
#define fdatasync( fd )                  fsync( fd )
#define lseek( fd, offset, whence )      red_lseek( fd, offset, whence )
#define lseek64( fd, offset, whence )    lseek( fd, offset, whence )
#define ftruncate( fd, size )            red_ftruncate( fd, size )
#define fstat( fd, stat )                red_fstat( fd, stat )
#define fstat64( fd, stat )              fstat( fd, stat )
#define opendir( path )                  red_opendir( path )
#define readdir( dirp )                  red_readdir( dirp )
#define readdir64( dirp )                readdir( dirp )
#define rewinddir( dirp )                red_rewinddir( dirp )
#define closedir( dirp )                 red_closedir( dirp )

#undef DIR
#define DIR      REDDIR

#undef errno
#define errno    ( *( int * ) red_errnoptr() )

#undef memcpy
#undef memmove
#undef memset
#undef strlen
#undef strncmp
#undef strcmp
#undef strncpy
#define memcpy( d, s, l )       RedMemCpy( d, s, ( uint32_t ) ( l ) )
#define memmove( d, s, l )      RedMemMove( d, s, ( uint32_t ) ( l ) )
#define memset( d, c, l )       RedMemSet( d, ( uint8_t ) ( c ), ( uint32_t ) ( l ) )
#define strlen( s )             RedStrLen( s )
#define strncmp( s1, s2, l )    RedStrNCmp( s1, s2, ( uint32_t ) ( l ) )
#define strcmp( s1, s2 )        RedStrCmp( s1, s2 )
#define strncpy( d, s, l )      RedStrNCpy( d, s, ( uint32_t ) ( l ) )


#endif /* ifndef REDPOSIXCOMPAT_H */
