r1807: *** empty log message ***
[uffi.git] / examples / union.cl
1 ;;;; -*- Mode: LISP; Syntax: ANSI-Common-Lisp; Base: 10 -*-
2 ;;;; *************************************************************************
3 ;;;; FILE IDENTIFICATION
4 ;;;;
5 ;;;; Name:          union.cl
6 ;;;; Purpose:       UFFI Example file to test unions
7 ;;;; Programmer:    Kevin M. Rosenberg
8 ;;;; Date Started:  Mar 2002
9 ;;;;
10 ;;;; $Id: union.cl,v 1.7 2002/04/03 00:57:48 kevin Exp $
11 ;;;;
12 ;;;; This file, part of UFFI, is Copyright (c) 2002 by Kevin M. Rosenberg
13 ;;;;
14 ;;;; UFFI users are granted the rights to distribute and use this software
15 ;;;; as governed by the terms of the Lisp Lesser GNU Public License
16 ;;;; (http://opensource.franz.com/preamble.html), also known as the LLGPL.
17 ;;;; *************************************************************************
18
19 (in-package :cl-user)
20
21 (uffi:def-union tunion1 
22     (char :char)
23   (int :int)
24   (uint :unsigned-int)
25   (sf :float)
26   (df :double))
27
28 (defun run-union-1 ()
29   (let ((u (uffi:allocate-foreign-object 'tunion1)))
30     (setf (uffi:get-slot-value u 'tunion1 'uint)
31           #-sparc
32           (+ (* 1 (char-code #\A))
33              (* 256 (char-code #\B))
34              (* 65536 (char-code #\C))
35              (* 16777216 255))
36           #+(or sparc sparc-v9)
37           (+ (* 16777216 (char-code #\A))
38              (* 65536 (char-code #\B))
39              (* 256 (char-code #\C))
40              (* 1 255)))
41     (format *standard-output* "~&Should be #\A: ~S" 
42             (uffi:ensure-char-character 
43              (uffi:get-slot-value u 'tunion1 'char)))
44     (format *standard-output* "~&Should be negative number: ~D" 
45             (uffi:get-slot-value u 'tunion1 'int))
46     (format *standard-output* "~&Should be positive number: ~D"
47             (uffi:get-slot-value u 'tunion1 'uint))
48     (uffi:free-foreign-object u))
49   (values))
50
51 (defun test-union-1 ()
52   (let ((u (uffi:allocate-foreign-object 'tunion1)))
53     (setf (uffi:get-slot-value u 'tunion1 'uint)
54           #-sparc
55           (+ (* 1 (char-code #\A))
56              (* 256 (char-code #\B))
57              (* 65536 (char-code #\C))
58              (* 16777216 128))
59           #+(or sparc sparc-v9)
60           (+ (* 16777216 (char-code #\A))
61              (* 65536 (char-code #\B))
62              (* 256 (char-code #\C))
63              (* 1 128))) ;set signed bit
64     (util.test:test (uffi:ensure-char-character 
65                 (uffi:get-slot-value u 'tunion1 'char))
66                #\A
67                :test #'eql
68                :fail-info "Error with union character")
69     #-(or sparc sparc-v9)
70     (util.test:test (> 0 (uffi:get-slot-value u 'tunion1 'int))
71                t
72                :fail-info
73                "Error with negative int in union")
74     (util.test:test (plusp (uffi:get-slot-value u 'tunion1 'uint))
75                t
76                :fail-info
77                "Error with unsigned int in union")
78     (uffi:free-foreign-object u))
79   (values))
80
81 #+examples-uffi
82 (run-union-1)
83
84
85 #+test-uffi
86 (test-union-1)