masscan-mark-ii/src/util-extract.c

74 lines
1.9 KiB
C

#include "util-extract.h"
unsigned char
e_next_byte(struct ebuf_t *ebuf) {
if (ebuf->offset + 1 > ebuf->max)
return -1;
return ebuf->buf[ebuf->offset++];
}
unsigned short
e_next_short16(struct ebuf_t *ebuf, int endian) {
const unsigned char *buf = ebuf->buf;
size_t offset = ebuf->offset;
unsigned short result;
if (ebuf->offset + 2 > ebuf->max)
return -1;
if (endian == EBUF_BE) {
result = buf[offset+0]<<8 | buf[offset+1];
} else {
result = buf[offset+1]<<8 | buf[offset+0];
}
ebuf->offset += 2;
return result;
}
unsigned e_next_int32(struct ebuf_t *ebuf, int endian) {
const unsigned char *buf = ebuf->buf;
size_t offset = ebuf->offset;
unsigned result;
if (ebuf->offset + 4 > ebuf->max)
return -1;
if (endian == EBUF_BE) {
result = buf[offset+0]<<24 | buf[offset+1] << 16
| buf[offset+2]<<8 | buf[offset+3] << 0;
} else {
result = buf[offset+3]<<24 | buf[offset+2] << 16
| buf[offset+1]<<8 | buf[offset+0] << 0;
}
ebuf->offset += 4;
return result;
}
unsigned long long
e_next_long64(struct ebuf_t *ebuf, int endian) {
const unsigned char *buf = ebuf->buf;
size_t offset = ebuf->offset;
unsigned long long hi;
unsigned long long lo;
if (ebuf->offset + 8 > ebuf->max)
return -1ll;
if (endian == EBUF_BE) {
hi = buf[offset+0]<<24 | buf[offset+1] << 16
| buf[offset+2]<<8 | buf[offset+3] << 0;
lo = buf[offset+4]<<24 | buf[offset+5] << 16
| buf[offset+6]<<8 | buf[offset+7] << 0;
} else {
lo = buf[offset+3]<<24 | buf[offset+2] << 16
| buf[offset+1]<<8 | buf[offset+0] << 0;
hi = buf[offset+7]<<24 | buf[offset+6] << 16
| buf[offset+5]<<8 | buf[offset+4] << 0;
}
ebuf->offset += 8;
return hi<<32ull | lo;
}