#line 1566 "wrappers.nw" #include "xlisp.h" #include "xlwrap.h" #line 794 "wrappers.nw" DECLARE_CPTR_TYPE(void) #line 835 "wrappers.nw" LVAL xlgacptr(LVAL type, int null_ok) { LVAL p = xlgetarg(); if ((null(p) && null_ok) || (cptr_type_p(p,type) && getcpaddr(p) != NULL)) return p; else return xlbadtype(p); } #line 854 "wrappers.nw" LVAL cvcptr(LVAL type, void *v, LVAL data) { if (v == NULL) return NIL; else { LVAL ptr, val; xlprot1(data); xlsave1(ptr); ptr = newnatptr(v, data); val = newcptr(type,ptr); xlpopn(2); return val; } } #line 886 "wrappers.nw" LVAL xlw_make_cptr(LVAL type, size_t elsize) { LVAL data, count; FIXTYPE n = 1; if (moreargs()) { count = xlgafixnum(); n = getfixnum(count); if (n <= 0) xlbadtype(count); } xllastarg(); data = mktvec(n * elsize, s_c_char); return cvcptr(type, gettvecdata(data), data); } #line 910 "wrappers.nw" LVAL xlw_cast_cptr(LVAL type) { LVAL p = xlgetarg(); xllastarg(); if (cptrp(p)) /* won't be a NULL pointer */ return newcptr(type, getcpptr(p)); else if (natptrp(p)) /* need to check for NULL */ return getnpaddr(p) == NULL ? NIL : newcptr(type, p); else return xlbadtype(p); } #line 929 "wrappers.nw" LVAL xlw_offset_cptr(LVAL type, size_t elsize) { LVAL p = xlgetarg(); size_t off = getfixnum(xlgafixnum()) * elsize; xllastarg(); if (! cptr_type_p(p, type)) xlbadtype(p); return cvcptr(type, (char *) getcpaddr(p) + off, getcpprot(p)); } #line 952 "wrappers.nw" long lisp2long(LVAL x) { if (! fixp(x)) xlbadtype(x); return getfixnum(x); } #line 968 "wrappers.nw" LVAL ulong2lisp(unsigned long x) { if (x > MAXFIX) return cvtulongbignum(x, 0); else return cvfixnum((FIXTYPE) x); } #line 983 "wrappers.nw" unsigned long lisp2ulong(LVAL x) { if (! fixp(x)) xlbadtype(x); return (unsigned long) getfixnum(x); } #line 1327 "wrappers.nw" LVAL cvstrornil(char *s) { return s == NULL ? NIL : cvstring(s); }