]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - usr.bin/dc/bcode.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / usr.bin / dc / bcode.h
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 <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);