home *** CD-ROM | disk | FTP | other *** search
- ;;; -*- Mode: common-lisp; Package: xlib; Base: 10; Lowercase: Yes -*-
- ;;;
- ;;; CLX -- exclcmac.cl
- ;;; This file provides for inline expansion of some functions.
- ;;;
- ;;; Copyright (c) 1989 Franz Inc, Berkeley, Ca.
- ;;;
- ;;; Permission is granted to any individual or institution to use, copy,
- ;;; modify, and distribute this software, provided that this complete
- ;;; copyright and permission notice is maintained, intact, in all copies and
- ;;; supporting documentation.
- ;;;
- ;;; Franz Incorporated provides this software "as is" without
- ;;; express or implied warranty.
- ;;;
-
- (in-package :xlib)
-
- ;;
- ;; Type predicates
- ;;
- (excl:defcmacro card8p (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- (declare (optimize (speed 3) (safety 0))
- (fixnum ,xx))
- (and (excl:fixnump ,xx) (> #.(expt 2 8) ,xx) (>= ,xx 0)))))
-
- (excl:defcmacro card16p (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- (declare (optimize (speed 3) (safety 0))
- (fixnum ,xx))
- (and (excl:fixnump ,xx) (> #.(expt 2 16) ,xx) (>= ,xx 0)))))
-
- (excl:defcmacro int8p (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- (declare (optimize (speed 3) (safety 0))
- (fixnum ,xx))
- (and (excl:fixnump ,xx) (> #.(expt 2 7) ,xx) (>= ,xx #.(expt -2 7))))))
-
- (excl:defcmacro int16p (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- (declare (optimize (speed 3) (safety 0))
- (fixnum ,xx))
- (and (excl:fixnump ,xx) (> #.(expt 2 15) ,xx) (>= ,xx #.(expt -2 15))))))
-
- ;; Card29p, card32p, int32p are too large to expand inline
-
-
- ;;
- ;; Type transformers
- ;;
- (excl:defcmacro card8->int8 (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- ,(declare-bufmac)
- (declare (type card8 ,xx))
- (the int8 (if (logbitp 7 ,xx)
- (the int8 (- ,xx #x100))
- ,xx)))))
- (excl:defcmacro int8->card8 (x)
- `(locally ,(declare-bufmac)
- (the card8 (ldb (byte 8 0) (the int8 ,x)))))
-
- (excl:defcmacro card16->int16 (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- ,(declare-bufmac)
- (declare (type card16 ,xx))
- (the int16 (if (logbitp 15 ,xx)
- (the int16 (- ,xx #x10000))
- ,xx)))))
-
- (excl:defcmacro int16->card16 (x)
- `(locally ,(declare-bufmac)
- (the card16 (ldb (byte 16 0) (the int16 ,x)))))
-
- (excl:defcmacro card32->int32 (x)
- (let ((xx (gensym)))
- `(let ((,xx ,x))
- ,(declare-bufmac)
- (declare (type card32 ,xx))
- (the int32 (if (logbitp 31 ,xx)
- (the int32 (- ,xx #x100000000))
- ,xx)))))
-
- (excl:defcmacro int32->card32 (x)
- `(locally ,(declare-bufmac)
- (the card32 (ldb (byte 32 0) (the int32 ,x)))))
-
- (excl:defcmacro char->card8 (char)
- `(locally ,(declare-bufmac)
- (the card8 (char-code (the string-char ,char)))))
-
- (excl:defcmacro card8->char (card8)
- `(locally ,(declare-bufmac)
- (the string-char (code-char (the card8 ,card8)))))
-
-
- ;;
- ;; Array accessors and setters
- ;;
- (excl:defcmacro aref-card8 (a i)
- `(locally ,(declare-bufmac)
- (the card8 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-byte))))
-
- (excl:defcmacro aset-card8 (v a i)
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-byte)
- (the card8 ,v))))
-
- (excl:defcmacro aref-int8 (a i)
- `(locally ,(declare-bufmac)
- (the int8 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :signed-byte))))
-
- (excl:defcmacro aset-int8 (v a i)
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :signed-byte)
- (the int8 ,v))))
-
- (excl:defcmacro aref-card16 (a i)
- `(locally ,(declare-bufmac)
- (the card16 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-word))))
-
- (excl:defcmacro aset-card16 (v a i)
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-word)
- (the card16 ,v))))
-
- (excl:defcmacro aref-int16 (a i)
- `(locally ,(declare-bufmac)
- (the int16 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :signed-word))))
-
- (excl:defcmacro aset-int16 (v a i)
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :signed-word)
- (the int16 ,v))))
-
- (excl:defcmacro aref-card32 (a i)
- `(locally ,(declare-bufmac)
- (the card32 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-long))))
-
- (excl:defcmacro aset-card32 (v a i)
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-long)
- (the card32 ,v))))
-
- (excl:defcmacro aref-int32 (a i)
- `(locally ,(declare-bufmac)
- (the int32 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :signed-long))))
-
- (excl:defcmacro aset-int32 (v a i)
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :signed-long)
- (the int32 ,v))))
-
- (excl:defcmacro aref-card29 (a i)
- ;; Don't need to mask bits here since X protocol guarantees top bits zero
- `(locally ,(declare-bufmac)
- (the card29 (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-long))))
-
- (excl:defcmacro aset-card29 (v a i)
- ;; I also assume here Lisp is passing a number that fits in 29 bits.
- `(locally ,(declare-bufmac)
- (setf (sys:memref (the buffer-bytes ,a)
- #.(comp::mdparam 'comp::md-svector-data0-adj)
- (the array-index ,i)
- :unsigned-long)
- (the card29 ,v))))
-
- ;;
- ;; Font accessors
- ;;
- (excl:defcmacro font-id (font)
- ;; Get font-id, opening font if needed
- (let ((f (gensym)))
- `(let ((,f ,font))
- (or (font-id-internal ,f)
- (open-font-internal ,f)))))
-
- (excl:defcmacro font-font-info (font)
- (let ((f (gensym)))
- `(let ((,f ,font))
- (or (font-font-info-internal ,f)
- (query-font ,f)))))
-
- (excl:defcmacro font-char-infos (font)
- (let ((f (gensym)))
- `(let ((,f ,font))
- (or (font-char-infos-internal ,f)
- (progn (query-font ,f)
- (font-char-infos-internal ,f))))))
-
-
- ;;
- ;; Miscellaneous
- ;;
- (excl:defcmacro current-process ()
- `(the (or mp::process null) (and mp::*scheduler-stack-group*
- mp::*current-process*)))
-
- (excl:defcmacro process-wakeup (process)
- (let ((proc (gensym)))
- `(let ((.pw-curproc. mp::*current-process*)
- (,proc ,process))
- (when (and .pw-curproc. ,proc)
- (if (> (mp::process-priority ,proc)
- (mp::process-priority .pw-curproc.))
- (mp::process-allow-schedule ,proc))))))
-
- (excl:defcmacro buffer-new-request-number (buffer)
- (let ((buf (gensym)))
- `(let ((,buf ,buffer))
- (declare (type buffer ,buf))
- (setf (buffer-request-number ,buf)
- (ldb (byte 16 0) (1+ (buffer-request-number ,buf)))))))
-
-
-