xref: /freebsd/usr.bin/dc/bcode.h (revision eda14cbc264d6969b02f2b1994cef11148e914f1)
1 /*	$FreeBSD$						*/
2 /*	$OpenBSD: bcode.h,v 1.7 2012/11/07 11:06:14 otto Exp $	*/
3 
4 /*
5  * Copyright (c) 2003, Otto Moerbeek <otto@drijf.net>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <sys/types.h>
21 #include <openssl/bn.h>
22 
23 struct number {
24 	BIGNUM	*number;
25 	u_int	 scale;
26 };
27 
28 enum stacktype {
29 	BCODE_NONE,
30 	BCODE_NUMBER,
31 	BCODE_STRING
32 };
33 
34 enum bcode_compare {
35 	BCODE_EQUAL,
36 	BCODE_NOT_EQUAL,
37 	BCODE_LESS,
38 	BCODE_NOT_LESS,
39 	BCODE_GREATER,
40 	BCODE_NOT_GREATER
41 };
42 
43 struct array;
44 
45 struct value {
46 	union {
47 		struct number	*num;
48 		char		*string;
49 	} u;
50 	struct array	*array;
51 	enum stacktype	 type;
52 };
53 
54 struct array {
55 	struct value	*data;
56 	size_t		 size;
57 };
58 
59 struct stack {
60 	struct value	*stack;
61 	ssize_t		 size;
62 	ssize_t		 sp;
63 };
64 
65 struct source;
66 
67 struct vtable {
68 	int	(*readchar)(struct source *);
69 	void	(*unreadchar)(struct source *);
70 	char	*(*readline)(struct source *);
71 	void	(*free)(struct source *);
72 };
73 
74 struct source {
75 	union {
76 			struct {
77 				u_char	*buf;
78 				size_t	 pos;
79 			} string;
80 			FILE	*stream;
81 	} u;
82 	struct vtable	*vtable;
83 	int		 lastchar;
84 };
85 
86 void			init_bmachine(bool);
87 void			reset_bmachine(struct source *);
88 u_int			bmachine_scale(void);
89 void			scale_number(BIGNUM *, int);
90 void			normalize(struct number *, u_int);
91 void			eval(void);
92 void			pn(const char *, const struct number *);
93 void			pbn(const char *, const BIGNUM *);
94 void			negate(struct number *);
95 void			split_number(const struct number *, BIGNUM *, BIGNUM *);
96 void			bmul_number(struct number *, struct number *,
97 			    struct number *, u_int scale);
98 
99 static __inline u_int
100 max(u_int a, u_int b)
101 {
102 
103 	return (a > b ? a : b);
104 }
105