xref: /freebsd-14.2/usr.bin/dc/bcode.h (revision 7cd2dcf0)
1 /*	$FreeBSD$						*/
2 /*	$OpenBSD: bcode.h,v 1.5 2006/01/16 08:09:25 otto Exp $	*/
3 
4 /*
5  * Copyright (c) 2003, Otto Moerbeek <[email protected]>
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 void			 scale_number(BIGNUM *, int);
89 void			 normalize(struct number *, u_int);
90 void			 eval(void);
91 void			 pn(const char *, const struct number *);
92 void			 pbn(const char *, const BIGNUM *);
93 void			 negate(struct number *);
94 void			 split_number(const struct number *, BIGNUM *, BIGNUM *);
95 void			 bmul_number(struct number *, struct number *,
96 			    struct number *);
97 
98 extern BIGNUM		 zero;
99