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