30#define _RWSTD_TEST_SRC
35# ifdef _RWSTD_NO_PURE_C_HEADERS
39# define _XOPEN_SOURCE 500
41# include <sys/types.h>
76# define P_tmpdir "/tmp/"
79#ifndef _RWSTD_NO_PURE_C_HEADERS
94 static const char* charmap[] = {
95 "<NUL>",
"<SOH>",
"<STX>",
"<ETX>",
"<EOT>",
"<ENQ>",
"<ACK>",
"<BEL>",
102 "<SO>",
"<SI>",
"<DLE>",
"<DC1>",
"<DC2>",
"<DC3>",
"<DC4>",
"<NAK>",
103 "<SYN>",
"<ETB>",
"<CAN>",
"<EM>",
"<SUB>",
"<ESC>",
"<IS4>",
"<IS3>",
106 "<exclamation-mark>",
113 "<left-parenthesis>",
114 "<right-parenthesis>",
135 "<greater-than-sign>",
138 "<A>",
"<B>",
"<C>",
"<D>",
"<E>",
"<F>",
"<G>",
"<H>",
"<I>",
"<J>",
139 "<K>",
"<L>",
"<M>",
"<N>",
"<O>",
"<P>",
"<Q>",
"<R>",
"<S>",
"<T>",
140 "<U>",
"<V>",
"<W>",
"<X>",
"<Y>",
"<Z>",
141 "<left-square-bracket>",
143 "<right-square-bracket>",
147 "<a>",
"<b>",
"<c>",
"<d>",
"<e>",
"<f>",
"<g>",
"<h>",
"<i>",
"<j>",
148 "<k>",
"<l>",
"<m>",
"<n>",
"<o>",
"<p>",
"<q>",
"<r>",
"<s>",
"<t>",
149 "<u>",
"<v>",
"<w>",
"<x>",
"<y>",
"<z>",
162 if (uc <
sizeof charmap /
sizeof *charmap)
163 fprintf (fp,
"%s", charmap [uc]);
165 fprintf (fp,
"<U%04X>", uc);
171 const char*
const codeset = nl_langinfo (CODESET);
174 const char*
const codeset =
"UTF-8";
177 fprintf (fp,
"<code_set_name> \"%s\"\n", codeset);
178 fprintf (fp,
"<mb_cur_max> 1\n");
179 fprintf (fp,
"<mb_cur_min> 1\n");
181 fprintf (fp,
"CHARMAP\n");
184 for (
unsigned i = 0;
i !=
sizeof charmap /
sizeof *charmap; ++
i) {
185 fprintf (fp,
"%s \\x%02x\n", charmap [
i],
i);
189 fprintf (fp,
"<alert> \\x%02x\n",
'\a');
190 fprintf (fp,
"<hyphen-minus> \\x%02x\n",
'-');
191 fprintf (fp,
"<full-stop> \\x%02x\n",
'.');
192 fprintf (fp,
"<solidus> \\x%02x\n",
'/');
193 fprintf (fp,
"<reverse-solidus> \\x%02x\n",
'\\');
194 fprintf (fp,
"<circumflex-accent> \\x%02x\n",
'^');
195 fprintf (fp,
"<underline> \\x%02x\n",
'_');
196 fprintf (fp,
"<low-line> \\x%02x\n",
'_');
197 fprintf (fp,
"<left-curly-bracket> \\x%02x\n",
'{');
198 fprintf (fp,
"<right-curly-bracket> \\x%02x\n",
'}');
200 fprintf (fp,
"END CHARMAP\n");
208#ifndef _RWSTD_NO_MKSTEMP
209# define TMP_TEMPLATE "tmpfile-XXXXXX"
239 fprintf (
stderr,
"%s:%d: mkstemp(\"%s\") failed: %s\n",
240 __FILE__, __LINE__,
buf, strerror (errno));
246 const char*
const fname =
buf;
254 char* fname = tempnam (
P_tmpdir,
".rwtest-tmp");
258 static char tmpbuf [256];
273 fprintf (
stderr,
"%s:%d: tempnam(\"%s\", \"%s\") failed: %s\n",
275 P_tmpdir,
".rwtest-tmp", strerror (errno));
279# if defined (__hpux) && defined (_RWSTD_REENTRANT)
291 const char*
const fname = tmpnam (
buf);
294 fprintf (
stderr,
"%s:%d: tmpnam(\"%s\") failed: %s\n",
295 __FILE__, __LINE__,
buf, strerror (errno));
317 if (-1 == _stat (fname, &
sb))
318 return _RWSTD_SIZE_MAX;
331 FILE_ATTRIBUTE_NORMAL,
334 if (INVALID_HANDLE_VALUE == hfile)
335 return _RWSTD_SIZE_MAX;
337 const size_t size = GetFileSize (hfile, 0);
349 if (stat (fname, &
sb) == -1)
350 return _RWSTD_SIZE_MAX;
365 static char* usrbuf = 0;
366 static size_t usrsize = 0;
372 if (!fname &&
size) {
374 char*
const oldbuf = usrbuf;
377 usrsize = usrbuf ? *
size : 0;
382 static char buffer [1024];
383 static char*
buf = usrbuf ? usrbuf :
buffer;
384 static size_t bufsize = usrbuf ? usrsize :
sizeof buffer;
387 FILE*
const fp = fopen (fname,
mode);
392 for (
char *bufend =
buf; ; ) {
395 const size_t bytes_read = size_t (bufend -
buf);
396 const size_t bytes_avail = bufsize - bytes_read;
399 const size_t nbytes = fread (bufend, 1, bytes_avail, fp);
411 if (nbytes == bytes_avail) {
417 const size_t newsize = (bufsize + 1) * 2;
420 char *
tmp =
new char [newsize];
421 memcpy (
tmp,
buf, bufsize);
429 bufend =
tmp + bytes_read;
451 fp = fopen (fname,
mode);
460 if (
size_t (-1) ==
size)
465 const size_t nbytes = fwrite (
buf, 1 ,
size, fp);
489 const int prev_mode = _CrtSetReportMode (_CRT_ASSERT, 0);
492 for (
int i = 0;
i != 256; ++
i) {
494 const int ret = _commit (
i);
496 if (-1 != ret || EBADF != errno)
503 _CrtSetReportMode (_CRT_ASSERT, prev_mode);
508 for (
int i = 0;
i != 256; ++
i) {
509 if (-1 != fcntl (
i, F_GETFD))
void count(T, T, const U &,...)
#define _RWSTD_STATIC_CAST(T, x)
#define _RWSTD_ASSERT(ignore)
#define _RWSTD_CONST_CAST(T, x)
_TEST_EXPORT const char * rw_tmpnam(char *buf)
_TEST_EXPORT int rw_nextfd(int *count)
_TEST_EXPORT size_t rw_fwrite(const char *fname, const void *buf, size_t size, const char *mode)
_TEST_EXPORT size_t rw_fsize(const char *fname)
_TEST_EXPORT void pcs_write(void *fpv, const char *str)
_TEST_EXPORT void * rw_fread(const char *fname, size_t *size, const char *mode)