shithub: femtolisp

Download patch

ref: 7b771097fc81161cd05a4ae580fe28708ce4def2
parent: ee807a2cf3eaa7df64f6544dc72a8bf3fe9e54f3
author: Neil <naroza@gmail.com>
date: Sun Mar 17 11:02:33 EDT 2013

trying some preprocessor platform detection

--- a/Makefile
+++ b/Makefile
@@ -9,10 +9,7 @@
 LLTDIR = llt
 LLT = $(LLTDIR)/libllt.a
 
-# OS flags: LINUX, WIN32, MACOSX
-# architecture flags: __CPU__=xxx, BITS64, ARCH_X86, ARCH_X86_64
-CONFIG = -DLINUX -DARCH_X86_64 -DBITS64 -D__CPU__=686
-FLAGS = -falign-functions -Wall -Wno-strict-aliasing -I$(LLTDIR) $(CFLAGS) -DUSE_COMPUTED_GOTO $(CONFIG)
+FLAGS = -falign-functions -Wall -Wno-strict-aliasing -I$(LLTDIR) $(CFLAGS) -DUSE_COMPUTED_GOTO
 LIBFILES = $(LLT)
 LIBS = $(LIBFILES) -lm
 
--- a/llt/Makefile
+++ b/llt/Makefile
@@ -7,10 +7,7 @@
 DOBJS = $(SRCS:%.c=%.do)
 TARGET = libllt.a
 
-# OS flags: LINUX, WIN32, MACOSX
-# architecture flags: __CPU__=xxx, BITS64, ARCH_X86, ARCH_X86_64
-CONFIG = -DLINUX -DARCH_X86_64 -DBITS64 -D__CPU__=686
-FLAGS = -Wall -Wno-strict-aliasing $(CFLAGS) $(CONFIG)
+FLAGS = -Wall -Wno-strict-aliasing $(CFLAGS)
 LIBS =
 
 DEBUGFLAGS = -g -DDEBUG $(FLAGS)
--- a/llt/dtypes.h
+++ b/llt/dtypes.h
@@ -16,46 +16,69 @@
   We assume the LP64 convention for 64-bit platforms.
 */
 
-#ifdef WIN32
-#define STDCALL __stdcall
-# ifdef IMPORT_EXPORTS
-#  define DLLEXPORT __declspec(dllimport)
-# else
-#  define DLLEXPORT __declspec(dllexport)
-# endif
+
+#if defined(__gnu_linux__)
+#  define LINUX
+#elif defined(__APPLE__) && defined(__MACH__)
+#  define MACOSX
+#elif defined(_WIN32)
+#  define WIN32
 #else
-#define STDCALL
-#define DLLEXPORT __attribute__ ((visibility("default")))
+#  error "unknown platform"
 #endif
 
-#ifdef LINUX
-#include <features.h>
-#include <endian.h>
-#define LITTLE_ENDIAN  __LITTLE_ENDIAN
-#define BIG_ENDIAN     __BIG_ENDIAN
-#define PDP_ENDIAN     __PDP_ENDIAN
-#define BYTE_ORDER     __BYTE_ORDER
+
+#ifndef __SIZEOF_POINTER__
+#  error "__SIZEOF_POINTER__ undefined"
 #endif
+#if( 8 == __SIZEOF_POINTER__ )
+#  define BITS64
+#elif( 4 == __SIZEOF_POINTER__ )
+#  define BITS32
+#else
+#  error "this is one weird machine"
+#endif
 
-#ifdef MACOSX
-#include <machine/endian.h>
-#define __LITTLE_ENDIAN  LITTLE_ENDIAN
-#define __BIG_ENDIAN     BIG_ENDIAN
-#define __PDP_ENDIAN     PDP_ENDIAN
-#define __BYTE_ORDER     BYTE_ORDER
+
+#if defined(WIN32)
+#  define STDCALL __stdcall
+#  if defined(IMPORT_EXPORTS)
+#    define DLLEXPORT __declspec(dllimport)
+#  else
+#    define DLLEXPORT __declspec(dllexport)
+#  endif
+#else
+#  define STDCALL
+#  define DLLEXPORT __attribute__ ((visibility("default")))
 #endif
 
-#ifdef WIN32
-#define __LITTLE_ENDIAN	1234
-#define __BIG_ENDIAN	4321
-#define __PDP_ENDIAN	3412
-#define __BYTE_ORDER       __LITTLE_ENDIAN
-#define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
-#define LITTLE_ENDIAN  __LITTLE_ENDIAN
-#define BIG_ENDIAN     __BIG_ENDIAN
-#define PDP_ENDIAN     __PDP_ENDIAN
-#define BYTE_ORDER     __BYTE_ORDER
+#if defined(LINUX)
+#  include <features.h>
+#  include <endian.h>
+#  define LITTLE_ENDIAN  __LITTLE_ENDIAN
+#  define BIG_ENDIAN     __BIG_ENDIAN
+#  define PDP_ENDIAN     __PDP_ENDIAN
+#  define BYTE_ORDER     __BYTE_ORDER
+#elif defined(MACOSX)
+#  include <machine/endian.h>
+#  define __LITTLE_ENDIAN  LITTLE_ENDIAN
+#  define __BIG_ENDIAN     BIG_ENDIAN
+#  define __PDP_ENDIAN     PDP_ENDIAN
+#  define __BYTE_ORDER     BYTE_ORDER
+#elif defined(WIN32)
+#  define __LITTLE_ENDIAN	1234
+#  define __BIG_ENDIAN	4321
+#  define __PDP_ENDIAN	3412
+#  define __BYTE_ORDER       __LITTLE_ENDIAN
+#  define __FLOAT_WORD_ORDER __LITTLE_ENDIAN
+#  define LITTLE_ENDIAN  __LITTLE_ENDIAN
+#  define BIG_ENDIAN     __BIG_ENDIAN
+#  define PDP_ENDIAN     __PDP_ENDIAN
+#  define BYTE_ORDER     __BYTE_ORDER
+#else
+#  error "unknown platform"
 #endif
+
 
 #ifdef BOEHM_GC
 // boehm GC allocator
--- a/llt/utils.h
+++ b/llt/utils.h
@@ -1,6 +1,33 @@
 #ifndef __UTILS_H_
 #define __UTILS_H_
 
+
+#if defined( __amd64__ ) || defined( _M_AMD64 )
+#  define ARCH_X86_64
+#  define __CPU__ 686
+#elif defined( _M_IX86 )//msvs, intel, digital mars, watcom
+#  if ! defined( __386__ )
+#    error "unsupported target: 16-bit x86"
+#  endif
+#  define ARCH_X86
+#  define __CPU__  ( _M_IX86 + 86 )
+#elif defined( __i686__ )//gnu c
+#  define ARCH_X86
+#  define __CPU__ 686
+#elif defined( __i586__ )//gnu c
+#  define ARCH_X86
+#  define __CPU__ 586
+#elif defined( __i486__ )//gnu c
+#  define ARCH_X86
+#  define __CPU__ 486
+#elif defined( __i386__ )//gnu c
+#  define ARCH_X86
+#  define __CPU__ 386
+#else
+#  error "unknown architecture"
+#endif
+
+
 char *uint2str(char *dest, size_t len, uint64_t num, uint32_t base);
 int str2int(char *str, size_t len, int64_t *res, uint32_t base);
 int isdigit_base(char c, int base);
--- a/string.c
+++ b/string.c
@@ -47,6 +47,14 @@
     return size_wrap(u8_charnum(str+start, stop-start));
 }
 
+
+#if defined( __WIN32__ ) || defined( __linux__ )
+extern int wcwidth( wchar_t );
+#else
+#  error "I need int wcwidth( wchar_t );"
+#endif
+
+
 value_t fl_string_width(value_t *args, u_int32_t nargs)
 {
     argcount("string.width", nargs, 1);