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