/* Test case by Yoshito Kawada . */ #include #include #include #include #include #include #include #include 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); }