0042-mbsrtowcs.c (2801B)
1 #include <assert.h> 2 #include <errno.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <string.h> 6 #include <wchar.h> 7 8 /* 9 output: 10 testing 11 testing mbsrtowcs1 12 testing mbsrtowcs2 13 testing mbstowcs 14 done 15 end: 16 */ 17 18 #define NELEM(x) (sizeof(x)/sizeof(x[0])) 19 20 static char str[20]; 21 static wchar_t wcs[20]; 22 static struct mbstests { 23 char *s; 24 char *sexp; 25 26 wchar_t *wcs; 27 wchar_t *wcsexp; 28 29 size_t n; 30 int r; 31 int syserr; 32 int mbstate; 33 } tests[] = { 34 /* s sexp wcs wcsexp n r syserr mbstate */ 35 {"\0", NULL, wcs, (wchar_t[]) {0}, 1, 0, 0, 1}, 36 {"\0", str, wcs, (wchar_t[]) {0}, 0, 0, 0, 1}, 37 {"\0", str, NULL, (wchar_t[]) {0}, 1, 0, 0, 1}, 38 {"\0", str, NULL, (wchar_t[]) {0}, 0, 0, 0, 1}, 39 40 {"\x31", NULL, wcs, (wchar_t[]) {0x31, 0}, 2, 1, 0, 1}, 41 {"\x31", str+1, wcs, (wchar_t[]) {0x31, 0}, 1, 1, 0, 1}, 42 {"\x31", str, NULL, (wchar_t[]) {0x31, 0}, 1, 1, 0, 1}, 43 {"\x31", str, NULL, (wchar_t[]) {0x31, 0}, 0, 1, 0, 1}, 44 45 {"\x21\xc2\xa1\xe2\x80\x94\xf0\x9f\x92\xa9", 46 NULL, wcs, 47 (wchar_t[]) {0x21,0xa1,0x2014,0x1f4A9}, 20, 4, 0, 1}, 48 49 {"\xf0\x9f",str, wcs, NULL, 20,-1, EILSEQ, 0}, 50 }; 51 52 void 53 tests_mbsrtowcs(void) 54 { 55 int r; 56 const char *s; 57 mbstate_t st; 58 struct mbstests *tp; 59 60 puts("testing mbsrtowcs1"); 61 for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { 62 errno = 0; 63 if (tp->s != NULL) 64 s = strcpy(str, tp->s); 65 memset(wcs, -1, sizeof(wcs)); 66 67 r = mbsrtowcs(tp->wcs, &s, tp->n, NULL); 68 assert(tp->r == r); 69 assert(tp->syserr == errno); 70 if (tp->r >= 0) { 71 assert(s == tp->sexp); 72 if (tp->wcs) 73 assert(!wcsncmp(tp->wcsexp, tp->wcs, tp->r)); 74 } 75 } 76 77 puts("testing mbsrtowcs2"); 78 for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { 79 errno = 0; 80 if (tp->s != NULL) 81 s = strcpy(str, tp->s); 82 memset(wcs, -1, sizeof(wcs)); 83 memset(&st, 0, sizeof(st)); 84 85 r = mbsrtowcs(tp->wcs, &s, tp->n, &st); 86 assert(tp->r == r); 87 assert(tp->syserr == errno); 88 if (tp->r >= 0) { 89 assert(s == tp->sexp); 90 if (tp->wcs) 91 assert(!wcsncmp(tp->wcsexp, tp->wcs, tp->r)); 92 assert(mbsinit(&st) != 0 == tp->mbstate); 93 } 94 } 95 } 96 97 void 98 tests_mbstowcs(void) 99 { 100 int r; 101 struct mbstests *tp; 102 103 puts("testing mbstowcs"); 104 for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) { 105 errno = 0; 106 memset(wcs, -1, sizeof(wcs)); 107 108 r = mbstowcs(tp->wcs, tp->s, tp->n); 109 assert(tp->r == r); 110 assert(tp->syserr == errno); 111 if (tp->r >= 0) { 112 if (tp->wcs) 113 assert(!wcsncmp(tp->wcsexp, tp->wcs, tp->r)); 114 } 115 } 116 } 117 118 int 119 main(void) 120 { 121 puts("testing"); 122 tests_mbsrtowcs(); 123 tests_mbstowcs(); 124 puts("done"); 125 return 0; 126 }