--- /dev/null
+/************************************************************************
+ ************************************************************************
+ FAUST compiler
+ Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
+ ---------------------------------------------------------------------
+ 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ ************************************************************************
+ ************************************************************************/
+
+
+#if defined( __MINGW32__) || defined (WIN32)
+ // Simulate some Unix fonctions on Windows
+
+ #include <windows.h>
+ #include "math.h"
+
+#if defined(_MBCS) || __MINGW32__
+ bool chdir(const char* path)
+ {
+ return !SetCurrentDirectory(path);
+ }
+
+ int mkdir(const char* path, unsigned int attribute)
+ {
+ return CreateDirectory(path,NULL);
+ }
+
+ char* getcwd(char* str, unsigned int size)
+ {
+ GetCurrentDirectory(size, str);
+ return str;
+ }
+ void getFaustPathname(char* str, unsigned int size)
+ {
+ GetModuleFileName(NULL, str, size);
+ }
+#else
+ bool chdir(const char* path)
+ {
+ wchar_t wstr[2048];
+ mbstowcs(wstr,path,2048);
+ return !SetCurrentDirectory(wstr);
+ }
+
+ int mkdir(const char* path, unsigned int attribute)
+ {
+ wchar_t wstr[2048];
+ mbstowcs(wstr,path,2048);
+ return CreateDirectory(wstr,NULL);
+ }
+
+ char* getcwd(char* str, unsigned int size)
+ {
+ wchar_t wstr[2048];
+ GetCurrentDirectory(2048, wstr);
+ wcstombs(str,wstr,size);
+ return str;
+ }
+
+ void getFaustPathname(char* str, unsigned int size)
+ {
+ wchar_t wstr[2048];
+ GetModuleFileName(NULL, wstr, 2048);
+ wcstombs(str,wstr,size);
+ }
+
+#endif
+
+ int isatty(int file)
+ {
+ return 0;
+ }
+
+#if !defined(__MINGW32__)
+
+ typedef union
+ {
+ double value;
+ struct
+ {
+ unsigned int lsw;
+ unsigned int msw;
+ } parts;
+ } ieee_double_shape_type;
+
+
+#define EXTRACT_WORDS(ix0,ix1,d) \
+ do { \
+ ieee_double_shape_type ew_u; \
+ ew_u.value = (d); \
+ (ix0) = ew_u.parts.msw; \
+ (ix1) = ew_u.parts.lsw; \
+ } while (0)
+
+ /* Get the more significant 32 bit int from a double. */
+
+#define GET_HIGH_WORD(i,d) \
+ do { \
+ ieee_double_shape_type gh_u; \
+ gh_u.value = (d); \
+ (i) = gh_u.parts.msw; \
+ } while (0)
+
+ /* Get the less significant 32 bit int from a double. */
+
+#define GET_LOW_WORD(i,d) \
+ do { \
+ ieee_double_shape_type gl_u; \
+ gl_u.value = (d); \
+ (i) = gl_u.parts.lsw; \
+ } while (0)
+
+#define SET_HIGH_WORD(d,v) \
+ do { \
+ ieee_double_shape_type sh_u; \
+ sh_u.value = (d); \
+ sh_u.parts.msw = (v); \
+ (d) = sh_u.value; \
+ } while (0)
+
+ double remainder(double x, double p)
+ {
+ int hx,hp;
+ unsigned int sx,lx,lp;
+ double p_half;
+
+ EXTRACT_WORDS(hx,lx,x);
+ EXTRACT_WORDS(hp,lp,p);
+ sx = hx&0x80000000;
+ hp &= 0x7fffffff;
+ hx &= 0x7fffffff;
+
+ /* purge off exception values */
+ if((hp|lp)==0) return (x*p)/(x*p); /* p = 0 */
+ if((hx>=0x7ff00000)|| /* x not finite */
+ ((hp>=0x7ff00000)&& /* p is NaN */
+ (((hp-0x7ff00000)|lp)!=0)))
+ return (x*p)/(x*p);
+
+
+ static const double zero = 0.0;
+ if (hp<=0x7fdfffff) x = fmod(x,p+p); /* now x < 2p */
+ if (((hx-hp)|(lx-lp))==0) return zero*x;
+ x = fabs(x);
+ p = fabs(p);
+ if (hp<0x00200000) {
+ if(x+x>p) {
+ x-=p;
+ if(x+x>=p) x -= p;
+ }
+ } else {
+ p_half = 0.5*p;
+ if(x>p_half) {
+ x-=p;
+ if(x>=p_half) x -= p;
+ }
+ }
+ GET_HIGH_WORD(hx,x);
+ SET_HIGH_WORD(x,hx^sx);
+ return x;
+ }
+#endif
+
+#else // Linux
+
+ #include <stdlib.h>
+ #include <string.h>
+ void getFaustPathname(char* str, unsigned int size)
+ {
+ char* path = getenv("_");
+ if (path) {
+ strncpy(str, path, size);
+ } else {
+ // prevent the case of _ undefined
+ strncpy(str, "/usr/local/bin/faust", size);
+ }
+ }
+
+#endif
+
+