/**************************************************************************
 *
 * support.cpp - definition of support functions and objects
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2005 Rogue Wave Software.
 * 
 **************************************************************************/

#define _RWSTD_LIB_SRC

// both macros must be defined before #including <rw/_defs.h>
#ifndef _RWSTD_NO_PURE_C_HEADERS
#  define _RWSTD_NO_PURE_C_HEADERS
#endif   // _RWSTD_NO_PURE_C_HEADERS

#ifndef _RWSTD_NO_DEPRECATED_C_HEADERS
#  define _RWSTD_NO_DEPRECATED_C_HEADERS
#endif   // _RWSTD_NO_DEPRECATED_C_HEADERS

#include <errno.h>    // for ERANGE, errno
#include <stdio.h>    // for P_tmpdir, std{err,in,out}, tmpnam()
#include <stdlib.h>   // for mkstemp(), strtoul()
#include <ctype.h>    // for isalpha(), isspace(), toupper()


#if (defined (_WIN32) || defined (_WIN64)) && !defined (__CYGWIN__)
#  include <fcntl.h>
#  include <io.h>
#else
#  include <unistd.h>
#  include <fcntl.h>
#endif   // _WIN32 || _WIN64

#if defined (_WIN32) || defined (_WIN64)
#  define _BINARY _O_BINARY
#else
#  define _BINARY 0
#endif


#include <rw/_file.h>
#include <rw/_defs.h>


#ifdef _MSC_VER
   // shut up the braindead warning C4146: unary minus operator
   // applied to unsigned type, result still unsigned
#  pragma warning (disable: 4146)
#endif   // _MSC_VER


#if defined (_RWSTD_NO_MKSTEMP) && !defined (_RWSTD_NO_MKSTEMP_IN_LIBC)

extern "C" {

#undef mkstemp
#define mkstemp _RWSTD_LIBC_SYM (mkstemp)

_RWSTD_DLLIMPORT int mkstemp (char*);

}   // extern "C"

#  undef _RWSTD_NO_MKSTEMP

#endif   // _RWSTD_NO_MKSTEMP[_IN_LIBC]


#if defined (_RWSTD_NO_FILENO) && !defined (_RWSTD_NO_FILENO_IN_LIBC)

// declare fileno in case it's not declared (for strict ANSI conformance)
extern "C" {

_RWSTD_DLLIMPORT int (fileno)(FILE*) _LIBC_THROWS ();

#  undef _RWSTD_NO_FILENO

}   // extern "C"

#endif   // _RWSTD_NO_FILENO && !_RWSTD_NO_FILENO_IN_LIBC


_RWSTD_NAMESPACE (__rw) {


#if __SUNPRO_CC == 0x530 && defined (__SunOS_5_6)
   // working around a SunPro 5.3 bug on SunOS 5.6 (PR #26283)
#  define _RWSTD_FILENO(f) (f)->_file
#else
#  define _RWSTD_FILENO(f) fileno (f)
#endif


FILE* __rw_stderr = stderr;
FILE* __rw_stdin  = stdin;
FILE* __rw_stdout = stdout;


static const int __rw_io_modes [] = {
    /*  0 */ -1,
    /*  1 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY,
    /*  2 */ -1,
    /*  3 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY | _BINARY,
    /*  4 */ _RWSTD_O_RDONLY,
    /*  5 */ _RWSTD_O_RDONLY | _RWSTD_O_APPEND,
    /*  6 */ _RWSTD_O_RDONLY | _BINARY,
    /*  7 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_RDONLY | _BINARY,
    /*  8 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC  | _RWSTD_O_WRONLY,
    /*  9 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY,
    /* 10 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY | _BINARY,
    /* 11 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_WRONLY | _BINARY,
    /* 12 */ _RWSTD_O_RDWR,
    /* 13 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_RDWR,
    /* 14 */ _RWSTD_O_RDWR | _BINARY,
    /* 15 */ _RWSTD_O_CREAT | _RWSTD_O_APPEND | _RWSTD_O_RDWR | _BINARY,
    /* 16 */ _RWSTD_O_TRUNC,
    /* 17 */ _RWSTD_O_TRUNC | _RWSTD_O_APPEND,
    /* 18 */ _RWSTD_O_TRUNC | _BINARY,
    /* 19 */ _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _BINARY,
    /* 20 */ _RWSTD_O_TRUNC | _RWSTD_O_RDONLY,
    /* 21 */ _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDONLY,
    /* 22 */ _RWSTD_O_TRUNC | _RWSTD_O_RDONLY | _BINARY,
    /* 23 */ _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDONLY | _BINARY,
    /* 24 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY,
    /* 25 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND
                            | _RWSTD_O_WRONLY,
    /* 26 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_WRONLY | _BINARY,
    /* 27 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND
                            | _RWSTD_O_WRONLY | _BINARY,
    /* 28 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_RDWR,
    /* 29 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDWR,
    /* 30 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_RDWR | _BINARY,
    /* 31 */ _RWSTD_O_CREAT | _RWSTD_O_TRUNC | _RWSTD_O_APPEND | _RWSTD_O_RDWR
                            | _BINARY
};


static const char __rw_stdio_modes [][4] = {
    /*  0 */ "",      // error
    /*  1 */ "a",     // app
    /*  2 */ "",      // binary
    /*  3 */ "ab",    // binary|app
    /*  4 */ "r",     // in
    /*  5 */ "a",     // in|app
    /*  6 */ "rb",    // in|binary
    /*  7 */ "ab",    // in|binary|app
    /*  8 */ "w",     // out
    /*  9 */ "a",     // out|app
    /* 10 */ "wb",    // out|binary
    /* 11 */ "ab",    // out|binary|app
    /* 12 */ "r+",    // out|in
    /* 13 */ "a+",    // out|in|app
    /* 14 */ "r+b",   // out|in|binary
    /* 15 */ "a+b",   // out|in|binary|app
    /* 16 */ "w",     // trunc
    /* 17 */ "w",     // trunc|app
    /* 18 */ "wb",    // trunc|binary
    /* 19 */ "wb",    // trunc|binary|app
    /* 20 */ "",      // trunc|in
    /* 21 */ "",      // trunc|in|app
    /* 22 */ "",      // trunc|in|binary
    /* 23 */ "",      // trunc|in|binary|app
    /* 24 */ "w",     // trunc|out
    /* 25 */ "w",     // trunc|out|app
    /* 26 */ "wb",    // trunc|out|binary
    /* 27 */ "wb",    // trunc|out|binary|app
    /* 28 */ "w+",    // trunc|out|in
    /* 29 */ "w+",    // trunc|out|in|app
    /* 30 */ "w+b",   // trunc|out|in|binary
    /* 31 */ "w+b"    // trunc|out|in|binary|app
};


static const int
__rw_openmode_mask =
    ~(  _RWSTD_IOS_ATE | _RWSTD_IOS_STDIO
      | _RWSTD_IOS_NOCREATE | _RWSTD_IOS_NOREPLACE);


// converts iostream open mode to POSIX file access mode
static inline int
__rw_io_mode (int openmode)
{
    // mask out irrelevant bits
    const _RWSTD_SIZE_T inx = openmode & __rw_openmode_mask;

    if (sizeof __rw_io_modes / sizeof *__rw_io_modes <= inx)
        return -1;

    int fdmode = __rw_io_modes [inx];

    // nocreate: open fails if the file does not exist
    if (openmode & _RWSTD_IOS_NOCREATE)
        fdmode &= ~_RWSTD_O_CREAT;

    // noreplace: open for writing fails if the file exists
    if (   (openmode & (_RWSTD_IOS_OUT | _RWSTD_IOS_NOREPLACE))
        == (_RWSTD_IOS_OUT | _RWSTD_IOS_NOREPLACE))
        fdmode |= _RWSTD_O_EXCL;

    return fdmode;
}


// converts iostream open mode to C stdio file open mode
// or the empty string on error (never returns null)
static inline const char*
__rw_stdio_mode (int openmode)
{
    // mask out irrelevant bits
    const _RWSTD_SIZE_T inx = openmode & __rw_openmode_mask;

    if (sizeof __rw_stdio_modes / sizeof *__rw_stdio_modes <= inx)
        return "";   // error -- bad mode

    if (openmode & (_RWSTD_IOS_NOCREATE | _RWSTD_IOS_NOREPLACE))
        return "";   // error -- not implemented

    const char* const stdio_mode = __rw_stdio_modes [inx];

    // verify postcondition: function never returns null
    _RWSTD_ASSERT (0 != stdio_mode);

    return stdio_mode;
}


static int
__rw_mkstemp (int modebits, long prot)
{
    int fd;

#ifndef _RWSTD_NO_MKSTEMP

    // mkstemp() opens a temporary file for reading and writing
    _RWSTD_UNUSED (modebits);
    _RWSTD_UNUSED (prot);

#  ifndef P_tmpdir   // #defined in <stdio.h> by POSIX
#    define P_tmpdir "/tmp"
#  endif   // P_tmpdir

    char fnamebuf[] = P_tmpdir "/.rwtmpXXXXXX";

    fd = mkstemp (fnamebuf);

    if (fd >= 0)
        unlink (fnamebuf);

#else   // if defined (_RWSTD_NO_MKSTEMP)

    modebits |= _RWSTD_O_EXCL | _RWSTD_O_CREAT;

#if defined (_WIN32) || defined (_WIN64)

    // tempnam(const char *dir, const char *prefix) will generate
    // a unique file name for a directory chosen by the following rules:
    //
    // *  If the TMP environment variable is defined and set to a valid
    //    directory name, unique file names will be generated for the
    //    directory specified by TMP.
    // *  If the TMP environment variable is not defined or if it is set
    //    to the name of a directory that does not exist, tempnam will
    //    use the dir parameter as the path for which it will generate
    //    unique names.
    // *  If the TMP environment variable is not defined or if it is set
    //    to the name of a directory that does not exist, and if dir is
    //    either NULL or set to the name of a directory that does not
    //    exist, tempnam will use the current working directory to
    //    generate unique names. Currently, if both TMP and dir specify
    //    names of directories that do not exist, the tempnam function
    // call will fail.
    //
    // The name returned by tempnam will be a concatenation of prefix
    // and a sequential number, which will combine to create a unique
    // file name for the specified directory. tempnam generates file
    // names that have no extension. tempnam uses malloc to allocate
    // space for the filename; the program is responsible for freeing
    // this space when it is no longer needed. 
    char* const fname = tempnam (P_tmpdir, ".rwtmp");

    if (!fname)
        return -1;

    // create a temporary file that will be deleted when
    // the last file descriptor that refers to it is closed
    fd = open (fname, modebits | _O_TEMPORARY, prot);

    // deallocate storage allocated by tempnam()
    free (fname);
    
#  else   // if !(defined (_WIN32) || defined (_WIN64))

    char tmpbuf [L_tmpnam];

    const char* const fname = tmpnam (tmpbuf);

    if (!fname)
        return -1;

    fd = open (fname, modebits, prot);

    // unlink the file, forcing the OS to delete it when
    // the last file descriptor that refers to it is closed
    if (fd >= 0)
        unlink (fname);

#  endif   // _WIN{32,64}
#endif   // _RWSTD_NO_MKSTEMP

    return fd;
}


_RWSTD_EXPORT void*
__rw_fopen (const char *fname, int openmode, long prot)
{
    if (openmode & _RWSTD_IOS_STDIO) {

        // convert the iostream open mode to the C stdio file open mode
        const char* const fmode = __rw_stdio_mode (openmode);

        _RWSTD_ASSERT (0 != fmode);

        // fmode is the empty string on failure
        if ('\0' == *fmode)
            return 0;

        FILE *file;

        if (fname) {
            // open the named file using C stdio
            file = fopen (fname, fmode);
        }
        else {
            // FIXME: check openmode to make sure it's valid for "w+"

            // extension: create a temporary file for update ("w+")
            // that will be automatically deleted when all references
            // to the file are closed
            file = tmpfile ();
        }

        if (0 == file)
            return 0;

        return _RWSTD_STATIC_CAST (void*, file);
    }

    // convert the iostream open mode to the POSIX file access mode
    const int fdmode = __rw_io_mode (openmode);

    if (fdmode < 0)
        return 0;

    int fd;

    if (fname) {
        // open the named file
        fd = open (fname, fdmode, prot);
    }
    else {
        // extension: create a temporary file that will be deleted
        // when the last file descriptor that refers to it is closed
        fd = __rw_mkstemp (fdmode, prot);
    }

    if (fd < 0)
        return 0;

    return _RWSTD_REINTERPRET_CAST (void*, fd + 1);
}


_RWSTD_EXPORT void*
__rw_fdopen (int fd)
{
    if (fd < 0)
        return 0;

    return _RWSTD_REINTERPRET_CAST (void*, fd + 1);
}


_RWSTD_EXPORT int
__rw_fclose (void *file, int flags)
{
    if (flags & _RWSTD_IOS_STDIO) {
        FILE* const fp = _RWSTD_STATIC_CAST (FILE*, file);

        return fclose (fp);
    }

    const int fd = int (_RWSTD_STATIC_CAST (char*, file) - 1 - (char*)0);

    return close (fd);
}


_RWSTD_EXPORT int
__rw_fileno (void *file, int flags)
{
    if (flags & _RWSTD_IOS_STDIO)
        return _RWSTD_FILENO (_RWSTD_STATIC_CAST (FILE*, file));

    const int fd = int (_RWSTD_STATIC_CAST (char*, file) - 1 - (char*)0);

    return fd;
}


_RWSTD_EXPORT int
__rw_fdmode (int fd)
{
// FIXME -- need to have equivalent of fcntl() on win32.
#if defined (_WIN32) || defined (_WIN64)

    return fd == _RWSTD_STDIN_FILENO
               ? _RWSTD_IOS_IN
               : fd == _RWSTD_STDOUT_FILENO || fd == _RWSTD_STDERR_FILENO
                   ? _RWSTD_IOS_OUT : _RWSTD_IOS_OUT | _RWSTD_IOS_IN;

#else   // if !defined (_WIN{32,64})

   const int m = fcntl (fd, _RWSTD_F_GETFL);

   if (-1 == m)
       return _RWSTD_INVALID_OPENMODE;

   int mode = m & _RWSTD_O_APPEND ? _RWSTD_IOS_APP : 0;

   switch (m & _RWSTD_O_ACCMODE) {
       case _RWSTD_O_RDONLY: mode |= _RWSTD_IOS_IN; break;
       case _RWSTD_O_WRONLY: mode |= _RWSTD_IOS_OUT; break;
       case _RWSTD_O_RDWR:   mode |= _RWSTD_IOS_IN | _RWSTD_IOS_OUT; break;
   }

   return mode;

#endif
}


_RWSTD_EXPORT int
__rw_fmode (void *file, int flags)
{
    if (flags & _RWSTD_IOS_STDIO) {
        FILE* const fp = _RWSTD_STATIC_CAST (FILE*, file);

        return __rw_fdmode (_RWSTD_FILENO (fp));
    }

    const int fd = int (_RWSTD_STATIC_CAST (char*, file) - 1 - (char*)0);

    return __rw_fdmode (fd);
}


_RWSTD_EXPORT long
__rw_fseek (void *file, int flags, _RWSTD_PTRDIFF_T offset, int origin)
{
    if (flags & _RWSTD_IOS_STDIO) {
        FILE* const fp = _RWSTD_STATIC_CAST (FILE*, file);

        const int pos = fseek (fp, offset, origin);
        if (pos < 0)
            return long (pos);

        return ftell (fp);
    }

    const int fd = int (_RWSTD_STATIC_CAST (char*, file) - 1 - (char*)0);

    return lseek (fd, offset, origin);
}


_RWSTD_EXPORT _RWSTD_SIZE_T
__rw_fread (void *file, int flags, void *buf, _RWSTD_SIZE_T size)
{
    if (flags & _RWSTD_IOS_STDIO) {
        FILE* const fp = _RWSTD_STATIC_CAST (FILE*, file);

        return fread (buf, 1, size, fp);
    }

    const int fd = int (_RWSTD_STATIC_CAST (char*, file) - 1 - (char*)0);

    return read (fd, buf, size);
}


_RWSTD_EXPORT _RWSTD_PTRDIFF_T
__rw_fwrite (void *file, int flags, const void *buf, _RWSTD_SIZE_T size)
{
    if (flags & _RWSTD_IOS_STDIO) {
        FILE* const fp = _RWSTD_STATIC_CAST (FILE*, file);

        return _RWSTD_STATIC_CAST (_RWSTD_PTRDIFF_T, fwrite (buf, 1, size, fp));
    }

    const int fd = int (_RWSTD_STATIC_CAST (char*, file) - 1 - (char*)0);

    return write (fd, buf, size);
}


_RWSTD_EXPORT extern const void* __rw_std_streams[];


_RWSTD_EXPORT int
__rw_fflush (void *file, int flags)
{
    if (   file == __rw_std_streams [1] /* cout */
        || file == __rw_std_streams [5] /* wcout */)
        return fflush (stdout);

    if (   file == __rw_std_streams [2] /* cerr */
        || file == __rw_std_streams [3] /* clog */
        || file == __rw_std_streams [6] /* wcerr */
        || file == __rw_std_streams [7] /* wclog */)
        return fflush (stderr);

    if (file) {
        if (flags & _RWSTD_IOS_STDIO) {

            // `file' is a C file objec, flush it
            FILE* const fp = _RWSTD_STATIC_CAST (FILE*, file);

            return fflush (fp);
        }

        // `file' is a file descriptor, no need to flush it
    }
    else {

        // convenience call to flush both C files
        return fflush (stdout) + fflush (stderr);
    }

    return 0;
}


}   // namespace __rw
