197403Sobrien/* Taken from the Li18nux base test suite.  */
297403Sobrien
397403Sobrien#define _XOPEN_SOURCE 500
497403Sobrien#include <locale.h>
597403Sobrien#include <stdio.h>
697403Sobrien#include <stdlib.h>
797403Sobrien#include <unistd.h>
897403Sobrien#include <wchar.h>
997403Sobrien
1097403Sobrien
1197403Sobrienint
1297403Sobrienmain(void)
1397403Sobrien{
1497403Sobrien	FILE *fp;
1597403Sobrien	const char *str = "abcdef";
1697403Sobrien	wint_t ret, wc, ungetone = 0x00E4; /* 0x00E4 means `a umlaut'. */
1797403Sobrien	char fname[] = "/tmp/tst-ungetwc1.out.XXXXXX";
18169691Skan	int fd;
1997403Sobrien	int result = 0;
2097403Sobrien
2197403Sobrien	puts("This program runs on de_DE.UTF-8 locale.");
2297403Sobrien	if (setlocale(LC_ALL, "de_DE.UTF-8") == NULL) {
2397403Sobrien		fprintf(stderr, "Err: Cannot run on the de_DE.UTF-8 locale");
2497403Sobrien		exit(EXIT_FAILURE);
2597403Sobrien	}
2697403Sobrien
2797403Sobrien	fd = mkstemp(fname);
2897403Sobrien	if (fd == -1) {
2997403Sobrien		printf("cannot open temp file: %m\n");
3097403Sobrien		exit(EXIT_FAILURE);
3197403Sobrien	}
3297403Sobrien
3397403Sobrien	/* Write some characters to `testfile'. */
3497403Sobrien	if ((fp = fdopen(fd, "w")) == NULL) {
3597403Sobrien		fprintf(stderr, "Cannot open 'testfile'.");
3697403Sobrien		exit(EXIT_FAILURE);
3797403Sobrien	}
3897403Sobrien	fputs(str, fp);
3997403Sobrien	fclose(fp);
4097403Sobrien
4197403Sobrien	/* Open `testfile'. */
4297403Sobrien	if ((fp = fopen(fname, "r")) == NULL) {
4397403Sobrien		fprintf(stderr, "Cannot open 'testfile'.");
4497403Sobrien		exit(EXIT_FAILURE);
4597403Sobrien	}
4697403Sobrien
4797403Sobrien	/* Unget a character. */
4897403Sobrien	ret = ungetwc(ungetone, fp);
4997403Sobrien	printf("Unget a character (0x%04x)\n", (unsigned int) ungetone);
5097403Sobrien	fflush(stdout);
5197403Sobrien	if (ret == WEOF) {
5297403Sobrien		puts("ungetwc() returns NULL.");
5397403Sobrien		exit(EXIT_SUCCESS);
5497403Sobrien	}
5597403Sobrien
56169691Skan	/* Reget a character. */
57169691Skan	wc = getwc(fp);
5897403Sobrien	printf("Reget a character (0x%04x)\n", (unsigned int) wc);
5997403Sobrien	fflush(stdout);
60132720Skan	if (wc == ungetone) {
61132720Skan		puts("The ungotten character is equal to the regotten character.");
6297403Sobrien		fflush(stdout);
6397403Sobrien	} else {
6497403Sobrien		puts("The ungotten character is not equal to the regotten character.");
6597403Sobrien		printf("ungotten one: %04x, regetone: %04x", ungetone, wc);
6697403Sobrien		fflush(stdout);
6797403Sobrien		result = 1;
6897403Sobrien	}
69132720Skan	fclose(fp);
70132720Skan
71132720Skan	unlink(fname);
7297403Sobrien
73132720Skan	return result;
74}
75