* configure.in: check for hstrerror.
authorGary Houston <ghouston@arglist.com>
Thu, 18 Nov 1999 22:36:28 +0000 (22:36 +0000)
committerGary Houston <ghouston@arglist.com>
Thu, 18 Nov 1999 22:36:28 +0000 (22:36 +0000)
* socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
functions for network data conversion.

* numbers.c (scm_num2long, scm_num2longlong):
throw out-of-range instead of wrong-type-arg if appropriate.
(scm_iint2str): handle -2^31 correctly.
(scm_num2long): handle -2^31 bignum correctly.
(scm_num2long_long): rewrite the bigdig case: basically copied
from scm_num2long.
numbers.h: (SCM_BITSPERLONGLONG): deleted.

* unif.c (rapr1): use sprintf instead of intprint for unsigned
longs: intprint can't cope with large values.

* numbers.c (scm_num2ulong): check more consistently that the
input is not negative.  if it is, throw out-of-range instead of
wrong-type-arg.

* ramap.c (scm_array_fill_int): don't limit fill to INUM for
uvect, ivect or llvect.
Check that fill doesn't overflow short uniform array.

* __scm.h: add another long to the definition of long_long and
ulong_long.

* unif.c (scm_raprin1): use 'l' instead of "long_long" in the
print representation of llvect.  read can't handle more than
one character.
(scm_dimensions_to_uniform_array): make "fill" an optional argument
instead of a rest argument.

* tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
tag 29 for now.

* __scm.h: don't mention LONGLONGS.

* unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
replace LONGLONGS with HAVE_LONG_LONGS as set by configure.

* net_db.c (scm_inet_aton): throw errors using the misc-error key
instead of system-error.  inet_aton doesn't set errno.
system-error isn't right in gethost either, since it's throwing
the value of h_errno instead of errno. so:
(scm_host_not_found_key, scm_try_again_key,
scm_no_recovery_key, scm_no_data_key): new error keys.
(scm_resolv_error): new procedure, use the new keys.
(scm_gethost): call scm_resolv_error not scm_syserror_msg.

* error.c: (various): use scm_cons instead of scm_listify
to build short lists.

* boot-9.scm (read-hash-extend to set up arrays): add 'l' for
long_long uniform vectors.

* networking.scm (sethostent, setnetent, setprotoent, setservent):
take an optional argument STAYOPEN.  default is #f.

* readline.c (scm_init_readline): set rl_readline_name to Guile,
to allow conditionals in  .inputrc.

22 files changed:
ChangeLog
NEWS
configure.in
guile-readline/ChangeLog
guile-readline/readline.c
ice-9/ChangeLog
ice-9/boot-9.scm
ice-9/networking.scm
libguile/ChangeLog
libguile/eq.c
libguile/error.c
libguile/eval.c
libguile/gc.c
libguile/net_db.c
libguile/numbers.c
libguile/numbers.h
libguile/print.c
libguile/ramap.c
libguile/socket.c
libguile/socket.h
libguile/tags.h
libguile/unif.c

index 303d403..46b9c10 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+1999-11-17  Gary Houston  <ghouston@freewire.co.uk>
+
+       * configure.in: check for hstrerror.
+
 1999-10-05  Jim Blandy  <jimb@savonarola.red-bean.com>
 
        * autogen.sh: Don't call autoreconf at all; it's not reliable.
diff --git a/NEWS b/NEWS
index dee775f..fbd02dd 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -107,6 +107,39 @@ although to actually avoid resetting the buffers and discard unread
 chars requires further hacking that depends on the characteristics
 of the ptob.
 
+* Changes to the networking interfaces:
+
+** New functions: htons, ntohs, htonl, ntohl: for converting short and
+long integers between network and host format.  For now, it's not
+particularly convenient to do this kind of thing, but consider:
+
+(define write-network-long
+  (lambda (value port)
+    (let ((v (make-uniform-vector 1 1 0)))
+      (uniform-vector-set! v 0 (htonl value))
+      (uniform-vector-write v port))))
+
+(define read-network-long
+  (lambda (port)
+    (let ((v (make-uniform-vector 1 1 0)))
+      (uniform-vector-read! v port)
+      (ntohl (uniform-vector-ref v 0)))))
+
+** If inet-aton fails, it now throws an error with key 'misc-error
+instead of 'system-error, since errno is not relevant.
+
+** Certain gethostbyname/gethostbyaddr failures now throw errors with
+specific keys instead of 'system-error.  The latter is inappropriate
+since errno will not have been set.  The keys are:
+'dns-host-not-found, 'dns-try-again, 'dns-no-recovery and
+'dns-no-data.
+
+** sethostent, setnetent, setprotoent, setservent: now take an
+optional argument STAYOPEN, which specifies whether the database
+remains open after a database entry is accessed randomly (e.g., using
+gethostbyname for the hosts database.)  The default is #f.  Previously
+#t was always used.
+
 \f
 Changes since Guile 1.3.2:
 
index 3877baa..2fcacdc 100644 (file)
@@ -219,7 +219,7 @@ dnl AC_CHECK_FUNCS...
 dnl restore confdefs.h
 
 dnl cp confdefs.h confdefs.h.bak
-dnl for func in gethostent sethostent endhostent getnetent setnetent endnetent getprotoent setprotoent endprotoent getservent setservent endservent getnetbyaddr getnetbyname inet_lnaof inet_makeaddr inet_netof ; do
+dnl for func in gethostent sethostent endhostent getnetent setnetent endnetent getprotoent setprotoent endprotoent getservent setservent endservent getnetbyaddr getnetbyname inet_lnaof inet_makeaddr inet_netof hstrerror; do
 dnl cp confdefs.h.bak confdefs.h
 dnl cat >> confdefs.h << EOF 
 dnl #ifdef __CYGWIN32__
@@ -234,7 +234,8 @@ AC_CHECK_FUNCS(sethostent   gethostent   endhostent   dnl
                setnetent    getnetent    endnetent    dnl
                setprotoent  getprotoent  endprotoent  dnl
                setservent   getservent   endservent   dnl
-               getnetbyaddr getnetbyname inet_lnaof inet_makeaddr inet_netof)
+               getnetbyaddr getnetbyname dnl
+              inet_lnaof inet_makeaddr inet_netof hstrerror)
 
 dnl </GNU-WIN32 hacks>
 
index f1854da..d7fd1f3 100644 (file)
@@ -1,3 +1,8 @@
+1999-11-18  Gary Houston  <ghouston@freewire.co.uk>
+
+       * readline.c (scm_init_readline): set rl_readline_name to Guile,
+       to allow conditionals in  .inputrc.
+
 1999-10-05  Jim Blandy  <jimb@savonarola.red-bean.com>
 
        * Makefile.in, configure, aclocal.m4: Deleted from CVS repository.
index 3d27b2d..e3d5e44 100644 (file)
@@ -494,6 +494,8 @@ scm_init_readline ()
   rl_redisplay_function = redisplay;
   rl_completion_entry_function = (Function*) completion_function;
   rl_basic_word_break_characters = "\t\n\"'`;()";
+  rl_readline_name = "Guile";
+
 #ifdef USE_THREADS
   scm_mutex_init (&reentry_barrier_mutex);
 #endif
index 42d1c5d..096ec00 100644 (file)
@@ -1,3 +1,13 @@
+1999-11-18  Gary Houston  <ghouston@freewire.co.uk>
+
+       * boot-9.scm (read-hash-extend to set up arrays): add 'l' for
+       long_long uniform vectors.
+
+1999-11-17  Gary Houston  <ghouston@freewire.co.uk>
+
+       * networking.scm (sethostent, setnetent, setprotoent, setservent):
+       take an optional argument STAYOPEN.  default is #f.
+
 1999-10-05  Jim Blandy  <jimb@savonarola.red-bean.com>
 
        * Makefile.in: Deleted from CVS repository.  Run the autogen.sh
index b1b0cd5..c9df726 100644 (file)
        (for-each (lambda (char template)
                    (read-hash-extend char
                                      (make-array-proc template)))
-                 '(#\b #\a #\u #\e #\s #\i #\c #\y   #\h)
-                 '(#t  #\a 1   -1  1.0 1/3 0+i #\nul s)))
+                 '(#\b #\a #\u #\e #\s #\i #\c #\y   #\h #\l)
+                 '(#t  #\a 1   -1  1.0 1/3 0+i #\nul s   l)))
       (let ((array-proc (lambda (c port)
                          (read:array c port))))
        (for-each (lambda (char) (read-hash-extend char array-proc))
index c3ccb63..8ca074e 100644 (file)
 (define (getservbyname name proto) (getserv name proto))
 (define (getservbyport port proto) (getserv port proto))
 
-(define (sethostent) (sethost #t))
-(define (setnetent) (setnet #t))
-(define (setprotoent) (setproto #t))
-(define (setservent) (setserv #t))
+(define (sethostent . stayopen) 
+  (if (pair? stayopen)
+      (sethost (car stayopen))
+      (sethost #f)))
+(define (setnetent . stayopen) 
+  (if (pair? stayopen)
+      (setnet (car stayopen))
+      (setnet #f)))
+(define (setprotoent . stayopen) 
+  (if (pair? stayopen)
+      (setproto (car stayopen))
+      (setproto #f)))
+(define (setservent . stayopen) 
+  (if (pair? stayopen)
+      (setserv (car stayopen))
+      (setserv #f)))
 
 (define (gethostent) (gethost))
 (define (getnetent) (getnet))
index 5cdcc95..578fec0 100644 (file)
@@ -1,3 +1,60 @@
+1999-11-18  Gary Houston  <ghouston@freewire.co.uk>
+
+       * socket.c (scm_htons, scm_ntohs, scm_htonl, scm_ntohl): new
+       functions for network data conversion.
+
+       * numbers.c (scm_num2long, scm_num2longlong):
+       throw out-of-range instead of wrong-type-arg if appropriate.
+       (scm_iint2str): handle -2^31 correctly.
+       (scm_num2long): handle -2^31 bignum correctly.
+       (scm_num2long_long): rewrite the bigdig case: basically copied 
+       from scm_num2long.
+       numbers.h: (SCM_BITSPERLONGLONG): deleted.
+
+       * unif.c (rapr1): use sprintf instead of intprint for unsigned
+       longs: intprint can't cope with large values.
+
+       * numbers.c (scm_num2ulong): check more consistently that the
+       input is not negative.  if it is, throw out-of-range instead of 
+       wrong-type-arg.
+
+       * ramap.c (scm_array_fill_int): don't limit fill to INUM for 
+       uvect, ivect or llvect.
+       Check that fill doesn't overflow short uniform array.
+
+       * __scm.h: add another long to the definition of long_long and
+       ulong_long.
+
+       * unif.c (scm_raprin1): use 'l' instead of "long_long" in the
+       print representation of llvect.  read can't handle more than
+       one character.
+       (scm_dimensions_to_uniform_array): make "fill" an optional argument
+       instead of a rest argument.
+
+       * tags.h (scm_tc7_llvect): wasn't defined anywhere, so use the free
+       tag 29 for now.
+
+       * __scm.h: don't mention LONGLONGS.
+
+       * unif.c, numbers.c, eq.c, gc.c, print.c, eval.c, ramap.c:
+       replace LONGLONGS with HAVE_LONG_LONGS as set by configure.
+
+1999-11-17  Gary Houston  <ghouston@freewire.co.uk>
+
+       * net_db.c (scm_inet_aton): throw errors using the misc-error key
+       instead of system-error.  inet_aton doesn't set errno.
+       system-error isn't right in gethost either, since it's throwing
+       the value of h_errno instead of errno. so:
+       (scm_host_not_found_key, scm_try_again_key,
+       scm_no_recovery_key, scm_no_data_key): new error keys.
+       (scm_resolv_error): new procedure, use the new keys.
+       (scm_gethost): call scm_resolv_error not scm_syserror_msg.
+
+1999-11-16  Gary Houston  <ghouston@freewire.co.uk>
+
+       * error.c: (various): use scm_cons instead of scm_listify
+       to build short lists.
+
 1999-11-03  Gary Houston  <ghouston@freewire.co.uk>
 
        * socket.c (scm_fill_sockaddr): zero the address structure before
index cd3e45c..7e5ee18 100644 (file)
@@ -127,7 +127,7 @@ scm_equal_p (x, y)
        case scm_tc7_bvect: case scm_tc7_uvect: case scm_tc7_ivect:
        case scm_tc7_fvect:     case scm_tc7_cvect: case scm_tc7_dvect:
        case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
        case scm_tc7_llvect:
 #endif
        case scm_tc7_byvect:
index 0c043b4..7fe02fb 100644 (file)
@@ -78,9 +78,11 @@ scm_error (key, subr, message, args, rest)
   scm_ithrow (key, arg_list, 1);
   
   /* No return, but just in case: */
+  {
+    const char msg[] = "guile:scm_error:scm_ithrow returned!\n";
 
-  write (2, "unhandled system error\n",
-        sizeof ("unhandled system error\n") - 1);
+    write (2, msg, (sizeof msg) - 1);
+  }
   exit (1);
 }
 
@@ -127,9 +129,8 @@ scm_syserror (subr)
   scm_error (scm_system_error_key,
             subr,
             "%s",
-            scm_listify (scm_makfrom0str (strerror (errno)),
-                         SCM_UNDEFINED),
-            scm_listify (SCM_MAKINUM (errno), SCM_UNDEFINED));
+            scm_cons (scm_makfrom0str (strerror (errno)), SCM_EOL),
+            scm_cons (SCM_MAKINUM (errno), SCM_EOL));
 }
 
 void
@@ -143,7 +144,7 @@ scm_syserror_msg (subr, message, args, eno)
             subr,
             message,
             args,
-            scm_listify (SCM_MAKINUM (eno), SCM_UNDEFINED));
+            scm_cons (SCM_MAKINUM (eno), SCM_EOL));
 }
 
 void
@@ -154,14 +155,14 @@ scm_sysmissing (subr)
   scm_error (scm_system_error_key,
             subr,
             "%s",
-            scm_listify (scm_makfrom0str (strerror (ENOSYS)), SCM_UNDEFINED),
-            scm_listify (SCM_MAKINUM (ENOSYS), SCM_UNDEFINED));
+            scm_cons (scm_makfrom0str (strerror (ENOSYS)), SCM_EOL),
+            scm_cons (SCM_MAKINUM (ENOSYS), SCM_EOL));
 #else
   scm_error (scm_system_error_key,
             subr,
             "Missing function",
             SCM_BOOL_F,
-            scm_listify (SCM_MAKINUM (0), SCM_UNDEFINED));
+            scm_cons (SCM_MAKINUM (0), SCM_EOL));
 #endif
 }
 
@@ -186,7 +187,7 @@ scm_out_of_range (subr, bad_value)
   scm_error (scm_out_of_range_key,
             subr,
             "Argument out of range: %S",
-            scm_listify (bad_value, SCM_UNDEFINED),
+            scm_cons (bad_value, SCM_EOL),
             SCM_BOOL_F);
 }
 
@@ -198,7 +199,7 @@ scm_wrong_num_args (proc)
   scm_error (scm_args_number_key,
             NULL,
             "Wrong number of arguments to %s",
-            scm_listify (proc, SCM_UNDEFINED),
+            scm_cons (proc, SCM_EOL),
             SCM_BOOL_F);
 }
 
@@ -213,8 +214,8 @@ scm_wrong_type_arg (subr, pos, bad_value)
             subr,
             (pos == 0) ? "Wrong type argument: %S"
             : "Wrong type argument in position %s: %S",
-            (pos == 0) ? scm_listify (bad_value, SCM_UNDEFINED)
-            : scm_listify (SCM_MAKINUM (pos), bad_value, SCM_UNDEFINED),
+            (pos == 0) ? scm_cons (bad_value, SCM_EOL)
+            : scm_cons (SCM_MAKINUM (pos), scm_cons (bad_value, SCM_EOL)),
             SCM_BOOL_F);
 }
 
@@ -291,9 +292,6 @@ scm_wta (arg, pos, s_subr)
   return SCM_UNSPECIFIED;
 }
 
-/*  obsolete interface: scm_everr (exp, env, arg, pos, s_subr)
-    was equivalent to scm_wta (arg, pos, s_subr)  */
-
 void
 scm_init_error ()
 {
index efbed28..b8cac11 100644 (file)
@@ -2539,7 +2539,7 @@ dispatch:
     case scm_tc7_fvect:
     case scm_tc7_dvect:
     case scm_tc7_cvect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
     case scm_tc7_string:
index 50d5cfc..57fbcf5 100644 (file)
@@ -754,7 +754,7 @@ gc_mark_nimp:
     case scm_tc7_dvect:
     case scm_tc7_cvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
 
@@ -1189,7 +1189,7 @@ scm_gc_sweep ()
                goto c8mrkcontinue;
              m += SCM_HUGE_LENGTH (scmptr) * sizeof (short);
              goto freechars;
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
            case scm_tc7_llvect:
              if SCM_GC8MARKP (scmptr)
                goto c8mrkcontinue;
index d2e6100..96253a9 100644 (file)
@@ -89,7 +89,7 @@ scm_inet_aton (address)
   if (SCM_SUBSTRP (address))
     address = scm_makfromstr (SCM_ROCHARS (address), SCM_ROLENGTH (address), 0);
   if (inet_aton (SCM_ROCHARS (address), &soka) == 0)
-    scm_syserror (s_inet_aton);
+    scm_misc_error (s_inet_aton, "bad address", SCM_EOL);
   return scm_ulong2num (ntohl (soka.s_addr));
 }
 
@@ -154,9 +154,55 @@ scm_inet_makeaddr (net, lna)
 }
 #endif
 
+SCM_SYMBOL (scm_host_not_found_key, "host-not-found");
+SCM_SYMBOL (scm_try_again_key, "try-again");
+SCM_SYMBOL (scm_no_recovery_key, "no-recovery");
+SCM_SYMBOL (scm_no_data_key, "no-data");
 
-/* !!! Doesn't take address format.
- * Assumes hostent stream isn't reused.
+static void scm_resolv_error (const char *subr, SCM bad_value)
+{
+  if (h_errno == NETDB_INTERNAL)
+    {
+      /* errno supposedly contains a useful value.  */
+      scm_syserror (subr);
+    }
+  else
+    {
+      SCM key;
+      const char *errmsg;
+
+      switch (h_errno)
+       {
+       case HOST_NOT_FOUND:
+         key = scm_host_not_found_key;
+         errmsg = "Unknown host"; 
+         break;
+       case TRY_AGAIN: 
+         key = scm_try_again_key;
+         errmsg = "Host name lookup failure";
+         break;
+       case NO_RECOVERY:
+         key = scm_no_recovery_key;
+         errmsg = "Unknown server error"; 
+         break;
+       case NO_DATA:
+         key = scm_no_data_key;
+         errmsg = "No address associated with name";
+         break;
+       default:
+         scm_misc_error (subr, "Unknown resolver error", SCM_EOL);
+         errmsg = NULL;
+       }
+
+#ifdef HAVE_HSTRERROR
+      errmsg = hstrerror (h_errno);
+#endif
+      scm_error (key, subr, errmsg, scm_cons (bad_value, SCM_EOL), SCM_EOL);
+    }
+}
+
+/* Should take an extra arg for address format (will be needed for IPv6).
+   Should use reentrant facilities if available.
  */
 
 SCM_PROC (s_gethost, "gethost", 0, 1, 0, scm_gethost);
@@ -201,21 +247,10 @@ scm_gethost (name)
       entry = gethostbyaddr ((char *) &inad, sizeof (inad), AF_INET);
     }
   if (!entry)
-    {
-      char *errmsg;
-      SCM args;
-      args = scm_listify (name, SCM_UNDEFINED);
-      switch (h_errno)
-       {
-       case HOST_NOT_FOUND: errmsg = "host %s not found"; break;
-       case TRY_AGAIN:      errmsg = "nameserver failure (try later)"; break;
-       case NO_RECOVERY:    errmsg = "non-recoverable error"; break;
-       case NO_DATA:        errmsg = "no address associated with %s"; break;
-       default:             errmsg = "undefined error"; break;
-       }
-      scm_syserror_msg (s_gethost, errmsg, args, h_errno);
-    }
-  ve[0] = scm_makfromstr (entry->h_name, (scm_sizet) strlen (entry->h_name), 0);
+    scm_resolv_error (s_gethost, name);
+  
+  ve[0] = scm_makfromstr (entry->h_name, 
+                         (scm_sizet) strlen (entry->h_name), 0);
   ve[1] = scm_makfromstrs (-1, entry->h_aliases);
   ve[2] = SCM_MAKINUM (entry->h_addrtype + 0L);
   ve[3] = SCM_MAKINUM (entry->h_length + 0L);
index 7695628..992b3dd 100644 (file)
@@ -972,7 +972,7 @@ scm_long2big (n)
   return ans;
 }
 
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
 
 SCM
 scm_long_long2big (n)
@@ -1720,34 +1720,34 @@ iflo2str (flt, str)
 }
 #endif /* SCM_FLOATS */
 
-
+/* convert a long to a string (unterminated).  returns the number of
+   characters in the result.  */
 scm_sizet
 scm_iint2str (num, rad, p)
      long num;
-     int rad;
-     char *p;
+     int rad;  /* output base.  */
+     char *p;  /* destination: worst case (base 2) is SCM_INTBUFLEN. */
 {
-  scm_sizet j;
-  register int i = 1, d;
-  register long n = num;
-  if (n < 0)
-    {
-      n = -n;
-      i++;
-    }
+  scm_sizet j = 1;
+  scm_sizet i;
+  unsigned long n = (num < 0) ? -num : num;
+
   for (n /= rad; n > 0; n /= rad)
-    i++;
-  j = i;
-  n = num;
-  if (n < 0)
+    j++;
+
+  i = j;
+  if (num < 0)
     {
-      n = -n;
       *p++ = '-';
-      i--;
+      j++;
+      n = -num;
     }
+  else
+    n = num;
   while (i--)
     {
-      d = n % rad;
+      int d = n % rad;
+
       n /= rad;
       p[i] = d + ((d < 10) ? '0' : 'a' - 10);
     }
@@ -4584,7 +4584,7 @@ scm_long2num (sl)
 }
 
 
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
 
 SCM
 scm_long_long2num (sl)
@@ -4635,51 +4635,64 @@ scm_num2long (num, pos, s_caller)
      const char *s_caller;
 {
   long res;
+
   if (SCM_INUMP (num))
     {
       res = SCM_INUM (num);
       return res;
     }
-  SCM_ASRTGO (SCM_NIMP (num), errout);
+  SCM_ASRTGO (SCM_NIMP (num), wrong_type_arg);
 #ifdef SCM_FLOATS
   if (SCM_REALP (num))
     {
-      double u = SCM_REALPART (num);
+      volatile double u = SCM_REALPART (num);
+
       res = u;
-      if ((double) res == u)
-       {
-         return res;
-       }
+      if (res != u)
+       goto out_of_range;
+      return res;
     }
 #endif
 #ifdef SCM_BIGDIG
   if (SCM_BIGP (num))
     {
-      long oldres;
+      unsigned long oldres = 0;
       scm_sizet l;
-      res = 0;
-      oldres = 0;
+      /* can't use res directly in case num is -2^31.  */
+      unsigned long pos_res = 0;
+
       for (l = SCM_NUMDIGS (num); l--;)
        {
-         res = SCM_BIGUP (res) + SCM_BDIGITS (num)[l];
-         if (res < oldres)
-           goto errout;
-         oldres = res;
+         pos_res = SCM_BIGUP (pos_res) + SCM_BDIGITS (num)[l];
+         /* check for overflow.  */
+         if (pos_res < oldres) 
+           goto out_of_range;
+         oldres = pos_res;
        }
       if (SCM_TYP16 (num) == scm_tc16_bigpos)
-       return res;
+       {
+         res = pos_res;
+         if (res < 0)
+           goto out_of_range;
+       }
       else
-       return -res;
+       {
+         res = -pos_res;
+         if (res > 0)
+           goto out_of_range;
+       }
+      return res;
     }
 #endif
- errout:
-  scm_wta (num, pos, s_caller);
-  return SCM_UNSPECIFIED;
+ wrong_type_arg:
+  scm_wrong_type_arg (s_caller, (int) pos, num);
+ out_of_range:
+  scm_out_of_range (s_caller, num);
 }
 
 
 
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
 
 long_long
 scm_num2long_long (num, pos, s_caller)
@@ -4688,38 +4701,60 @@ scm_num2long_long (num, pos, s_caller)
      const char *s_caller;
 {
   long_long res;
+
   if (SCM_INUMP (num))
     {
-      res = SCM_INUM ((long_long) num);
+      res = SCM_INUM (num);
       return res;
     }
-  SCM_ASRTGO (SCM_NIMP (num), errout);
+  SCM_ASRTGO (SCM_NIMP (num), wrong_type_arg);
 #ifdef SCM_FLOATS
   if (SCM_REALP (num))
     {
       double u = SCM_REALPART (num);
-      if (((SCM_MOST_NEGATIVE_FIXNUM * 4) <= u)
-         && (u <= (SCM_MOST_POSITIVE_FIXNUM * 4 + 3)))
-       {
-         res = u;
-         return res;
-       }
+
+      res = u;
+      if ((res < 0 && u > 0) || (res > 0 && u < 0)) /* check for overflow. */
+       goto out_of_range;
+
+      return res;
     }
 #endif
 #ifdef SCM_BIGDIG
   if (SCM_BIGP (num))
     {
-      scm_sizet l = SCM_NUMDIGS (num);
-      SCM_ASRTGO (SCM_DIGSPERLONGLONG >= l, errout);
-      res = 0;
-      for (; l--;)
-       res = SCM_LONGLONGBIGUP (res) + SCM_BDIGITS (num)[l];
+      unsigned long long oldres = 0;
+      scm_sizet l;
+      /* can't use res directly in case num is -2^63.  */
+      unsigned long long pos_res = 0;
+
+      for (l = SCM_NUMDIGS (num); l--;)
+       {
+         pos_res = SCM_LONGLONGBIGUP (pos_res) + SCM_BDIGITS (num)[l];
+         /* check for overflow.  */
+         if (pos_res < oldres) 
+           goto out_of_range;
+         oldres = pos_res;
+       }
+      if (SCM_TYP16 (num) == scm_tc16_bigpos)
+       {
+         res = pos_res;
+         if (res < 0)
+           goto out_of_range;
+       }
+      else
+       {
+         res = -pos_res;
+         if (res > 0)
+           goto out_of_range;
+       }
       return res;
     }
 #endif
- errout:
-  scm_wta (num, pos, s_caller);
-  return SCM_UNSPECIFIED;
+ wrong_type_arg:
+  scm_wrong_type_arg (s_caller, (int) pos, num);
+ out_of_range:
+  scm_out_of_range (s_caller, num);
 }
 #endif
 
@@ -4732,43 +4767,47 @@ scm_num2ulong (num, pos, s_caller)
      const char *s_caller;
 {
   unsigned long res;
+
   if (SCM_INUMP (num))
     {
-      res = SCM_INUM ((unsigned long) num);
+      if (SCM_INUM (num) < 0)
+       goto out_of_range;
+      res = SCM_INUM (num);
       return res;
     }
-  SCM_ASRTGO (SCM_NIMP (num), errout);
+  SCM_ASRTGO (SCM_NIMP (num), wrong_type_arg);
 #ifdef SCM_FLOATS
   if (SCM_REALP (num))
     {
       double u = SCM_REALPART (num);
-      if ((0 <= u) && (u <= (unsigned long) ~0L))
-       {
-         res = u;
-         return res;
-       }
+
+      res = u;
+      if (res != u)
+       goto out_of_range;
+      return res;
     }
 #endif
 #ifdef SCM_BIGDIG
   if (SCM_BIGP (num))
     {
-      unsigned long oldres;
+      unsigned long oldres = 0;
       scm_sizet l;
+
       res = 0;
-      oldres = 0;
       for (l = SCM_NUMDIGS (num); l--;)
        {
          res = SCM_BIGUP (res) + SCM_BDIGITS (num)[l];
          if (res < oldres)
-           goto errout;
+           goto out_of_range;
          oldres = res;
        }
       return res;
     }
 #endif
- errout:
-  scm_wta (num, pos, s_caller);
-  return SCM_UNSPECIFIED;
+ wrong_type_arg:
+  scm_wrong_type_arg (s_caller, (int) pos, num);
+ out_of_range:
+  scm_out_of_range (s_caller, num);
 }
 
 
index fbc87a3..d62de4c 100644 (file)
 
 # define SCM_BIGRAD (1L << SCM_BITSPERDIG)
 # define SCM_DIGSPERLONG ((scm_sizet)((sizeof(long)*SCM_CHAR_BIT+SCM_BITSPERDIG-1)/SCM_BITSPERDIG))
-# define SCM_DIGSPERLONGLONG ((scm_sizet)((sizeof(long long)*SCM_CHAR_BIT+SCM_BITSPERDIG-1)/SCM_BITSPERDIG))
 # define SCM_BIGUP(x) ((unsigned long)(x) << SCM_BITSPERDIG)
 # define SCM_LONGLONGBIGUP(x) ((ulong_long)(x) << SCM_BITSPERDIG)
 # define SCM_BIGDN(x) ((x) >> SCM_BITSPERDIG)
index 907e6c0..15ceaf9 100644 (file)
@@ -600,7 +600,7 @@ taloop:
        case scm_tc7_fvect:
        case scm_tc7_dvect:
        case scm_tc7_cvect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
        case scm_tc7_llvect:
 #endif
          scm_raprin1 (exp, port, pstate);
index f74de9a..d0957c9 100644 (file)
@@ -165,7 +165,7 @@ scm_ra_matchp (ra0, ras)
       case scm_tc7_uvect:
       case scm_tc7_ivect:
       case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
       case scm_tc7_llvect:
 #endif
       case scm_tc7_fvect:
@@ -202,7 +202,7 @@ scm_ra_matchp (ra0, ras)
            case scm_tc7_uvect:
            case scm_tc7_ivect:
            case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
            case scm_tc7_llvect:
 #endif
            case scm_tc7_fvect:
@@ -255,15 +255,16 @@ scm_ra_matchp (ra0, ras)
   return exact;
 }
 
-static char s_ra_mismatch[] = "array shape mismatch";
-
+/* array mapper: apply cproc to each dimension of the given arrays. */
 int 
 scm_ramapc (cproc, data, ra0, lra, what)
-     int (*cproc) ();
-     SCM data;
-     SCM ra0;
-     SCM lra;
-     const char *what;
+     int (*cproc) ();   /* procedure to call on normalised arrays:
+                          cproc (dest, source list) or
+                          cproc (dest, data, source list).  */
+     SCM data;          /* data to give to cproc or unbound.  */
+     SCM ra0;           /* destination array. */
+     SCM lra;           /* list of source arrays. */
+     const char *what;  /* caller, for error reporting. */
 {
   SCM inds, z;
   SCM vra0, ra1, vra1;
@@ -274,7 +275,7 @@ scm_ramapc (cproc, data, ra0, lra, what)
     {
     default:
     case 0:
-      scm_wta (ra0, s_ra_mismatch, what);
+      scm_wta (ra0, "array shape mismatch", what);
     case 2:
     case 3:
     case 4:                    /* Try unrolling arrays */
@@ -416,148 +417,165 @@ scm_array_fill_x (ra, fill)
   return SCM_UNSPECIFIED;
 }
 
-
+/* to be used as cproc in scm_ramapc to fill an array dimension with
+   "fill". */
 int 
 scm_array_fill_int (ra, fill, ignore)
      SCM ra;
      SCM fill;
      SCM ignore;
 {
-  scm_sizet i, n = SCM_ARRAY_DIMS (ra)->ubnd - SCM_ARRAY_DIMS (ra)->lbnd + 1;
+  scm_sizet i;
+  scm_sizet n = SCM_ARRAY_DIMS (ra)->ubnd - SCM_ARRAY_DIMS (ra)->lbnd + 1;
   long inc = SCM_ARRAY_DIMS (ra)->inc;
   scm_sizet base = SCM_ARRAY_BASE (ra);
+
   ra = SCM_ARRAY_V (ra);
-  switch SCM_TYP7
-    (ra)
+  switch SCM_TYP7 (ra)
+    {
+    default:
+      for (i = base; n--; i += inc)
+       scm_array_set_x (ra, fill, SCM_MAKINUM (i));
+      break;
+    case scm_tc7_vector:
+    case scm_tc7_wvect:
+      for (i = base; n--; i += inc)
+       SCM_VELTS (ra)[i] = fill;
+      break;
+    case scm_tc7_string:
+      SCM_ASRTGO (SCM_ICHRP (fill), badarg2);
+      for (i = base; n--; i += inc)
+       SCM_CHARS (ra)[i] = SCM_ICHR (fill);
+      break;
+    case scm_tc7_byvect:
+      if (SCM_ICHRP (fill))
+       fill = SCM_MAKINUM ((char) SCM_ICHR (fill));
+      SCM_ASRTGO (SCM_INUMP (fill)
+                 && -128 <= SCM_INUM (fill) && SCM_INUM (fill) < 128,
+                 badarg2);
+      for (i = base; n--; i += inc)
+       SCM_CHARS (ra)[i] = SCM_INUM (fill);
+      break;
+    case scm_tc7_bvect:
       {
-      default:
+       long *ve = (long *) SCM_VELTS (ra);
+       if (1 == inc && (n >= SCM_LONG_BIT || n == SCM_LENGTH (ra)))
+         {
+           i = base / SCM_LONG_BIT;
+           if (SCM_BOOL_F == fill)
+             {
+               if (base % SCM_LONG_BIT) /* leading partial word */
+                 ve[i++] &= ~(~0L << (base % SCM_LONG_BIT));
+               for (; i < (base + n) / SCM_LONG_BIT; i++)
+                 ve[i] = 0L;
+               if ((base + n) % SCM_LONG_BIT) /* trailing partial word */
+                 ve[i] &= (~0L << ((base + n) % SCM_LONG_BIT));
+             }
+           else if (SCM_BOOL_T == fill)
+             {
+               if (base % SCM_LONG_BIT)
+                 ve[i++] |= ~0L << (base % SCM_LONG_BIT);
+               for (; i < (base + n) / SCM_LONG_BIT; i++)
+                 ve[i] = ~0L;
+               if ((base + n) % SCM_LONG_BIT)
+                 ve[i] |= ~(~0L << ((base + n) % SCM_LONG_BIT));
+             }
+           else
+             badarg2:scm_wta (fill, (char *) SCM_ARG2, s_array_fill_x);
+         }
+       else
+         {
+           if (SCM_BOOL_F == fill)
+             for (i = base; n--; i += inc)
+               ve[i / SCM_LONG_BIT] &= ~(1L << (i % SCM_LONG_BIT));
+           else if (SCM_BOOL_T == fill)
+             for (i = base; n--; i += inc)
+               ve[i / SCM_LONG_BIT] |= (1L << (i % SCM_LONG_BIT));
+           else
+             goto badarg2;
+         }
+       break;
+      }
+    case scm_tc7_uvect:
+      {
+       unsigned long f = scm_num2ulong (fill, (char *) SCM_ARG2, 
+                                        s_array_fill_x);
+       unsigned long *ve = (long *) SCM_VELTS (ra);
+
        for (i = base; n--; i += inc)
-         scm_array_set_x (ra, fill, SCM_MAKINUM (i));
+         ve[i] = f;
        break;
-      case scm_tc7_vector:
-      case scm_tc7_wvect:
+      }
+    case scm_tc7_ivect:
+      {
+       long f = scm_num2long (fill, (char *) SCM_ARG2, s_array_fill_x);
+       long *ve = (long *) SCM_VELTS (ra);
+
        for (i = base; n--; i += inc)
-         SCM_VELTS (ra)[i] = fill;
+         ve[i] = f;
        break;
-      case scm_tc7_string:
-       SCM_ASRTGO (SCM_ICHRP (fill), badarg2);
+      }
+    case scm_tc7_svect:
+      SCM_ASRTGO (SCM_INUMP (fill), badarg2);
+      {
+       short f = SCM_INUM (fill);
+       short *ve = (short *) SCM_VELTS (ra);
+
+       if (f != SCM_INUM (fill))
+         scm_out_of_range (s_array_fill_x, fill);
        for (i = base; n--; i += inc)
-         SCM_CHARS (ra)[i] = SCM_ICHR (fill);
+         ve[i] = f;
        break;
-      case scm_tc7_byvect:
-       if (SCM_ICHRP (fill))
-         fill = SCM_MAKINUM ((char) SCM_ICHR (fill));
-       SCM_ASRTGO (SCM_INUMP (fill)
-                   && -128 <= SCM_INUM (fill) && SCM_INUM (fill) < 128,
-                   badarg2);
+      }
+#ifdef HAVE_LONG_LONGS
+    case scm_tc7_llvect:
+      {
+       long long f = scm_num2long_long (fill, (char *) SCM_ARG2, 
+                                        s_array_fill_x);
+       long long *ve = (long long *) SCM_VELTS (ra);
+
        for (i = base; n--; i += inc)
-         SCM_CHARS (ra)[i] = SCM_INUM (fill);
+         ve[i] = f;
        break;
-      case scm_tc7_bvect:
-       {
-         long *ve = (long *) SCM_VELTS (ra);
-         if (1 == inc && (n >= SCM_LONG_BIT || n == SCM_LENGTH (ra)))
-           {
-             i = base / SCM_LONG_BIT;
-             if (SCM_BOOL_F == fill)
-               {
-                 if (base % SCM_LONG_BIT) /* leading partial word */
-                   ve[i++] &= ~(~0L << (base % SCM_LONG_BIT));
-                 for (; i < (base + n) / SCM_LONG_BIT; i++)
-                   ve[i] = 0L;
-                 if ((base + n) % SCM_LONG_BIT) /* trailing partial word */
-                   ve[i] &= (~0L << ((base + n) % SCM_LONG_BIT));
-               }
-             else if (SCM_BOOL_T == fill)
-               {
-                 if (base % SCM_LONG_BIT)
-                   ve[i++] |= ~0L << (base % SCM_LONG_BIT);
-                 for (; i < (base + n) / SCM_LONG_BIT; i++)
-                   ve[i] = ~0L;
-                 if ((base + n) % SCM_LONG_BIT)
-                   ve[i] |= ~(~0L << ((base + n) % SCM_LONG_BIT));
-               }
-             else
-             badarg2:scm_wta (fill, (char *) SCM_ARG2, s_array_fill_x);
-           }
-         else
-           {
-             if (SCM_BOOL_F == fill)
-               for (i = base; n--; i += inc)
-                 ve[i / SCM_LONG_BIT] &= ~(1L << (i % SCM_LONG_BIT));
-             else if (SCM_BOOL_T == fill)
-               for (i = base; n--; i += inc)
-                 ve[i / SCM_LONG_BIT] |= (1L << (i % SCM_LONG_BIT));
-             else
-               goto badarg2;
-           }
-         break;
-       }
-      case scm_tc7_uvect:
-       SCM_ASRTGO (0 <= SCM_INUM (fill), badarg2);
-      case scm_tc7_ivect:
-       SCM_ASRTGO (SCM_INUMP (fill), badarg2);
-       {
-         long f = SCM_INUM (fill), *ve = (long *) SCM_VELTS (ra);
-         for (i = base; n--; i += inc)
-           ve[i] = f;
-         break;
-       }
-      case scm_tc7_svect:
-       SCM_ASRTGO (SCM_INUMP (fill), badarg2);
-       {
-         short f = SCM_INUM (fill), *ve = (short *) SCM_VELTS (ra);
-         for (i = base; n--; i += inc)
-           ve[i] = f;
-         break;
-       }
-#ifdef LONGLONGS
-      case scm_tc7_llvect:
-       SCM_ASRTGO (SCM_INUMP (fill), badarg2);
-       {
-         long long f = SCM_INUM (fill), *ve = (long long *) SCM_VELTS (ra);
-         for (i = base; n--; i += inc)
-           ve[i] = f;
-         break;
-       }
+      }
 #endif
 #ifdef SCM_FLOATS
 #ifdef SCM_SINGLES
-      case scm_tc7_fvect:
-       {
-         float f, *ve = (float *) SCM_VELTS (ra);
-         SCM_ASRTGO (SCM_NIMP (fill) && SCM_REALP (fill), badarg2);
-         f = SCM_REALPART (fill);
-         for (i = base; n--; i += inc)
-           ve[i] = f;
-         break;
-       }
+    case scm_tc7_fvect:
+      {
+       float f, *ve = (float *) SCM_VELTS (ra);
+       SCM_ASRTGO (SCM_NIMP (fill) && SCM_REALP (fill), badarg2);
+       f = SCM_REALPART (fill);
+       for (i = base; n--; i += inc)
+         ve[i] = f;
+       break;
+      }
 #endif /* SCM_SINGLES */
-      case scm_tc7_dvect:
-       {
-         double f, *ve = (double *) SCM_VELTS (ra);
-         SCM_ASRTGO (SCM_NIMP (fill) && SCM_REALP (fill), badarg2);
-         f = SCM_REALPART (fill);
-         for (i = base; n--; i += inc)
-           ve[i] = f;
-         break;
-       }
-      case scm_tc7_cvect:
-       {
-         double fr, fi;
-         double (*ve)[2] = (double (*)[2]) SCM_VELTS (ra);
-         SCM_ASRTGO (SCM_NIMP (fill) && SCM_INEXP (fill), badarg2);
-         fr = SCM_REALPART (fill);
-         fi = (SCM_CPLXP (fill) ? SCM_IMAG (fill) : 0.0);
-         for (i = base; n--; i += inc)
-           {
-             ve[i][0] = fr;
-             ve[i][1] = fi;
-           }
-         break;
-       }
-#endif /* SCM_FLOATS */
+    case scm_tc7_dvect:
+      {
+       double f, *ve = (double *) SCM_VELTS (ra);
+       SCM_ASRTGO (SCM_NIMP (fill) && SCM_REALP (fill), badarg2);
+       f = SCM_REALPART (fill);
+       for (i = base; n--; i += inc)
+         ve[i] = f;
+       break;
+      }
+    case scm_tc7_cvect:
+      {
+       double fr, fi;
+       double (*ve)[2] = (double (*)[2]) SCM_VELTS (ra);
+       SCM_ASRTGO (SCM_NIMP (fill) && SCM_INEXP (fill), badarg2);
+       fr = SCM_REALPART (fill);
+       fi = (SCM_CPLXP (fill) ? SCM_IMAG (fill) : 0.0);
+       for (i = base; n--; i += inc)
+         {
+           ve[i][0] = fr;
+           ve[i][1] = fi;
+         }
+       break;
       }
+#endif /* SCM_FLOATS */
+    }
   return 1;
 }
 
@@ -1830,7 +1848,7 @@ scm_array_index_map_x (ra, proc)
     case scm_tc7_uvect:
     case scm_tc7_ivect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
     case scm_tc7_fvect:
@@ -1963,7 +1981,7 @@ raeql_1 (ra0, as_equal, ra1)
              return 0;
          return 1;
        }
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
       case scm_tc7_llvect:
        {
          long long *v0 = (long long *) SCM_VELTS (ra0) + i0;
index 1447e94..dcaa32b 100644 (file)
 
 \f
 
+SCM_PROC (s_htons, "htons", 1, 0, 0, scm_htons);
+SCM
+scm_htons (SCM in)
+{
+  unsigned short c_in;
+
+  SCM_ASSERT (SCM_INUMP (in), in, SCM_ARG1, s_htons);
+  c_in = SCM_INUM (in);
+  if (c_in != SCM_INUM (in))
+    scm_out_of_range (s_htons, in);
+
+  return SCM_MAKINUM (htons (c_in));
+}
+
+SCM_PROC (s_ntohs, "ntohs", 1, 0, 0, scm_ntohs);
+SCM
+scm_ntohs (SCM in)
+{
+  unsigned short c_in;
+
+  SCM_ASSERT (SCM_INUMP (in), in, SCM_ARG1, s_ntohs);
+  c_in = SCM_INUM (in);
+  if (c_in != SCM_INUM (in))
+    scm_out_of_range (s_ntohs, in);
+
+  return SCM_MAKINUM (ntohs (c_in));
+}
+
+SCM_PROC (s_htonl, "htonl", 1, 0, 0, scm_htonl);
+SCM
+scm_htonl (SCM in)
+{
+  unsigned long c_in = scm_num2ulong (in, (char *) SCM_ARG1, s_htonl);
+
+  return scm_ulong2num (htonl (c_in));
+}
+
+SCM_PROC (s_ntohl, "ntohl", 1, 0, 0, scm_ntohl);
+SCM
+scm_ntohl (SCM in)
+{
+  unsigned long c_in = scm_num2ulong (in, (char *) SCM_ARG1, s_ntohl);
+
+  return scm_ulong2num (ntohl (c_in));
+}
+
 SCM_SYMBOL (sym_socket, "socket");
 static SCM scm_sock_fd_to_port SCM_P ((int fd, const char *proc));
 
index 70bcaeb..9116701 100644 (file)
 
 \f
 
-
-
-\f
-
-extern SCM scm_socket SCM_P ((SCM family, SCM style, SCM proto));
-extern SCM scm_socketpair SCM_P ((SCM family, SCM style, SCM proto));
-extern SCM scm_getsockopt SCM_P ((SCM sfd, SCM level, SCM optname));
-extern SCM scm_setsockopt SCM_P ((SCM sfd, SCM level, SCM optname, SCM value));
-extern SCM scm_shutdown SCM_P ((SCM sfd, SCM how));
-extern SCM scm_connect SCM_P ((SCM sockfd, SCM fam, SCM address, SCM args));
-extern SCM scm_bind SCM_P ((SCM sockfd, SCM fam, SCM address, SCM args));
-extern SCM scm_listen SCM_P ((SCM sfd, SCM backlog));
-extern SCM scm_accept SCM_P ((SCM sockfd));
-extern SCM scm_getsockname SCM_P ((SCM sockfd));
-extern SCM scm_getpeername SCM_P ((SCM sockfd));
-extern SCM scm_recv SCM_P ((SCM sockfd, SCM buff_or_size, SCM flags));
-extern SCM scm_send SCM_P ((SCM sockfd, SCM message, SCM flags));
-extern SCM scm_recvfrom SCM_P ((SCM sockfd, SCM buff_or_size, SCM flags, SCM offset, SCM length));
-extern SCM scm_sendto SCM_P ((SCM sockfd, SCM message, SCM fam, SCM address, SCM args_and_flags));
-extern void scm_init_socket SCM_P ((void));
+extern SCM scm_htons (SCM in);
+extern SCM scm_ntohs (SCM in);
+extern SCM scm_htonl (SCM in);
+extern SCM scm_ntohl (SCM in);
+extern SCM scm_socket (SCM family, SCM style, SCM proto);
+extern SCM scm_socketpair (SCM family, SCM style, SCM proto);
+extern SCM scm_getsockopt (SCM sfd, SCM level, SCM optname);
+extern SCM scm_setsockopt (SCM sfd, SCM level, SCM optname, SCM value);
+extern SCM scm_shutdown (SCM sfd, SCM how);
+extern SCM scm_connect (SCM sockfd, SCM fam, SCM address, SCM args);
+extern SCM scm_bind (SCM sockfd, SCM fam, SCM address, SCM args);
+extern SCM scm_listen (SCM sfd, SCM backlog);
+extern SCM scm_accept (SCM sockfd);
+extern SCM scm_getsockname (SCM sockfd);
+extern SCM scm_getpeername (SCM sockfd);
+extern SCM scm_recv (SCM sockfd, SCM buff_or_size, SCM flags);
+extern SCM scm_send (SCM sockfd, SCM message, SCM flags);
+extern SCM scm_recvfrom (SCM sockfd, SCM buff_or_size, SCM flags, SCM offset, SCM length);
+extern SCM scm_sendto (SCM sockfd, SCM message, SCM fam, SCM address, SCM args_and_flags);
+extern void scm_init_socket (void);
 
 #endif  /* SOCKETH */
index 5435fcf..a9b9acb 100644 (file)
@@ -333,12 +333,11 @@ typedef long SCM;
 #define scm_tc7_string         21
 #define scm_tc7_substring      23
 
-/* 29 is free! */
-
 /* Many of the following should be turned
  * into structs or smobs.  We need back some
  * of these 7 bit tags!
  */
+#define scm_tc7_llvect          29
 #define scm_tc7_pws            31
 #define scm_tc7_uvect          37
 #define scm_tc7_lvector                39
index 2158976..e1d934c 100644 (file)
@@ -68,7 +68,7 @@
  * double              dvect
  * complex double      cvect
  * short               svect
- * long_long           llvect
+ * long long           llvect
  */
 
 long scm_tc16_array;
@@ -122,7 +122,7 @@ scm_vector_set_length_x (vect, len)
     case scm_tc7_svect:
       sz = sizeof (short);
       break;
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       sz = sizeof (long_long);
       break;
@@ -233,7 +233,7 @@ scm_make_uve (k, prot)
          i = sizeof (short) * k;
          type = scm_tc7_svect;
        }
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
       else if (s == 'l')
        {
          i = sizeof (long_long) * k;
@@ -250,7 +250,8 @@ scm_make_uve (k, prot)
   if (SCM_IMP (prot) || !SCM_INEXP (prot))
 #endif
     /* Huge non-unif vectors are NOT supported. */
-    return scm_make_vector (SCM_MAKINUM (k), SCM_UNDEFINED);   /* no special scm_vector */
+    /* no special scm_vector */
+    return scm_make_vector (SCM_MAKINUM (k), SCM_UNDEFINED);
 #ifdef SCM_FLOATS
 #ifdef SCM_SINGLES
   else if (SCM_SINGP (prot))
@@ -274,11 +275,7 @@ scm_make_uve (k, prot)
 
   SCM_NEWCELL (v);
   SCM_DEFER_INTS;
-  {
-    char *m;
-    m = scm_must_malloc ((i ? i : 1L), "vector");
-    SCM_SETCHARS (v, (char *) m);
-  }
+  SCM_SETCHARS (v, (char *) scm_must_malloc (i ? i : 1, "vector"));
   SCM_SETLENGTH (v, (k < SCM_LENGTH_MAX ? k : SCM_LENGTH_MAX), type);
   SCM_ALLOW_INTS;
   return v;
@@ -307,7 +304,7 @@ scm_uniform_vector_length (v)
     case scm_tc7_vector:
     case scm_tc7_wvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
       return SCM_MAKINUM (SCM_LENGTH (v));
@@ -355,7 +352,7 @@ loop:
                  && SCM_SYMBOLP (prot)
                  && (1 == SCM_LENGTH (prot))
                  && ('s' == SCM_CHARS (prot)[0])));
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       return (   nprot
              || (SCM_NIMP (prot)
@@ -403,7 +400,7 @@ scm_array_rank (ra)
     case scm_tc7_fvect:
     case scm_tc7_cvect:
     case scm_tc7_dvect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
     case scm_tc7_svect:
@@ -442,7 +439,7 @@ scm_array_dimensions (ra)
     case scm_tc7_cvect:
     case scm_tc7_dvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
       return scm_cons (SCM_MAKINUM (SCM_LENGTH (ra)), SCM_EOL);
@@ -556,7 +553,7 @@ scm_shap2ra (args, what)
   return ra;
 }
 
-SCM_PROC(s_dimensions_to_uniform_array, "dimensions->uniform-array", 2, 0, 1, scm_dimensions_to_uniform_array);
+SCM_PROC(s_dimensions_to_uniform_array, "dimensions->uniform-array", 2, 1, 0, scm_dimensions_to_uniform_array);
 
 SCM 
 scm_dimensions_to_uniform_array (dims, prot, fill)
@@ -572,15 +569,10 @@ scm_dimensions_to_uniform_array (dims, prot, fill)
     {
       if (SCM_INUM (dims) < SCM_LENGTH_MAX)
        {
-         SCM answer;
-         answer = scm_make_uve (SCM_INUM (dims), prot);
-         if (SCM_NNULLP (fill))
-           {
-             SCM_ASSERT (1 == scm_ilength (fill),
-                         scm_makfrom0str (s_dimensions_to_uniform_array),
-                         SCM_WNA, NULL);
-             scm_array_fill_x (answer, SCM_CAR (fill));
-           }
+         SCM answer = scm_make_uve (SCM_INUM (dims), prot);
+
+         if (!SCM_UNBNDP (fill))
+           scm_array_fill_x (answer, fill);
          else if (SCM_NIMP (prot) && SCM_SYMBOLP (prot))
            scm_array_fill_x (answer, SCM_MAKINUM (0));
          else
@@ -633,12 +625,9 @@ scm_dimensions_to_uniform_array (dims, prot, fill)
       SCM_ARRAY_V (ra) = scm_make_uve (rlen, prot);
       *((long *) SCM_VELTS (SCM_ARRAY_V (ra))) = rlen;
     }
-  if (SCM_NNULLP (fill))
+  if (!SCM_UNBNDP (fill))
     {
-      SCM_ASSERT (1 == scm_ilength (fill),
-                 scm_makfrom0str (s_dimensions_to_uniform_array), SCM_WNA,
-                 NULL);
-      scm_array_fill_x (ra, SCM_CAR (fill));
+      scm_array_fill_x (ra, fill);
     }
   else if (SCM_NIMP (prot) && SCM_SYMBOLP (prot))
     scm_array_fill_x (ra, SCM_MAKINUM (0));
@@ -815,7 +804,7 @@ scm_transpose_array (args)
     case scm_tc7_dvect:
     case scm_tc7_cvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
       SCM_ASSERT (SCM_NIMP (args) && SCM_NULLP (SCM_CDR (args)),
@@ -917,7 +906,7 @@ scm_enclose_array (axes)
     case scm_tc7_vector:
     case scm_tc7_wvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
       s->lbnd = 0;
@@ -1035,7 +1024,7 @@ tail:
     case scm_tc7_dvect:
     case scm_tc7_cvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
     case scm_tc7_vector:
@@ -1129,7 +1118,7 @@ scm_uniform_vector_ref (v, args)
 
     case scm_tc7_svect:
       return SCM_MAKINUM (((short *) SCM_CDR (v))[pos]);
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       return scm_long_long2num (((long_long *) SCM_CDR (v))[pos]);
 #endif
@@ -1160,8 +1149,7 @@ scm_cvref (v, pos, last)
      scm_sizet pos;
      SCM last;
 {
-  switch SCM_TYP7
-    (v)
+  switch SCM_TYP7 (v)
     {
     default:
       scm_wta (v, (char *) SCM_ARG1, "PROGRAMMING ERROR: scm_cvref");
@@ -1186,7 +1174,7 @@ scm_cvref (v, pos, last)
 # endif    
     case scm_tc7_svect:
       return SCM_MAKINUM (((short *) SCM_CDR (v))[pos]);
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       return scm_long_long2num (((long_long *) SCM_CDR (v))[pos]);
 #endif
@@ -1319,7 +1307,7 @@ scm_array_set_x (v, obj, args)
       SCM_ASRTGO (SCM_INUMP (obj), badobj);
       ((short *) SCM_CDR (v))[pos] = SCM_INUM (obj);
       break;
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       ((long_long *) SCM_CDR (v))[pos] = scm_num2long_long (obj, (char *)SCM_ARG2, s_array_set_x);
       break;
@@ -1349,18 +1337,19 @@ scm_array_set_x (v, obj, args)
   return SCM_UNSPECIFIED;
 }
 
+/* extract an array from "ra" (regularised?), which may be an smob type.
+   returns #f on failure.  */
 SCM_PROC(s_array_contents, "array-contents", 1, 1, 0, scm_array_contents);
 
 SCM 
 scm_array_contents (ra, strict)
      SCM ra;
-     SCM strict;
+     SCM strict;  /* more checks if not SCM_UNDEFINED.  */
 {
   SCM sra;
   if (SCM_IMP (ra))
     return SCM_BOOL_F;
-  switch SCM_TYP7
-    (ra)
+  switch SCM_TYP7 (ra)
     {
     default:
       return SCM_BOOL_F;
@@ -1375,7 +1364,7 @@ scm_array_contents (ra, strict)
     case scm_tc7_dvect:
     case scm_tc7_cvect:
     case scm_tc7_svect:
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
 #endif
       return ra;
@@ -1500,7 +1489,7 @@ loop:
     case scm_tc7_svect:
       sz = sizeof (short);
       break;
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       sz = sizeof (long_long);
       break;
@@ -1650,7 +1639,7 @@ loop:
     case scm_tc7_svect:
       sz = sizeof (short);
       break;
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       sz = sizeof (long_long);
       break;
@@ -1725,8 +1714,7 @@ scm_bit_count (item, seq)
   long i;
   register unsigned long cnt = 0, w;
   SCM_ASSERT (SCM_NIMP (seq), seq, SCM_ARG2, s_bit_count);
-  switch SCM_TYP7
-    (seq)
+  switch SCM_TYP7 (seq)
     {
     default:
       scm_wta (seq, (char *) SCM_ARG2, s_bit_count);
@@ -1768,8 +1756,7 @@ scm_bit_position (item, v, k)
          k, SCM_OUTOFRANGE, s_bit_position);
   if (pos == SCM_LENGTH (v))
     return SCM_BOOL_F;
-  switch SCM_TYP7
-    (v)
+  switch SCM_TYP7 (v)
     {
     default:
       scm_wta (v, (char *) SCM_ARG2, s_bit_position);
@@ -1832,14 +1819,12 @@ scm_bit_set_star_x (v, kv, obj)
   register long i, k, vlen;
   SCM_ASRTGO (SCM_NIMP (v), badarg1);
   SCM_ASRTGO (SCM_NIMP (kv), badarg2);
-  switch SCM_TYP7
-    (kv)
+  switch SCM_TYP7 (kv)
     {
     default:
     badarg2:scm_wta (kv, (char *) SCM_ARG2, s_bit_set_star_x);
     case scm_tc7_uvect:
-      switch SCM_TYP7
-       (v)
+      switch SCM_TYP7 (v)
        {
        default:
        badarg1:scm_wta (v, (char *) SCM_ARG1, s_bit_set_star_x);
@@ -1891,8 +1876,7 @@ scm_bit_count_star (v, kv, obj)
   register unsigned long k;
   SCM_ASRTGO (SCM_NIMP (v), badarg1);
   SCM_ASRTGO (SCM_NIMP (kv), badarg2);
-  switch SCM_TYP7
-    (kv)
+  switch SCM_TYP7 (kv)
     {
     default:
     badarg2:scm_wta (kv, (char *) SCM_ARG2, s_bit_count_star);
@@ -2099,7 +2083,7 @@ scm_array_to_list (v)
        res = scm_cons(SCM_MAKINUM (data[k]), res);
       return res;
     }
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect: {
       long_long *data;
       data = (long_long *)SCM_VELTS(v);
@@ -2243,8 +2227,7 @@ rapr1 (ra, j, k, port, pstate)
   long n = SCM_LENGTH (ra);
   int enclosed = 0;
 tail:
-  switch SCM_TYP7
-    (ra)
+  switch SCM_TYP7 (ra)
     {
     case scm_tc7_smob:
       if (enclosed++)
@@ -2290,6 +2273,7 @@ tail:
       ra = SCM_ARRAY_V (ra);
       goto tail;
     default:
+      /* scm_tc7_bvect and scm_tc7_llvect only?  */
       if (n-- > 0)
        scm_iprin1 (scm_uniform_vector_ref (ra, SCM_MAKINUM (j)), port, pstate);
       for (j += inc; n-- > 0; j += inc)
@@ -2322,6 +2306,22 @@ tail:
       break;
 
     case scm_tc7_uvect:
+      {
+       char str[11];
+
+       if (n-- > 0)
+         {
+           /* intprint can't handle >= 2^31.  */
+           sprintf (str, "%lu", (unsigned long) SCM_VELTS (ra)[j]);
+           scm_puts (str, port);
+         }
+       for (j += inc; n-- > 0; j += inc)
+         {
+           scm_putc (' ', port);
+           sprintf (str, "%lu", (unsigned long) SCM_VELTS (ra)[j]);
+           scm_puts (str, port);
+         }
+      }
     case scm_tc7_ivect:
       if (n-- > 0)
        scm_intprint (SCM_VELTS (ra)[j], 10, port);
@@ -2405,8 +2405,7 @@ scm_raprin1 (exp, port, pstate)
   scm_sizet base = 0;
   scm_putc ('#', port);
 tail:
-  switch SCM_TYP7
-    (v)
+  switch SCM_TYP7 (v)
     {
     case scm_tc7_smob:
       {
@@ -2471,9 +2470,9 @@ tail:
     case scm_tc7_svect:
       scm_putc ('h', port);
       break;
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
-      scm_puts ("long_long", port);
+      scm_putc ('l', port);
       break;
 #endif
 #ifdef SCM_FLOATS
@@ -2531,7 +2530,7 @@ loop:
       return SCM_MAKINUM (-1L);
     case scm_tc7_svect:
       return SCM_CDR (scm_intern ("s", 1));
-#ifdef LONGLONGS
+#ifdef HAVE_LONG_LONGS
     case scm_tc7_llvect:
       return SCM_CDR (scm_intern ("l", 1));
 #endif