From: <cli...@li...> - 2009-12-31 12:04:02
|
Send clisp-cvs mailing list submissions to cli...@li... To subscribe or unsubscribe via the World Wide Web, visit https://lists.sourceforge.net/lists/listinfo/clisp-cvs or, via email, send a message with subject or body 'help' to cli...@li... You can reach the person managing the list at cli...@li... When replying, please edit your Subject line so it is more specific than "Re: Contents of clisp-cvs digest..." CLISP CVS commits for today Today's Topics: 1. clisp/src ChangeLog, 1.7222, 1.7223 foreign.d, 1.199, 1.200 lispbibl.d, 1.899, 1.900 (Sam Steingold) 2. clisp/src ChangeLog,1.7223,1.7224 (Sam Steingold) ---------------------------------------------------------------------- Message: 1 Date: Wed, 30 Dec 2009 21:23:19 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog, 1.7222, 1.7223 foreign.d, 1.199, 1.200 lispbibl.d, 1.899, 1.900 To: cli...@li... Message-ID: <E1N...@sf...> Update of /cvsroot/clisp/clisp/src In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv10417/src Modified Files: ChangeLog foreign.d lispbibl.d Log Message: eliminate yet another static: allocaing_room_pointer * lispbibl.d (converter_malloc_t, convert_to_foreign): accept "void** state" argument * foreign.d (convert_to_foreign): ditto, pass it to converter_malloc (allocaing_room_pointer): remove (allocaing): accept address of allocaing_room_pointer (mallocing, nomalloc): accept and ignore the state argument (SET-FOREIGN-VALUE, WRITE-MEMORY-AS, FOREIGN-ALLOCATE. callback): pass NULL as state to convert_to_foreign (EXEC-ON-STACK, FOREIGN-CALL-OUT): declare and pass allocaing_room_pointer to convert_to_foreign Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.7222 retrieving revision 1.7223 diff -u -d -r1.7222 -r1.7223 --- ChangeLog 30 Dec 2009 04:21:34 -0000 1.7222 +++ ChangeLog 30 Dec 2009 21:23:16 -0000 1.7223 @@ -1,3 +1,17 @@ +2009-12-30 Sam Steingold <sd...@gn...> + + eliminate yet another static: allocaing_room_pointer + * lispbibl.d (converter_malloc_t, convert_to_foreign): accept + "void** state" argument + * foreign.d (convert_to_foreign): ditto, pass it to converter_malloc + (allocaing_room_pointer): remove + (allocaing): accept address of allocaing_room_pointer + (mallocing, nomalloc): accept and ignore the state argument + (SET-FOREIGN-VALUE, WRITE-MEMORY-AS, FOREIGN-ALLOCATE. callback): + pass NULL as state to convert_to_foreign + (EXEC-ON-STACK, FOREIGN-CALL-OUT): declare and pass + allocaing_room_pointer to convert_to_foreign + 2009-12-29 Sam Steingold <sd...@gn...> * io.d (token_escape_flag): remove global static variable, which Index: lispbibl.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/lispbibl.d,v retrieving revision 1.899 retrieving revision 1.900 diff -u -d -r1.899 -r1.900 --- lispbibl.d 21 Nov 2009 20:54:58 -0000 1.899 +++ lispbibl.d 30 Dec 2009 21:23:17 -0000 1.900 @@ -16978,17 +16978,17 @@ %% exportF(object,convert_from_foreign,(object fvd, const void* data)); /* Convert Lisp data to foreign data. */ -typedef void* converter_malloc_t (void* old_data, uintL size, uintL alignment); +typedef void* converter_malloc_t (void* old_data, uintL size, uintL alignment, void** state); global converter_malloc_t mallocing, nomalloc; -%% puts("typedef void* converter_malloc_t (void* old_data, uintL size, uintL alignment);"); +%% puts("typedef void* converter_malloc_t (void* old_data, uintL size, uintL alignment, void** state);"); %% exportV(converter_malloc_t,nomalloc); %% exportV(converter_malloc_t,mallocing); /* Convert Lisp data to foreign data. Storage is allocated through converter_malloc(). Only the toplevel storage must already exist; its address is given. - can trigger GC */ -extern void convert_to_foreign (object fvd, object obj, void* data, converter_malloc_t *converter_malloc); -%% exportF(void,convert_to_foreign,(object fvd, object obj, void* data, converter_malloc_t *converter_malloc)); + can trigger GC */ +extern void convert_to_foreign (object fvd, object obj, void* data, converter_malloc_t *converter_malloc, void** state); +%% exportF(void,convert_to_foreign,(object fvd, object obj, void* data, converter_malloc_t *converter_malloc, void** state)); /* Initialize the FFI. */ extern maygc void init_ffi (void); Index: foreign.d =================================================================== RCS file: /cvsroot/clisp/clisp/src/foreign.d,v retrieving revision 1.199 retrieving revision 1.200 diff -u -d -r1.199 -r1.200 --- foreign.d 21 Nov 2009 20:54:58 -0000 1.199 +++ foreign.d 30 Dec 2009 21:23:17 -0000 1.200 @@ -1923,8 +1923,8 @@ Only the toplevel storage must already exist; its address is given. can trigger GC */ modexp maygc void convert_to_foreign -(object fvd, object obj, void* data, converter_malloc_t *converter_malloc) -{ /* keep in sync with foreign1.lisp:convert-to-foreign */ +(object fvd, object obj, void* data, converter_malloc_t *converter_malloc, + void** state) { /* keep in sync with foreign1.lisp:convert-to-foreign */ check_SP(); check_STACK(); if (NULL == data) { @@ -1955,7 +1955,8 @@ unpack_sstring_alloca(string,len,offset, ptr1=); var uintL bytelen = cslen(O(foreign_encoding),ptr1,len); /* bytelen is the same as computed earlier in count_walk_pre. */ - var char* asciz = (char*)converter_malloc(*(char**)data,bytelen+1,1); + var char* asciz = + (char*)converter_malloc(*(char**)data,bytelen+1,1,state); cstombs(O(foreign_encoding),ptr1,len,(uintB*)asciz,bytelen); asciz[bytelen] = '\0'; *(char**)data = asciz; @@ -2123,14 +2124,14 @@ cumul_alignment = sas.alignment; /* Now we are finished with sas.size and sas.alignment. Descend into the structure slot: */ - convert_to_foreign(fvdi,obji,pdata,converter_malloc); + convert_to_foreign(fvdi,obji,pdata,converter_malloc,state); } skipSTACK(4); return; } else if (eq(fvdtype,S(c_union)) && (fvdlen > 1)) { /* Use the union's first component. */ convert_to_foreign(fvdlen > 2 ? (object)TheSvector(fvd)->data[2] : NIL, - obj,data,converter_malloc); + obj,data,converter_malloc,state); return; } else if (eq(fvdtype,S(c_array)) && (fvdlen > 1)) { var object eltype = TheSvector(fvd)->data[1]; @@ -2207,7 +2208,7 @@ /* pdata = (char*)data + i*eltype_size */ pushSTACK(STACK_0); pushSTACK(fixnum(i)); funcall(L(row_major_aref),2); - convert_to_foreign(STACK_1,value1,pdata,converter_malloc); + convert_to_foreign(STACK_1,value1,pdata,converter_malloc,state); } } skipSTACK(2); @@ -2289,7 +2290,7 @@ /* pdata = (char*)data + i*eltype_size */ pushSTACK(STACK_0); pushSTACK(fixnum(i)); funcall(L(aref),2); - convert_to_foreign(STACK_1,value1,pdata,converter_malloc); + convert_to_foreign(STACK_1,value1,pdata,converter_malloc,state); } if (len < maxdim) blockzero(pdata,eltype_size); @@ -2319,9 +2320,10 @@ fvd = TheSvector(fvd)->data[1]; var struct foreign_layout sas; foreign_layout(fvd,&sas); - var void* p = converter_malloc(*(void**)data,sas.size,sas.alignment); + var void* p = + converter_malloc(*(void**)data,sas.size,sas.alignment,state); *(void**)data = p; - convert_to_foreign(fvd,obj,p,converter_malloc); + convert_to_foreign(fvd,obj,p,converter_malloc,state); return; } else if (eq(fvdtype,S(c_pointer)) && (fvdlen == 2)) { if (faddressp(obj)) { @@ -2352,7 +2354,7 @@ var const chart* ptr1; unpack_sstring_alloca(string,clen,offset, ptr1=); var uintL blen = cslen(O(foreign_encoding),ptr1,clen); - var void* p = converter_malloc(*(void**)data,blen+1,1); + var void* p = converter_malloc(*(void**)data,blen+1,1,state); *(void**)data = p; cstombs(O(foreign_encoding),ptr1,clen,(uintB*)p,blen); ((uintB*)p)[blen] = '\0'; @@ -2364,7 +2366,7 @@ foreign_layout(eltype,&sas); var uintL eltype_size = sas.size; var void* p = converter_malloc(*(void**)data,(len+1)*eltype_size, - sas.alignment); + sas.alignment,state); *(void**)data = p; pushSTACK(eltype); pushSTACK(obj); @@ -2373,7 +2375,7 @@ for (i = 0; i < len; i++, p = (void*)((char*)p + eltype_size)) { pushSTACK(STACK_0); pushSTACK(fixnum(i)); funcall(L(aref),2); - convert_to_foreign(STACK_1,value1,p,converter_malloc); + convert_to_foreign(STACK_1,value1,p,converter_malloc,state); } } skipSTACK(2); @@ -2384,7 +2386,7 @@ } else { object inttype = gethash(fvd,O(foreign_inttype_table),false); if (!eq(inttype,nullobj)) { - convert_to_foreign(inttype,obj,data,converter_malloc); + convert_to_foreign(inttype,obj,data,converter_malloc,state); return; } } @@ -2398,15 +2400,15 @@ 1. convert_to_foreign_need(fvd,obj); 2. make room according to sas.size and sas.alignment, set allocaing_room_pointer. - 3. convert_to_foreign(fvd,obj,data,room_pointer,&allocaing); + 3. convert_to_foreign(fvd,obj,data,room_pointer,&allocaing, + &allocaing_room_pointer); can trigger GC */ -local var void* allocaing_room_pointer; -local void* allocaing (void* old_data, uintL size, uintL alignment) -{ - allocaing_room_pointer = (void*)(((uintP)allocaing_room_pointer - + alignment-1) & -(long)alignment); - var void* result = allocaing_room_pointer; - allocaing_room_pointer = (void*)((uintP)allocaing_room_pointer + size); +local void* allocaing (void* old_data, uintL size, uintL alignment, + void** allocaing_room_pointer) { + *allocaing_room_pointer = (void*)(((uintP)*allocaing_room_pointer + + alignment-1) & -(long)alignment); + var void* result = *allocaing_room_pointer; + *allocaing_room_pointer = (void*)((uintP)*allocaing_room_pointer + size); return result; } @@ -2415,7 +2417,8 @@ extent. (Not exactly indefinite extent: It is deallocated the next time free_foreign() is called on it.) can trigger GC */ -modexp void* mallocing (void* old_data, uintL size, uintL alignment) +modexp void* mallocing (void* old_data, uintL size, uintL alignment, + void** state) { return clisp_malloc(size); } /* Convert Lisp data to foreign data. @@ -2423,7 +2426,8 @@ DANGEROUS, especially for type C-STRING !! Also beware against NULL pointers! They are not treated specially. can trigger GC */ -modexp void* nomalloc (void* old_data, uintL size, uintL alignment) +modexp void* nomalloc (void* old_data, uintL size, uintL alignment, + void** state) { return old_data; } /* Error messages. */ @@ -2610,11 +2614,11 @@ Free old value: */ free_foreign(fvd,address); /* Put in new value: */ - convert_to_foreign(fvd,STACK_0,address,&mallocing); + convert_to_foreign(fvd,STACK_0,address,&mallocing,NULL); } else { /* Protect this using a semaphore?? Put in new value, reusing the old value's storage: */ - convert_to_foreign(fvd,STACK_0,address,&nomalloc); + convert_to_foreign(fvd,STACK_0,address,&nomalloc,NULL); } VALUES1(STACK_0); skipSTACK(2); @@ -2944,7 +2948,7 @@ STACK_0 = check_sint32(STACK_0); address = (void*)((uintP)address + (sintP)I_to_sint32(STACK_0)); } - convert_to_foreign(STACK_1,STACK_3,address,&nomalloc); + convert_to_foreign(STACK_1,STACK_3,address,&nomalloc,NULL); VALUES1(STACK_3); skipSTACK(4); } @@ -2982,8 +2986,9 @@ var void* result_address = (void*)((uintP)(total_room+result_alignment-1) & -(long)result_alignment); if (init) { - allocaing_room_pointer = (void*)((uintP)result_address + result_size); - convert_to_foreign(fvd,STACK_0,result_address,&allocaing); + void *allocaing_room_pointer = (void*)((uintP)result_address + result_size); + convert_to_foreign(fvd,STACK_0,result_address,&allocaing, + &allocaing_room_pointer); } else { blockzero(result_address,result_size); } @@ -3122,7 +3127,7 @@ var object initarg = STACK_3; if (boundp(initarg)) { STACK_0 = fvar; - convert_to_foreign(arg_fvd,initarg,arg_address,&mallocing); + convert_to_foreign(arg_fvd,initarg,arg_address,&mallocing,NULL); /* subr-self name is lost and GC may happen */ fvar = STACK_0; } @@ -3603,7 +3608,7 @@ cumul_size += (-cumul_size) & (cumul_alignment-1); var DYNAMIC_ARRAY(total_room,char,cumul_size+cumul_alignment/*-1*/); var void* result_address = (void*)((uintP)(total_room+result_alignment-1) & -(long)result_alignment); - allocaing_room_pointer = (void*)((uintP)result_address + result_size); + void *allocaing_room_pointer = (void*)((uintP)result_address + result_size); if (!eq(result_fvd,S(nil))) { pushSTACK(result_fvd); results[0].address = result_address; @@ -3657,7 +3662,8 @@ } else { /* Convert argument: */ pushSTACK(arg_fvd); /* save */ - convert_to_foreign(arg_fvd,arg,arg_address,&allocaing); + convert_to_foreign(arg_fvd,arg,arg_address,&allocaing, + &allocaing_room_pointer); arg_fvd = popSTACK(); /* restore */ if (arg_flags & ff_inout) { pushSTACK(TheSvector(arg_fvd)->data[1]); @@ -3678,9 +3684,9 @@ /* Convert argument: */ pushSTACK(arg_fvd); /* save */ if (arg_flags & ff_malloc) - convert_to_foreign(arg_fvd,arg,arg_address,&mallocing); + convert_to_foreign(arg_fvd,arg,arg_address,&mallocing,NULL); else - convert_to_foreign(arg_fvd,arg,arg_address,&nomalloc); + convert_to_foreign(arg_fvd,arg,arg_address,&nomalloc,NULL); arg_fvd = popSTACK(); /* restore */ if (arg_flags & ff_inout) { pushSTACK(TheSvector(arg_fvd)->data[1]); @@ -4154,7 +4160,7 @@ & -(long)result_alignment); /* Convert the result: */ convert_to_foreign(STACK_2,value1,result_address, - (flags & ff_malloc) ? &mallocing : &nomalloc); + (flags & ff_malloc) ? &mallocing : &nomalloc,NULL); /* Call va_return_xxx: */ begin_system_call(); do_va_return(flags,STACK_2,alist,result_address,result_size, ------------------------------ Message: 2 Date: Wed, 30 Dec 2009 22:30:30 +0000 From: Sam Steingold <sd...@us...> Subject: clisp/src ChangeLog,1.7223,1.7224 To: cli...@li... Message-ID: <E1N...@sf...> Update of /cvsroot/clisp/clisp/src In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv17448 Modified Files: ChangeLog Log Message: it's/its disambiguation Index: ChangeLog =================================================================== RCS file: /cvsroot/clisp/clisp/src/ChangeLog,v retrieving revision 1.7223 retrieving revision 1.7224 diff -u -d -r1.7223 -r1.7224 --- ChangeLog 30 Dec 2009 21:23:16 -0000 1.7223 +++ ChangeLog 30 Dec 2009 22:30:27 -0000 1.7224 @@ -36,9 +36,9 @@ (allocate_true): try first to allocate in heap hole (if any) * spvw_garcol.d (fill_varobject_heap_holes): initialize heap holes list (split_gen0_on_holes) [GENERATIONAL_GC]: split generation 0 if there is - a large hole at it's end + a large hole at its end (gar_col_normal): clear heap holes before performing GC. may be split - generation 0 if there is large hole at it's end. take into account + generation 0 if there is large hole at its end. take into account heap holes when computing used space * spvw_space.d (heap_holes_space): calculates space occupied by holes for reuse in given heap @@ -620,7 +620,7 @@ 2009-09-26 Vladimir Tzankov <vtz...@gm...> * package.d (intern) [MULTITHREAD]: search for symbol before locking - package (it's faster) + package (it is faster) 2009-09-25 Aleksej Saushev <as...@in...> @@ -1916,7 +1916,7 @@ [MULTITHREAD]: handle interrupts when the thread is still not entirely initialized * spvw.d (handle_pending_interrupts): check *DEFER-INTERRUPTS* for - SYMVALUE_EMPTY. it's possible to have interrupts while not yet + SYMVALUE_EMPTY. it is possible to have interrupts while not yet initialized with NIL * zthread.d (THREAD-INTERRUPT): :OVERRIDE is generalized boolean @@ -2242,7 +2242,7 @@ [MULTITHREAD]: fix SIGSEGV on nested interrupts with non-local exit * spvw.d (interrupt_thread_signal_handler) [MULTITHREAD]: just call - handle_pending_interrupts() if it's safe + handle_pending_interrupts() if it is safe (handle_pending_interrupts) [MULTITHREAD]: do not use clisp_thread_t _pending_interrupts as a counter but zero it (interrupt_thread): always increase thread's _pending_interrupts @@ -2330,7 +2330,7 @@ (GC_SAFE_ACK_SUSPEND_REQUEST_,GC_SAFE_REGION_END): use xmutex_raw_xxx and HANLDE_PENDING_INTERRUPTS. set/unset thread's _raw_wait_mutex (interrupt_thread): new global function for interrupting thread based - on it's current state + on its current state (GC_SAFE_MUTEX_LOCK): set/unset thread's _wait_mutex * zthread.d (THREAD-INTERRUPT): use interrupt_thread (EXEMPTION-WAIT): use HANDLE_PENDING_INTERRUPTS. set/unset thread's @@ -2483,7 +2483,7 @@ compliant now (too much inconsistencies and race conditions were introduced) * lispbibl.d [MULTITHREAD]: remove HADLE_PENDING_INTERRUPTS_XXX and - it's wrappers + its wrappers * spvw.d [MULTITHREAD]: revert was changes. use restartable system calls * unixaux.d [MULTITHREAD]: do not use handle_pending_interrupts on EINTR * xthread.d: remove xlock_t @@ -2545,11 +2545,11 @@ 2009-04-26 Vladimir Tzankov <vtz...@gm...> - (add_to_open_streams): prevent possible deadlock on async interrupts + prevent possible deadlock on async interrupts * stream.d (add_to_open_streams) [MULTITHREAD]: allocate new cons - before obtaining the lock. it's possible while allocating new cons to - get async interrupt that will exit non-locally - thus not releasing - open_files_lock + before obtaining the lock. it is possible while allocating new + cons to get an async interrupt that will exit non-locally - thus + not releasing open_files_lock 2009-04-26 Vladimir Tzankov <vtz...@gm...> @@ -2634,7 +2634,7 @@ (THREAD-ACTIVE-P): ditto (THREAD-INTERRUPT): reimplement (SYMBOL-VALUE-THREAD, SET-SYMBOL-VALUE-THREAD): lock the threads. - prevents thread termination while working with it's symvalues + prevents thread termination while working with its symvalues 2009-02-26 Vladimir Tzankov <vtz...@gm...> @@ -2667,7 +2667,7 @@ * lispbibl.d (GC_SAFE_ACK_SUSPEND_REQUEST_) [MULTITHREAD]: helper macro that acknowledges suspend request and waits for thread resume (GC_SAFE_POINT_IF): was GC_SAFE_POINT_ELSE. Check for suspend request - and executes one of it's parameters + and executes one of its parameters (GC_SAFE_SPINLOCK_ACQUIRE): use it * control.d (GO) [MULTITHREAD]: add safe point in order to be possible to interrupt infinite non-consing loop (in interpreter) @@ -2977,7 +2977,7 @@ fix image loading in multithread builds * spvw_memfile.d (loadmem_from_handle): do not update thread objects. - they were/will be initialized properly (in single thread it's just + they were/will be initialized properly (in single thread it is just aktenv) * spvw.d (init_memory): do not re-initialize the thread objects - they are not modified by loadmem_from_handle(); do not initialize @@ -5110,7 +5110,7 @@ multithread builds since. * eval.d (reset): restored it. no more "dummy stack end" for thread exit. - * threads.lisp (%THROW_TAG): throws it's argument. Needed in order + * threads.lisp (%THROW_TAG): throws its argument. Needed in order to interrupt thread by from signal handler. (THROW is special form and cannot be funcall-ed). * constsym.d (thread_throw_tag): symbol for accessing the @@ -5159,7 +5159,7 @@ (signal_handler_thread): more sane signal handling. No signal will be missed due to GC in progress. * spvw_global.d (gc_suspend/resume_all_threads): does not take - lock_thread parameter anymore. always acquires threads lock (it's + lock_thread parameter anymore. always acquires threads lock (it is safe due to the fact that all mutexes are recursive now). (add_per_thread_special_var): code cleanup. * spvw_allocate.d: changes due to GC_STOP/RESUME_WORLD parameter change. @@ -5249,7 +5249,7 @@ MAKE-THREAD anymore (almost - LISP stack is "leaked" on exit). fixed signal handler with DEBUG_GCSAFETY. (init_memory): initialize THREADS::*DEFAULT-VALUE-STACK-SIZE*. - (mt_main_actions): wrapper for main_actions() executed in it's own + (mt_main_actions): wrapper for main_actions() executed in its own thread. (main): the thread (C thread) executing main() does the signal handling - after creating mt_main_actions() thread. @@ -5407,15 +5407,15 @@ * threads.lisp (symbol-thread-value): exported from MT package. 2008-10-03 Vladimir Tzankov <vtz...@gm...> [threads] - Driver frame for new threads and initial special vars bindings + Driver frame for new threads and initial special vars bindings * lispbibl.d (threadp): macro for testing if an object is lisp thread object. * spvw.d (delete_thread): do not free per thread symvalues - leave them to release_threads (during GC). * zthread.d: some comments (release_threads): release the per thread symvalues. - (error_thread): signal type_error for it's argument (as error_list). + (error_thread): signal type_error for its argument (as error_list). (thread_stub): create a driver frame before calling thread function. compute initial special variables bindings before calling thread function. @@ -5459,7 +5459,7 @@ * spvw_global.d (add_per_thread_special_var): moved here from spvw.d. will "stop the world" when reallocating threads symvalues. (gc_suspend/resume_all_threads): additional parameter indicating - whether to acquire the thread lock (it's not recursive and the + whether to acquire the thread lock (it is not recursive and the caller may already own it). * spvw_allocate.d: pass additional parameter to GC_STOP/RESUME_WORLD(). * eval.d (interpret_bytecode_): fix GCSAFETY in cod_bind. @@ -5582,7 +5582,7 @@ (pinned_chain_t): all pinned objects within a thread are chained. (pin_varobject): make unwind-protect frame and add to the thread chain. (unpin_varobject_i): removes all elements from pinned chain until - it reaches it's argument + it reaches its argument (unpin_varobject): unpin already pinned object. * spvw.d (main): leave the pinned chain empty. * spvw_sigint.d (react_on_sigint): do not unpin any object. @@ -12532,7 +12532,7 @@ expansion, minimize number of calls to parse-c-type (from Sam Steingold's wishlist) and do not inline the value of parse-c-function, to preserve EQ tests (cf. foreign.d:equal_fvd). - * foreign1.lisp (note-c-fun): change API, but I argue it's not ABI + * foreign1.lisp (note-c-fun): change API, but I argue not ABI * foreign1.lisp (argvector-to-signature): remove 2006-01-26 Sam Steingold <sd...@gn...> ------------------------------ ------------------------------------------------------------------------------ This SF.Net email is sponsored by the Verizon Developer Community Take advantage of Verizon's best-in-class app development support A streamlined, 14 day to market process makes app distribution fast and easy Join now and get one step closer to millions of Verizon customers http://p.sf.net/sfu/verizon-dev2dev ------------------------------ _______________________________________________ clisp-cvs mailing list cli...@li... https://lists.sourceforge.net/lists/listinfo/clisp-cvs End of clisp-cvs Digest, Vol 44, Issue 12 ***************************************** |