/****************************************************************************
 *
 * ftstdlib.h
 *
 *   ANSI-specific library and header configuration file (specification
 *   only).
 *
 * Copyright (C) 2002-2020 by
 * David Turner, Robert Wilhelm, and Werner Lemberg.
 *
 * This file is part of the FreeType project, and may only be used,
 * modified, and distributed under the terms of the FreeType project
 * license, LICENSE.TXT.  By continuing to use, modify, or distribute
 * this file you indicate that you have read the license and
 * understand and accept it fully.
 *
 */


  /**************************************************************************
   *
   * This file is used to group all `#includes` to the ANSI~C library that
   * FreeType normally requires.  It also defines macros to rename the
   * standard functions within the FreeType source code.
   *
   * Load a file which defines `FTSTDLIB_H_` before this one to override it.
   *
   */


#ifndef FTSTDLIB_H_
#define FTSTDLIB_H_


#include <stddef.h>

#define ft_ptrdiff_t  ptrdiff_t


  /**************************************************************************
   *
   *                          integer limits
   *
   * `UINT_MAX` and `ULONG_MAX` are used to automatically compute the size of
   * `int` and `long` in bytes at compile-time.  So far, this works for all
   * platforms the library has been tested on.
   *
   * Note that on the extremely rare platforms that do not provide integer
   * types that are _exactly_ 16 and 32~bits wide (e.g., some old Crays where
   * `int` is 36~bits), we do not make any guarantee about the correct
   * behaviour of FreeType~2 with all fonts.
   *
   * In these cases, `ftconfig.h` will refuse to compile anyway with a
   * message like 'couldn't find 32-bit type' or something similar.
   *
   */


#include <limits.h>

#define FT_CHAR_BIT    CHAR_BIT
#define FT_USHORT_MAX  USHRT_MAX
#define FT_INT_MAX     INT_MAX
#define FT_INT_MIN     INT_MIN
#define FT_UINT_MAX    UINT_MAX
#define FT_LONG_MIN    LONG_MIN
#define FT_LONG_MAX    LONG_MAX
#define FT_ULONG_MAX   ULONG_MAX


  /**************************************************************************
   *
   *                character and string processing
   *
   */
#include <string.h>

#define ft_memchr memchr

#if defined(STARBOARD)
#include "starboard/string.h"
#include "starboard/memory.h"
#define ft_memcmp   SbMemoryCompare
#define ft_memcpy   SbMemoryCopy
#define ft_memmove  SbMemoryMove
#define ft_memset   SbMemorySet
#define ft_strcat   SbStringConcatUnsafe
#define ft_strcmp   SbStringCompareAll
#define ft_strcpy   SbStringCopyUnsafe
#define ft_strlen   SbStringGetLength
#define ft_strncmp  SbStringCompare
#define ft_strncpy  SbStringCopy
#define ft_strrchr  SbStringFindLastCharacter
#else
#define ft_memcmp   memcmp
#define ft_memcpy   memcpy
#define ft_memmove  memmove
#define ft_memset   memset
#define ft_strcat   strcat
#define ft_strcmp   strcmp
#define ft_strcpy   strcpy
#define ft_strlen   strlen
#define ft_strncmp  strncmp
#define ft_strncpy  strncpy
#define ft_strrchr  strrchr
#endif
#define ft_strstr   strstr
  /**************************************************************************
   *
   *                          file handling
   *
   */

#if defined(STARBOARD)
#include "starboard/string.h"
#include "starboard/file.h"

#ifndef SEEK_SET
#define SEEK_SET    kSbFileFromBegin
#define SEEK_CUR    kSbFileFromCurrent
#define SEEK_END    kSbFileFromEnd
#endif
#define FT_FILE     SbFilePrivate
#define ft_fclose   SbFileClose
#define ft_fopen(p, m) SbFileOpen((p), SbFileModeStringToFlags(m), NULL, NULL)
#define ft_fread(b, s, n, f) SbFileRead((f), (char *)(b), (s) * (n))
#define ft_fseek(f, o, w) SbFileSeek((f), (w), (o))
#define ft_ftell(f)    SbFileSeek((f), kSbFileFromCurrent, 0)
#define ft_sprintf  SbStringFormatUnsafeF
#else
#include <stdio.h>

#define FT_FILE     FILE
#define ft_fclose   fclose
#define ft_fopen    fopen
#define ft_fread    fread
#define ft_fseek    fseek
#define ft_ftell    ftell
#define ft_sprintf  sprintf
#endif


  /**************************************************************************
   *
   *                            sorting
   *
   */

#include <stdlib.h>
#define ft_qsort  qsort

  /**************************************************************************
   *
   *                       memory allocation
   *
   */

#if defined(STARBOARD)
#include "starboard/memory.h"
static SB_C_INLINE void *ft_scalloc(size_t nelem, size_t elsize) {
  size_t size = nelem * elsize;
  void *memory = SbMemoryAllocate(size);
  if (!memory) {
    return NULL;
  }

  SbMemorySet(memory, 0, size);
  return memory;
}
#define ft_sfree     SbMemoryDeallocate
#define ft_smalloc   SbMemoryAllocate
#define ft_srealloc  SbMemoryReallocate
#else
#define ft_scalloc   calloc
#define ft_sfree     free
#define ft_smalloc   malloc
#define ft_srealloc  realloc
#endif


  /**************************************************************************
   *
   *                         miscellaneous
   *
   */
#include <stdlib.h>
#define ft_strtol  strtol 

#if defined(STARBOARD)
static SB_C_INLINE char* ft_getenv(const char* name){
  return NULL;
}
#else
#define ft_getenv  getenv
#endif


  /**************************************************************************
   *
   *                        execution control
   *
   */


#include <setjmp.h>

#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since  */
                                /*       `jmp_buf` is defined as a macro */
                                /*       on certain platforms            */

#define ft_longjmp     longjmp
#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */


  /* The following is only used for debugging purposes, i.e., if   */
  /* `FT_DEBUG_LEVEL_ERROR` or `FT_DEBUG_LEVEL_TRACE` are defined. */

#include <stdarg.h>


#endif /* FTSTDLIB_H_ */


/* END */
