# HG changeset patch # User David A. Holland # Date 1292835815 18000 # Node ID 40748b09765551adb8835551efcd2dad4a3ace94 # Parent f9792a9ec7047898d56776be2337910f841793fa add output. diff -r f9792a9ec704 -r 40748b097655 Makefile --- a/Makefile Mon Dec 20 03:55:19 2010 -0500 +++ b/Makefile Mon Dec 20 04:03:35 2010 -0500 @@ -1,7 +1,10 @@ # $NetBSD$ PROG= tradcpp -SRCS= main.c files.c directive.c eval.c macro.c place.c array.c utils.c +SRCS= main.c \ + files.c directive.c eval.c macro.c output.c \ + place.c array.c utils.c +NOMAN= 1 WARNS= 5 .include diff -r f9792a9ec704 -r 40748b097655 mode.h --- a/mode.h Mon Dec 20 03:55:19 2010 -0500 +++ b/mode.h Mon Dec 20 04:03:35 2010 -0500 @@ -1,3 +1,5 @@ +#include + struct mode { bool werror; bool input_allow_dollars; diff -r f9792a9ec704 -r 40748b097655 output.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/output.c Mon Dec 20 04:03:35 2010 -0500 @@ -0,0 +1,60 @@ +#include +#include +#include + +#include "utils.h" +#include "mode.h" +#include "output.h" + +static int outputfd = -1; + +static +void +output_open(void) +{ + outputfd = open(mode.output_file, O_WRONLY|O_CREAT|O_TRUNC, 0664); + if (outputfd < 0) { + warn("%s", mode.output_file); + die(); + } +} + +void +output(const char *buf, size_t len) +{ + size_t done; + ssize_t result; + static unsigned write_errors = 0; + + if (outputfd < 0) { + output_open(); + } + + /* XXX this will often come by ones and twos, should buffer */ + + done = 0; + while (done < len) { + result = write(outputfd, buf+done, len-done); + if (result == -1) { + warn("%s: write", mode.output_file); + complain_failed(); + write_errors++; + if (write_errors > 5) { + warnx("%s: giving up", mode.output_file); + die(); + } + /* XXX is this really a good idea? */ + sleep(1); + } + done += (size_t)result; + } +} + +void +output_eof(void) +{ + if (outputfd >= 0) { + close(outputfd); + } + outputfd = -1; +} diff -r f9792a9ec704 -r 40748b097655 utils.c --- a/utils.c Mon Dec 20 03:55:19 2010 -0500 +++ b/utils.c Mon Dec 20 04:03:35 2010 -0500 @@ -108,6 +108,17 @@ return ret; } +char * +dostrndup(const char *s, size_t len) +{ + char *ret; + + ret = domalloc(len+1); + memcpy(ret, s, len); + ret[len] = '\0'; + return ret; +} + size_t notrailingws(char *buf, size_t len) {