Logo Search packages:      
Sourcecode: scummvm version File versions  Download package

portdefs.h

/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * 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; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but 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.
 *
 * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/tags/release-0-11-1/backends/platform/symbian/src/portdefs.h $
 * $Id: portdefs.h 30944 2008-02-23 22:50:18Z sev $
 */
#ifndef SYMBIAN_PORTDEFS_H
#define SYMBIAN_PORTDEFS_H
#include <assert.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <e32def.h>

#include <e32std.h>
#include <math.h>

#define DISABLE_SCALERS // we only need 1x
#define DISABLE_HQ_SCALERS

#if defined(USE_TREMOR) && !defined(USE_VORBIS)
#define USE_VORBIS // make sure this one is defined together with USE_TREMOR!
#endif

// hack in some tricks to work around not having these fcns for Symbian
// and we _really_ don't wanna link with any other windows LIBC library!
#if defined(__GCC32__)

      #define snprintf(buf,len,args...)   sprintf(buf,args)
      #define vsnprintf(buf,len,format,valist)  vsprintf(buf,format,valist)

      // taken from public domain http://www.opensource.apple.com/darwinsource/WWDC2004/gcc_legacy-939/gcc/floatlib.c
      #define SIGNBIT         0x80000000
      #define HIDDEN          (1 << 23)
      #define EXCESSD         1022
      #define EXPD(fp)  (((fp.l.upper) >> 20) & 0x7FF)
      #define SIGND(fp) ((fp.l.upper) & SIGNBIT)
      #define HIDDEND_LL      ((long long)1 << 52)
      #define MANTD_LL(fp)    ((fp.ll & (HIDDEND_LL-1)) | HIDDEND_LL)
      
      union double_long {
          double d;
          struct {
            long upper;
            unsigned long lower;
          } l;
          long long ll;
      };

      /* convert double float to double int (dfdi) */
      long long inline
      scumm_fixdfdi (double a1) { // __fixdfdi (double a1)
          register union double_long dl1;
          register int exp;
          register long long l;
      
          dl1.d = a1;
      
          if (!dl1.l.upper && !dl1.l.lower)
                  return (0);
      
          exp = EXPD (dl1) - EXCESSD - 64;
          l = MANTD_LL(dl1);
      
          if (exp > 0) {
            l = (long long)1<<63;
            if (!SIGND(dl1))
                l--;
            return l;
          }
      
          /* shift down until exp = 0 or l = 0 */
          if (exp < 0 && exp > -64 && l)
                  l >>= -exp;
          else
                  return (0);
      
          return (SIGND (dl1) ? -l : l);
      }
      
      /*    okay, okay: I admit it: I absolutely have _NO_ idea why __fixdfdi does not get linked in by gcc from libgcc.a
            because I know it's in there: I checked with `ar x _fixdfdi.o libgcc.a` and the symbol is in there, so I'm lost
            and had to fix it this way. I tried all gcc and ld options I could find: no hope :( If someone can enlighten me:
            feel free to let me know at sumthinwicked@users.sf.net! Much obliged.
            PS1. I think for __fixunsdfdi they have made a circumvention by having to add STATICLIBRARY EGCC.LIB        
            PS2. http://gcc.gnu.org/ml/gcc-bugs/2004-01/msg01596.html might have found out the same problem there
      */

#elif defined (__WINS__) // WINS

      // let's just blatantly ignore this for now and just get it to work :P but does n't work from the debug function
      int inline scumm_snprintf (char *str, unsigned long /*n*/, char const *fmt, ...) {
            va_list args;
            va_start(args, fmt);
            vsprintf(str, fmt, args);
            va_end(args);
            return strlen(str);
      }

      int inline scumm_vsnprintf (char *str, unsigned long /*n*/, char const *fmt, va_list valist) {  
            vsprintf(str, fmt, valist);
            return strlen(str);
      }

      #define snprintf                          scumm_snprintf
      #define vsnprintf                         scumm_vsnprintf
      void* symbian_malloc    (size_t _size);

      #define malloc symbian_malloc
#else // GCCE and the rest
      #define snprintf(buf,len,args...)   sprintf(buf,args)
      #define vsnprintf(buf,len,format,valist)  vsprintf(buf,format,valist)
#endif

#ifndef __WINS__
#define USE_ARM_GFX_ASM
#define ARM_USE_GFX_ASM
#define USE_ARM_SMUSH_ASM
//#define USE_ARM_COSTUME_ASM
#define USE_ARM_SOUND_ASM
#endif
// somehow nobody has this function...
#define hypot(a, b)                             sqrt((a)*(a) + (b)*(b))

// Symbian bsearch implementation is flawed
void inline *scumm_bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)) {
      size_t i;

      for (i=0; i < nmemb; i++)
            if (compar(key, (void *)((size_t)base + size * i)) == 0)
                  return (void *)((size_t)base + size * i);
      return NULL;
}
#define bsearch                                 scumm_bsearch

// we cannot include SymbianOS.h everywhere, but this works too (functions code is in SymbianOS.cpp)
namespace Symbian {
extern void FatalError(const char *msg);
extern char* GetExecutablePath();
}
#endif

Generated by  Doxygen 1.6.0   Back to index