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