1 /* udis86 - libudis86/input.h 2 * 3 * Copyright (c) 2002-2009 Vivek Thampi 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without modification, 7 * are permitted provided that the following conditions are met: 8 * 9 * * Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * * Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 22 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 #ifndef UD_INPUT_H 27 #define UD_INPUT_H 28 29 #include "types.h" 30 #include "udint.h" 31 32 uint8_t ud_inp_next(struct ud* u); 33 34 /* 35 * inp_start 36 * Should be called before each de-code operation. 37 */ 38 static inline void 39 inp_start(struct ud *u) 40 { 41 u->inp_ctr = 0; 42 } 43 44 /* inp_reset 45 * Resets the current pointer to its position before the current 46 * instruction disassembly was started. 47 */ 48 static inline void 49 inp_reset(struct ud *u) 50 { 51 u->inp_curr -= u->inp_ctr; 52 u->inp_ctr = 0; 53 } 54 55 /* inp_sess 56 * Returns the pointer to current session. 57 */ 58 static inline uint8_t* 59 inp_sess(struct ud *u) 60 { 61 return u->inp_sess; 62 } 63 64 /* 65 * inp_curr 66 * Returns the current input byte. 67 */ 68 static inline uint8_t 69 inp_curr(const struct ud *u) 70 { 71 return u->inp_cache[u->inp_curr]; 72 } 73 74 /* 75 * inp_back 76 * Move back a single byte in the stream. 77 */ 78 static inline void 79 inp_back(struct ud* u) 80 { 81 if (u->inp_ctr > 0) { 82 --u->inp_curr; 83 --u->inp_ctr; 84 } 85 } 86 87 /* 88 * inp_peek 89 * Peek next byte in input. 90 */ 91 static inline uint8_t 92 inp_peek(struct ud* u) 93 { 94 uint8_t r = ud_inp_next(u); 95 if (!u->error) { 96 inp_back(u); /* Don't backup if there was an error */ 97 } 98 return r; 99 } 100 101 102 /* 103 * inp_len 104 * Returns the number of bytes input in the current 105 * session. 106 */ 107 static inline size_t 108 inp_len(const struct ud *u) 109 { 110 return u->inp_ctr; 111 } 112 113 #endif /* UD_INPUT_H */ 114 /* 115 vim: set ts=2 sw=2 expandtab 116 */ 117