diff options
Diffstat (limited to 'sys/contrib/ia64/libuwx/src/uwx_bstream.c')
-rw-r--r-- | sys/contrib/ia64/libuwx/src/uwx_bstream.c | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/sys/contrib/ia64/libuwx/src/uwx_bstream.c b/sys/contrib/ia64/libuwx/src/uwx_bstream.c new file mode 100644 index 0000000..1495ed3 --- /dev/null +++ b/sys/contrib/ia64/libuwx/src/uwx_bstream.c @@ -0,0 +1,181 @@ +/* +Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P. +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include "uwx_env.h" +#include "uwx_bstream.h" + + +/* uwx_init_bstream: initialize a byte stream for reading */ + +void uwx_init_bstream( + struct uwx_bstream *bstream, + struct uwx_env *env, + uint64_t source, + unsigned int len, + int request) +{ + bstream->buf = 0; + if (env->remote) { + bstream->source = source; + bstream->bufp = (unsigned char *) &bstream->buf; + bstream->nbuf = 0; + bstream->copyin = env->copyin; + bstream->cb_token = env->cb_token; + bstream->request = request; + } + else { + bstream->source = 0; + bstream->bufp = (unsigned char *) (intptr_t) source; + bstream->nbuf = len; + bstream->copyin = 0; + bstream->cb_token = 0; + bstream->request = 0; + } + bstream->ntotal = len; + bstream->peekc = -1; +} + + +/* uwx_get_byte: read the next byte from the byte stream */ + +int uwx_get_byte(struct uwx_bstream *bstream) +{ + int len; + int n; + int b; + + if (bstream->peekc >= 0) { + b = bstream->peekc; + bstream->peekc = -1; + return b; + } + if (bstream->ntotal <= 0) + return -1; + if (bstream->nbuf <= 0) { + if (bstream->source & 0x7 || bstream->ntotal < sizeof(uint64_t)) + len = sizeof(uint32_t); + else + len = sizeof(uint64_t); + n = (*bstream->copyin)(bstream->request, (char *)&bstream->buf, + bstream->source, len, bstream->cb_token); + if (n != len) + return -1; + bstream->bufp = (unsigned char *) &bstream->buf; + bstream->nbuf = n; + bstream->source += n; + } + + b = *bstream->bufp++; + bstream->nbuf--; + bstream->ntotal--; + return b; +} + + +/* uwx_unget_byte: push a byte back onto the byte stream */ + +int uwx_unget_byte(struct uwx_bstream *bstream, int b) +{ + bstream->peekc = b; + return 0; +} + + +/* uwx_get_uleb128: read a ULEB128 value from the byte stream */ + +int uwx_get_uleb128(struct uwx_bstream *bstream, uint64_t *valp) +{ + uint64_t val; + int i; + int b; + + b = uwx_get_byte(bstream); + val = (uint64_t)(b & 0x7f) << 56; + for (i = 0; i < 8; i++) { + val = val >> 7; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 56; + } + } + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 63; + } + if (b & 0x80) + return -1; + *valp = val; + return 0; +} + +#if 0 +int uwx_get_uleb128_alt(struct uwx_bstream *bstream, uint64_t *valp) +{ + uint64_t val; + int b; + + b = uwx_get_byte(bstream); + val = b & 0x7f; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 7; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 14; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 21; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 28; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 35; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 42; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 49; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 56; + if (b & 0x80) { + b = uwx_get_byte(bstream); + val |= (uint64_t)(b & 0x7f) << 63; + if (b & 0x80) + return -1; + } + } + } + } + } + } + } + } + } + *valp = val; + return 0; +} +#endif |