root/src/tests/system/libroot/posix/tst-wprintf2.c
/* Test case by Yoshito Kawada <KAWADA@jp.ibm.com>.  */
#include <errno.h>
#include <fcntl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <wchar.h>


void error(int exitCode, int, const char* message);


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;
}


void
error(int exitCode, int errorCode, const char* message)
{
        perror(message);
        exit(exitCode);
}