summaryrefslogtreecommitdiffstats
path: root/lib.h
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2009-11-23 15:46:24 -0800
committerKaz Kylheku <kaz@kylheku.com>2009-11-23 15:46:24 -0800
commitb6f5aadfccea8bccadd6c56b57fe6f6b80cfc213 (patch)
treecd71b8fefd57c2c1d4d6e9f7f3a633575f26b03b /lib.h
parent4a1556a848c5bfb527cecb2b823a750ba63e6f80 (diff)
downloadtxr-b6f5aadfccea8bccadd6c56b57fe6f6b80cfc213.tar.gz
txr-b6f5aadfccea8bccadd6c56b57fe6f6b80cfc213.tar.bz2
txr-b6f5aadfccea8bccadd6c56b57fe6f6b80cfc213.zip
Improving portability. It is no longer assumed that pointers
can be converted to a type long and vice versa. The configure script tries to detect the appropriate type to use. Also, some run-time checking is performed in the streams module to detect which conversions specifier strings to use for printing numbers.
Diffstat (limited to 'lib.h')
-rw-r--r--lib.h24
1 files changed, 13 insertions, 11 deletions
diff --git a/lib.h b/lib.h
index 71fd4668..c3e9e4a7 100644
--- a/lib.h
+++ b/lib.h
@@ -30,8 +30,10 @@
#define TAG_NUM 1
#define TAG_CHR 2
#define TAG_LIT 3
-#define NUM_MAX (LONG_MAX/4)
-#define NUM_MIN (LONG_MIN/4)
+#define NUM_MAX (INT_PTR_MAX/4)
+#define NUM_MIN (INT_PTR_MIN/4)
+
+typedef int_ptr_t cnum;
typedef enum type {
NUM = TAG_NUM, CHR = TAG_CHR, LIT = TAG_LIT, CONS,
@@ -145,7 +147,7 @@ struct cobj_ops {
void (*print)(val self, val stream);
void (*destroy)(val self);
void (*mark)(val self);
- long (*hash)(val self);
+ cnum (*hash)(val self);
};
union obj {
@@ -161,7 +163,7 @@ union obj {
struct cobj co;
};
-inline long tag(val obj) { return ((long) obj) & TAG_MASK; }
+inline cnum tag(val obj) { return ((cnum) obj) & TAG_MASK; }
inline int is_ptr(val obj) { return obj && tag(obj) == TAG_PTR; }
inline int is_num(val obj) { return tag(obj) == TAG_NUM; }
inline int is_chr(val obj) { return tag(obj) == TAG_CHR; }
@@ -174,20 +176,20 @@ inline type_t type(val obj)
inline val auto_str(const wchar_t *str)
{
- return (val) ((long) (str) | TAG_LIT);
+ return (val) ((cnum) (str) | TAG_LIT);
}
inline val static_str(const wchar_t *str)
{
- return (val) ((long) (str) | TAG_LIT);
+ return (val) ((cnum) (str) | TAG_LIT);
}
inline wchar_t *litptr(val obj)
{
- return (wchar_t *) ((long) obj & ~TAG_MASK);
+ return (wchar_t *) ((cnum) obj & ~TAG_MASK);
}
-#define lit_noex(strlit) ((obj_t *) ((long) (L ## strlit) | TAG_LIT))
+#define lit_noex(strlit) ((obj_t *) ((cnum) (L ## strlit) | TAG_LIT))
#define lit(strlit) lit_noex(strlit)
extern val keyword_package;
@@ -245,7 +247,7 @@ val tree_find(val obj, val tree);
val some_satisfy(val list, val pred, val key);
val all_satisfy(val list, val pred, val key);
val none_satisfy(val list, val pred, val key);
-long c_num(val num);
+cnum c_num(val num);
val nump(val num);
val equal(val left, val right);
unsigned char *chk_malloc(size_t size);
@@ -259,8 +261,8 @@ val atom(val obj);
val listp(val obj);
val proper_listp(val obj);
val length(val list);
-val num(long val);
-long c_num(val num);
+val num(cnum val);
+cnum c_num(val num);
val plus(val anum, val bnum);
val minus(val anum, val bnum);
val neg(val num);