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