xref: /netbsd/usr.bin/dc/bcode.h (revision 928a62ac)
1 /*	$OpenBSD: bcode.h,v 1.8 2015/02/16 20:53:34 jca Exp $	*/
2 
3 /*
4  * Copyright (c) 2003, Otto Moerbeek <otto@drijf.net>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #include <sys/types.h>
20 #include <openssl/bn.h>
21 
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		sp;
62 	size_t		size;
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 	struct vtable	*vtable;
76 	union {
77 			FILE *stream;
78 			struct {
79 				u_char *buf;
80 				size_t pos;
81 			} string;
82 	} u;
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