/* Test case by Yoshito Kawada <KAWADA@jp.ibm.com>. */ #include <errno.h> #include <error.h> #include <fcntl.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <wchar.h> int main (int argc, char *argv[]) { int a = 3; int fd; char name[] = "/tmp/wprintf.out.XXXXXX"; FILE *fp; char buf[100]; size_t len; int res = 0; fd = mkstemp (name); if (fd == -1) error (EXIT_FAILURE, errno, "cannot open temporary file"); unlink (name); setlocale (LC_ALL, ""); fp = fdopen (dup (fd), "w"); if (fp == NULL) error (EXIT_FAILURE, errno, "fdopen(,\"w\")"); fwprintf (fp, L"test start"); fwprintf (fp, L" int %d\n", a); /* String with precision. */ fwprintf (fp, L"1[%6.3s]\n", argv[1]); fclose (fp); fp = fdopen (dup (fd), "a"); if (fp == NULL) error (EXIT_FAILURE, errno, "fdopen(,\"a\")"); setvbuf (fp, NULL, _IONBF, 0); /* fwprintf to unbuffered stream. */ fwprintf (fp, L"hello.\n"); fclose (fp); /* Now read it back in. This time using multibyte functions. */ lseek (fd, SEEK_SET, 0); fp = fdopen (fd, "r"); if (fp == NULL) error (EXIT_FAILURE, errno, "fdopen(,\"r\")"); if (fgets (buf, sizeof buf, fp) != buf) error (EXIT_FAILURE, errno, "first fgets"); len = strlen (buf); if (buf[len - 1] == '\n') --len; else { puts ("newline missing after first line"); res = 1; } printf ("1st line: \"%.*s\" -> %s\n", (int) len, buf, strncmp (buf, "test start int 3", len) == 0 ? "OK" : "FAIL"); res |= strncmp (buf, "test start int 3", len) != 0; if (fgets (buf, sizeof buf, fp) != buf) error (EXIT_FAILURE, errno, "second fgets"); len = strlen (buf); if (buf[len - 1] == '\n') --len; else { puts ("newline missing after second line"); res = 1; } printf ("2nd line: \"%.*s\" -> %s\n", (int) len, buf, strncmp (buf, "1[ Som]", len) == 0 ? "OK" : "FAIL"); res |= strncmp (buf, "1[ Som]", len) != 0; if (fgets (buf, sizeof buf, fp) != buf) error (EXIT_FAILURE, errno, "third fgets"); len = strlen (buf); if (buf[len - 1] == '\n') --len; else { puts ("newline missing after third line"); res = 1; } printf ("3rd line: \"%.*s\" -> %s\n", (int) len, buf, strncmp (buf, "hello.", len) == 0 ? "OK" : "FAIL"); res |= strncmp (buf, "hello.", len) != 0; return res; }