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 32uint8_t ud_inp_next(struct ud* u); 33 34/* 35 * inp_start 36 * Should be called before each de-code operation. 37 */ 38static inline void 39inp_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 */ 48static inline void 49inp_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 */ 58static inline uint8_t* 59inp_sess(struct ud *u) 60{ 61 return u->inp_sess; 62} 63 64/* 65 * inp_curr 66 * Returns the current input byte. 67 */ 68static inline uint8_t 69inp_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 */ 78static inline void 79inp_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 */ 91static inline uint8_t 92inp_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 */ 107static inline size_t 108inp_len(const struct ud *u) 109{ 110 return u->inp_ctr; 111} 112 113#endif /* UD_INPUT_H */ 114/* 115vim: set ts=2 sw=2 expandtab 116*/ 117