diff --git a/src/benchmark.c b/src/benchmark.c index a3f292e65a83576d980daee38bb7af5d112671b8..632d7db3ba1321b1fb0fa6532f9fb76719725a5b 100644 --- a/src/benchmark.c +++ b/src/benchmark.c @@ -10,7 +10,13 @@ #include <mach/mach.h> #endif +#ifdef __NetBSD__ +#include <sys/resource.h> +#endif + void h_benchmark_clock_gettime(struct timespec *ts) { + if (ts == NULL) + return; #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time /* * This returns real time, not CPU time. See http://stackoverflow.com/a/6725161 @@ -23,6 +29,18 @@ void h_benchmark_clock_gettime(struct timespec *ts) { mach_port_deallocate(mach_task_self(), cclock); ts->tv_sec = mts.tv_sec; ts->tv_nsec = mts.tv_nsec; +#elif defined(__NetBSD__) + // NetBSD doesn't have CLOCK_THREAD_CPUTIME_ID. We'll use getrusage instead + struct rusage rusage; + getrusage(RUSAGE_SELF, &rusage); + ts->tv_nsec = (rusage.ru_utime.tv_usec + rusage.ru_stime.tv_usec) * 1000; + // not going to overflow; can be at most 2e9-2 + ts->tv_sec = rusage.ru_utime.tv_sec + rusage.ru_utime.tv_sec; + if (ts->tv_nsec >= 1000000000) { + ts->tv_nsec -= 1000000000; // subtract a second + ts->tv_sec += 1; // add it back. + } + assert (ts->tv_nsec <= 1000000000); #else clock_gettime(CLOCK_THREAD_CPUTIME_ID, ts); #endif diff --git a/src/cfgrammar.c b/src/cfgrammar.c index b33ad86220321db0410b914daab81c00648b5613..ab7388302b24c9bb1c8767fc5d66e990fa39c165 100644 --- a/src/cfgrammar.c +++ b/src/cfgrammar.c @@ -648,7 +648,7 @@ void h_pprint_char(FILE *f, char c) case '\n': fputs("\\n", f); break; case '\r': fputs("\\r", f); break; default: - if(isprint(c)) { + if(isprint((int)c)) { fputc(c, f); } else { fprintf(f, "\\x%.2X", c); diff --git a/src/parsers/whitespace.c b/src/parsers/whitespace.c index 737affde3bad042e057b8a6c6c1f983116b18786..e37aa12e8c35640a6f69a1d98393ec64d4c3b419 100644 --- a/src/parsers/whitespace.c +++ b/src/parsers/whitespace.c @@ -10,7 +10,7 @@ static HParseResult* parse_whitespace(void* env, HParseState *state) { c = h_read_bits(&state->input_stream, 8, false); if (state->input_stream.overrun) break; - } while (isspace(c)); + } while (isspace((int)c)); state->input_stream = bak; return h_do_parse((HParser*)env, state); }