2 ent-quatern.h -- Numeric types for SXEmacs
3 Copyright (C) 2005, 2006 Sebastian Freundt
5 Author: Sebastian Freundt
7 This file is part of SXEmacs
9 SXEmacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
14 SXEmacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #ifndef INCLUDED_ent_quatern_h_
24 #define INCLUDED_ent_quatern_h_
27 /* Uno complains about several inline functions that include conditions with
28 assignments and side effects if we don't do this */
34 #elif defined HAVE_BSDMP
37 # error "Bollocks, in your dreams, twit!"
40 extern Lisp_Object Qquatern;
49 typedef struct quatern quatern[1];
51 extern quatern ent_scratch_quatern;
54 /******************************** Quaterns ********************************/
57 struct lrecord_header lheader;
60 typedef struct Lisp_Quatern Lisp_Quatern;
62 DECLARE_LRECORD(quatern, Lisp_Quatern);
63 #define XQUATERN(x) XRECORD(x, quatern, Lisp_Quatern)
64 #define wrap_quatern(p) wrap_object(p)
65 #define QUATERNP(x) RECORDP(x, quatern)
66 #define CHECK_QUATERN(x) CHECK_RECORD(x, quatern)
67 #define CONCHECK_QUATERN(x) CONCHECK_RECORD(x, quatern)
69 #define quatern_data(f) ((f)->data)
70 #define XQUATERN_DATA(x) quatern_data(XQUATERN(x))
72 #define XQUATERN_Z(x) quatern_z(XQUATERN_DATA(x))
73 #define XQUATERN_I(x) quatern_i(XQUATERN_DATA(x))
74 #define XQUATERN_J(x) quatern_j(XQUATERN_DATA(x))
75 #define XQUATERN_K(x) quatern_k(XQUATERN_DATA(x))
77 #define QUATERN_ARITH_RETURN(f,op) do \
79 Lisp_Object retval = make_quatern(0L, 0L); \
80 quatern_##op(XQUATERN_DATA(retval), XQUATERN_DATA(f)); \
84 #define QUATERN_ARITH_RETURN1(f,op,arg) do \
86 Lisp_Object retval = make_quatern(0L, 0L); \
87 quatern_##op(XQUATERN_DATA(retval), XQUATERN_DATA(f), arg); \
91 extern Lisp_Object make_quatern(long, long, long, long);
92 extern Lisp_Object make_quatern_bz(bigz, bigz, bigz, bigz);
93 extern Lisp_Object make_quatern_qu(quatern);
96 /***** quatern: basic functions *****/
97 extern void quatern_init(quatern);
98 extern void quatern_fini(quatern);
99 extern unsigned long quatern_hashcode(quatern);
101 /***** Quatern: conversions *****/
102 extern Bufbyte *quatern_to_string(quatern, int);
104 /***** Quatern: converting assignments *****/
105 extern void quatern_set(quatern, quatern);
106 extern void quatern_set_long(quatern, long);
107 extern void quatern_set_ulong(quatern, unsigned long);
108 extern void quatern_set_bigz(quatern, bigz);
109 extern void quatern_set_long_long_long_long(quatern, long, long, long, long);
110 extern void quatern_set_ulong_ulong_ulong_ulong
111 (quatern, unsigned long, unsigned long, unsigned long, unsigned long);
112 extern void quatern_set_bigz_bigz_bigz_bigz(quatern, bigz, bigz, bigz, bigz);
114 #define quatern_z(q) ((q)->z)
115 #define quatern_i(q) ((q)->i)
116 #define quatern_j(q) ((q)->j)
117 #define quatern_k(q) ((q)->k)
119 /***** Quatern: comparisons *****/
120 extern int quatern_eql(quatern, quatern);
121 #define quatern_cmp(f1,f2) (quatern_eql(f1,f2) ? 0 : 1)
123 /***** Quatern: arithmetic *****/
124 extern void quatern_neg(quatern, quatern);
126 extern void quatern_abs(bigfr, quatern);
128 extern void quatern_norm(bigz, quatern);
129 extern void quatern_conj(quatern, quatern);
130 extern void quatern_add(quatern, quatern, quatern);
131 extern void quatern_sub(quatern, quatern, quatern);
132 extern void quatern_mul(quatern, quatern, quatern);
133 extern void quatern_div(quatern, quatern, quatern);
134 extern void quatern_mod(quatern, quatern, quatern);
135 extern void quatern_pow(quatern, quatern, unsigned long);
137 extern Lisp_Object read_quatern_string(char *);
138 extern int isquatern_string(const char *);
140 extern void init_optables_QUATERN_T(void);
141 extern void init_ent_quatern(void);
142 extern void syms_of_ent_quatern(void);
143 extern void vars_of_ent_quatern(void);
145 #endif /* INCLUDED_ent_quatern_h_ */