1 /* $FreeBSD$ */ 2 /* $OpenBSD: bcode.h,v 1.7 2012/11/07 11:06:14 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 scale); 98 99 static __inline u_int 100 max(u_int a, u_int b) 101 { 102 103 return (a > b ? a : b); 104 } 105