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