Hi Alex,

I've decided to try and extend miniPicoLisp with networking(or perhaps just
the capability to call into external program) to make it useful as a
scripting system that I can share with my colleagues. Please do let me know
if that's not a good idea.

Towards that, as a first step, I tried to compile miniPicoLIsp with 64bit C
compiler and ran into some errors. Could you please take a look at this
patch and confirm if these changes are sufficient? I essentially changed
the use of long to long long in a couple of places :)


 diff --git a/io.c b/io.c
index 7b86c60..bb0f77c 100644
--- a/io.c
+++ b/io.c
@@ -282,7 +282,7 @@ static any rdList(void) {
 static any anonymous(any s) {
    int c, i;
    word w;
-   unsigned long n;
+   unsigned WORD_TYPE n;
    heap *h;

    if ((c = getByte1(&i, &w, &s)) != '$')
diff --git a/main.c b/main.c
index 9c3e588..19f3647 100644
--- a/main.c
+++ b/main.c
@@ -64,7 +64,7 @@ void heapAlloc(void) {
    heap *h;
    cell *p;

-   h = (heap*)((long)alloc(NULL, sizeof(heap) + sizeof(cell)) +
(sizeof(cell)-1) & ~(sizeof(cell)-1));
+   h = (heap*)((WORD_TYPE)alloc(NULL, sizeof(heap) + sizeof(cell)) +
(sizeof(cell)-1) & ~(sizeof(cell)-1));
    h->next = Heaps,  Heaps = h;
    p = h->cells + CELLS-1;
    do
@@ -295,7 +295,7 @@ long compare(any x, any y) {
          return -1;
       a = name(x),  b = name(y);
       if (a == txt(0) && b == txt(0))
-         return (long)x - (long)y;
+         return (WORD_TYPE)x - (WORD_TYPE)y;
       if ((c = getByte1(&i, &w, &a)) == (d = getByte1(&j, &v, &b)))
          do
             if (c == 0)
diff --git a/math.c b/math.c
index acf5e66..a2e9e62 100644
--- a/math.c
+++ b/math.c
@@ -264,7 +264,7 @@ any doMul(any ex) {
 // (*/ 'num1 ['num2 ..] 'num3) -> num
 any doMulDiv(any ex) {
    any x, y;
-   long long n;
+   WORD_TYPE n;

    x = cdr(ex);
    if (isNil(y = EVAL(car(x))))
@@ -457,7 +457,7 @@ any doBitXor(any ex) {
 // (sqrt 'num ['flg|num]) -> num
 any doSqrt(any ex) {
    any x;
- long m, n, r;
+ WORD_TYPE m, n, r;

    x = cdr(ex);
    if (isNil(x = EVAL(car(x))))
@@ -468,7 +468,7 @@ any doSqrt(any ex) {
    x = cddr(ex);
    if (isNum(x = EVAL(car(x))))
       n *= unBox(x);
- m = 1L << BITS-4;
+ m = (WORD_TYPE)1 << BITS-4;
  r = 0;
  do {
  if ((r += m) > n)
diff --git a/pico.h b/pico.h
index 687b493..c5d483d 100644
--- a/pico.h
+++ b/pico.h
@@ -15,10 +15,13 @@
 #define CELLS (1024*1024/sizeof(cell))
 #endif

-#define WORD ((int)sizeof(long))
+#ifndef WORD_TYPE
+#define WORD_TYPE long long
+#endif
+#define WORD ((int)sizeof(WORD_TYPE))
 #define BITS (8*WORD)

-typedef unsigned long word;
+typedef unsigned long long word;
 typedef unsigned char byte;
 typedef unsigned char *ptr;

@@ -88,7 +91,7 @@ typedef struct catchFrame {
 #define Free(p)         ((p)->car=Avail, Avail=(p))

 /* Number access */
-#define num(x)          ((long)(x))
+#define num(x)          ((WORD_TYPE)(x))
 #define txt(n)          ((any)(num(n)<<1|1))
 #define box(n)          ((any)(num(n)<<2|2))
 #define unBox(n)        (num(n)>>2)

Reply via email to