bcode.h revision 265533
1/* $FreeBSD: stable/10/usr.bin/dc/bcode.h 265533 2014-05-07 08:06:54Z delphij $ */ 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 23struct number { 24 BIGNUM *number; 25 u_int scale; 26}; 27 28enum stacktype { 29 BCODE_NONE, 30 BCODE_NUMBER, 31 BCODE_STRING 32}; 33 34enum 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 43struct array; 44 45struct value { 46 union { 47 struct number *num; 48 char *string; 49 } u; 50 struct array *array; 51 enum stacktype type; 52}; 53 54struct array { 55 struct value *data; 56 size_t size; 57}; 58 59struct stack { 60 struct value *stack; 61 ssize_t size; 62 ssize_t sp; 63}; 64 65struct source; 66 67struct vtable { 68 int (*readchar)(struct source *); 69 void (*unreadchar)(struct source *); 70 char *(*readline)(struct source *); 71 void (*free)(struct source *); 72}; 73 74struct 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 86void init_bmachine(bool); 87void reset_bmachine(struct source *); 88u_int bmachine_scale(void); 89void scale_number(BIGNUM *, int); 90void normalize(struct number *, u_int); 91void eval(void); 92void pn(const char *, const struct number *); 93void pbn(const char *, const BIGNUM *); 94void negate(struct number *); 95void split_number(const struct number *, BIGNUM *, BIGNUM *); 96void bmul_number(struct number *, struct number *, 97 struct number *, u_int scale); 98