From 03feeb7ef2067382f14b7d2d3ae5ff5f1d5b768a Mon Sep 17 00:00:00 2001 From: leitner Date: Fri, 30 Oct 2020 19:46:30 +0000 Subject: [PATCH] make check can now run in parallel --- GNUmakefile | 12 +++++++++++- buffer.h | 2 +- buffer/buffer_feed.3 | 2 +- buffer/buffer_seek.3 | 8 ++++++-- buffer/buffer_seek.c | 36 +++++++++++++++++++++++++++++++----- parse.h | 16 ++++++++++++++++ textcode/scan_html.c | 2 +- 7 files changed, 67 insertions(+), 11 deletions(-) diff --git a/GNUmakefile b/GNUmakefile index 2940e44..e16898e 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -401,6 +401,16 @@ sa2: $(MAKE) DIET= CC="gcc -fanalyzer" -j8 UNITTESTS=$(shell grep -l UNITTEST */*.c) +TESTS=$(patsubst %.c,test_%,$(notdir $(UNITTESTS))) -check: haveuint128.h haveinline.h entities.h +test_%: %.c + $(CC) -g -o $@ $< -DUNITTEST -I. -fprofile-arcs -ftest-coverage $(LDFLAGS) + ./$@ + rm -f $@ + +test_scan_html: entities.h + +check2: haveuint128.h haveinline.h entities.h for i in $(UNITTESTS); do $(CC) -Wall -fprofile-arcs -ftest-coverage -g -o t -DUNITTEST $$i -I. $(LDFLAGS) && ./t || echo FAIL $$i ; done + +check: haveuint128.h haveinline.h $(TESTS) diff --git a/buffer.h b/buffer.h index 2a83c27..19e806c 100644 --- a/buffer.h +++ b/buffer.h @@ -148,7 +148,7 @@ __writememsz__(2,3) ssize_t buffer_get_token_pred(buffer* b,char* x,size_t len,string_predicate p); char *buffer_peek(buffer* b); -void buffer_seek(buffer* b,size_t len); +ssize_t buffer_seek(buffer* b,size_t len); #define buffer_PEEK(s) ( (s)->x + (s)->p ) #define buffer_SEEK(s,len) ( (s)->p += (len) ) diff --git a/buffer/buffer_feed.3 b/buffer/buffer_feed.3 index 411c09b..1c3e248 100644 --- a/buffer/buffer_feed.3 +++ b/buffer/buffer_feed.3 @@ -4,7 +4,7 @@ buffer_feed \- low-level component of buffer_get .SH SYNTAX .B #include -int \fBbuffer_feed\fP(buffer* \fIb\fR); +ssize_t \fBbuffer_feed\fP(buffer* \fIb\fR); .SH DESCRIPTION If the string is nonempty, buffer_feed returns the length of the string. If the string is empty, buffer_feed uses the read operation to feed data diff --git a/buffer/buffer_seek.3 b/buffer/buffer_seek.3 index c7710bc..c39100e 100644 --- a/buffer/buffer_seek.3 +++ b/buffer/buffer_seek.3 @@ -4,9 +4,13 @@ buffer_seek \- remove bytes from beginning of string in buffer .SH SYNTAX .B #include -void \fBbuffer_seek\fP(buffer* \fIb\fR,size_t \fIr\fR); +ssize_t \fBbuffer_seek\fP(buffer* \fIb\fR,size_t \fIr\fR); .SH DESCRIPTION buffer_seek removes \fIr\fR bytes from the beginning of the string. -\fIr\fR must be at most the current length of the string. + +\fIr\fR can not be larger than the maximum value that ssize_t can +represent. +.SH "RETURN VALUE" +Returns r (or -1 on error). .SH "SEE ALSO" buffer_init(3), buffer_feed(3), buffer_peek(3), buffer_get(3), buffer(3) diff --git a/buffer/buffer_seek.c b/buffer/buffer_seek.c index b406e77..2876ea7 100644 --- a/buffer/buffer_seek.c +++ b/buffer/buffer_seek.c @@ -1,8 +1,34 @@ +#include + #include "buffer.h" -void buffer_seek(buffer* b,size_t len) { - size_t n=b->p+len; - if (np) n=b->p; - if (n>b->n) n=b->n; - b->p=n; +ssize_t buffer_seek(buffer* b,size_t len) { + size_t leftinbuf = b->n - b->p; + ssize_t r; + + if ((ssize_t)len < 0) return -1; // can't signal back how much we read, so error out + r = (ssize_t)len; + + if (len <= leftinbuf) { + b->p += len; + return len; + } else { + // want to skip more than there was in the buffer + len -= leftinbuf; + b->p = 0; // clear buffer + b->n = 0; + /* change position in underlying file */ + if (b->fd != -1 && + lseek(b->fd, len, SEEK_CUR) != -1) return len; + // either we have no fd or input is not seekable + // call read repeatedly + while (len > 0) { + ssize_t r = buffer_feed(b); + if (r < 0) return -1; + if ((size_t)r > len) r = len; // can't happen + len -= r; + b->p = b->n = 0; + } + return r; + } } diff --git a/parse.h b/parse.h index cc94446..f3756fe 100644 --- a/parse.h +++ b/parse.h @@ -89,6 +89,22 @@ int bs_capacitycheck(struct bytestream* bs,size_t capacity); /* Like bs_capacitycheck but will set stream to error state on fail */ int bs_capacityassert(struct bytestream* bs,size_t capacity); +/* Return number of bytes left before limit, or 0 on error. */ +/* If the backend is an iobuf without limit, return max size_t value. */ +size_t bs_capacityleft(struct bytestream* bs); + +/* Assert there are no more bytes left in a bytestream. */ +/* Useful to make sure that you parsed the whole packet + * and there were no slack bytes in the end. + * Return 1 if there really were no more bytes in the stream. + * If there ARE bytes left, will set error flag in stream and return 0 */ +int bs_nomoredataassert(struct bytestream* bs); + +/* Consume all bytes left before limit */ +/* Useful for nested structs or when the backing store is an iobuf */ +/* Return number of bytes consumed */ +size_t bs_consumeleftovers(struct bytestream* bs); + /* Read n bytes from stream. Return n. * Set stream to error state if not enough space or I/O error. */ ssize_t prs_readblob(struct bytestream* bs,unsigned char* dest,size_t destlen); diff --git a/textcode/scan_html.c b/textcode/scan_html.c index f3fdad0..f3c43d7 100644 --- a/textcode/scan_html.c +++ b/textcode/scan_html.c @@ -1,4 +1,4 @@ -#include +#include #include #include "entities.h"