]> pd.if.org Git - pdclib/blob - platform/win32/functions/_PDCLIB/_PDCLIB_stdinit.c
PDCLib includes with quotes, not <>.
[pdclib] / platform / win32 / functions / _PDCLIB / _PDCLIB_stdinit.c
1 /* _PDCLIB_stdinit
2
3    This file is part of the Public Domain C Library (PDCLib).
4    Permission is granted to use, modify, and / or redistribute at will.
5 */
6
7 /* This is an example initialization of stdin, stdout and stderr to the integer
8    file descriptors 0, 1, and 2, respectively. This applies for a great variety
9    of operating systems, including POSIX compliant ones.
10 */
11
12 #include <stdio.h>
13 #include <locale.h>
14 #include <limits.h>
15
16 #ifndef REGTEST
17 #include "_PDCLIB_io.h"
18 #include "_PDCLIB_locale.h"
19 #include "_PDCLIB_encoding.h"
20
21 extern const _PDCLIB_fileops_t _PDCLIB_fileops;
22
23 /* In a POSIX system, stdin / stdout / stderr are equivalent to the (int) file
24    descriptors 0, 1, and 2 respectively.
25 */
26 /* TODO: This is proof-of-concept, requires finetuning. */
27 static char _PDCLIB_sin_buffer[BUFSIZ];
28 static char _PDCLIB_sout_buffer[BUFSIZ];
29 static char _PDCLIB_serr_buffer[BUFSIZ];
30
31 static unsigned char _PDCLIB_sin_ungetbuf[_PDCLIB_UNGETCBUFSIZE];
32 static unsigned char _PDCLIB_sout_ungetbuf[_PDCLIB_UNGETCBUFSIZE];
33 static unsigned char _PDCLIB_serr_ungetbuf[_PDCLIB_UNGETCBUFSIZE];
34
35 static FILE _PDCLIB_serr = { 
36     .ops        = &_PDCLIB_fileops, 
37     .buffer     = _PDCLIB_serr_buffer, 
38     .bufsize    = BUFSIZ, 
39     .bufidx     = 0, 
40     .bufend     = 0, 
41     .ungetidx   = 0, 
42     .ungetbuf   = _PDCLIB_serr_ungetbuf, 
43     .status     = _IONBF | _PDCLIB_FWRITE | _PDCLIB_STATIC, 
44     .filename   = NULL, 
45     .next       = NULL,
46 };
47 static FILE _PDCLIB_sout = { 
48     .ops        = &_PDCLIB_fileops, 
49     .buffer     = _PDCLIB_sout_buffer, 
50     .bufsize    = BUFSIZ, 
51     .bufidx     = 0, 
52     .bufend     = 0, 
53     .ungetidx   = 0, 
54     .ungetbuf   = _PDCLIB_sout_ungetbuf, 
55     .status     = _IOLBF | _PDCLIB_FWRITE | _PDCLIB_STATIC, 
56     .filename   = NULL, 
57     .next       = &_PDCLIB_serr 
58 };
59 static FILE _PDCLIB_sin  = { 
60     .ops        = &_PDCLIB_fileops, 
61     .buffer     = _PDCLIB_sin_buffer, 
62     .bufsize    = BUFSIZ, 
63     .bufidx     = 0, 
64     .bufend     = 0, 
65     .ungetidx   = 0, 
66     .ungetbuf   = _PDCLIB_sin_ungetbuf, 
67     .status     = _IOLBF | _PDCLIB_FREAD | _PDCLIB_STATIC, 
68     .filename   = NULL, 
69     .next       = &_PDCLIB_sout 
70 };
71
72
73 FILE* stdin  = &_PDCLIB_sin;
74 FILE* stdout = &_PDCLIB_sout;
75 FILE* stderr = &_PDCLIB_serr;
76
77 /* FIXME: This approach is a possible attack vector. */
78 FILE* _PDCLIB_filelist = &_PDCLIB_sin;
79
80 tss_t _PDCLIB_locale_tss;
81
82 /* "C" locale - defaulting to ASCII-7.
83    1 kByte (+ 4 byte) of <ctype.h> data.
84    Each line: flags, lowercase, uppercase, collation.
85 */
86 static const _PDCLIB_ctype_t global_ctype[] = {
87     { /* EOF */    0,    0,    0,    0 },
88     { /* NUL */ _PDCLIB_CTYPE_CNTRL,                                             0x00, 0x00, 0x00 },
89     { /* SOH */ _PDCLIB_CTYPE_CNTRL,                                             0x01, 0x01, 0x01 },
90     { /* STX */ _PDCLIB_CTYPE_CNTRL,                                             0x02, 0x02, 0x02 },
91     { /* ETX */ _PDCLIB_CTYPE_CNTRL,                                             0x03, 0x03, 0x03 },
92     { /* EOT */ _PDCLIB_CTYPE_CNTRL,                                             0x04, 0x04, 0x04 },
93     { /* ENQ */ _PDCLIB_CTYPE_CNTRL,                                             0x05, 0x05, 0x05 },
94     { /* ACK */ _PDCLIB_CTYPE_CNTRL,                                             0x06, 0x06, 0x06 },
95     { /* BEL */ _PDCLIB_CTYPE_CNTRL,                                             0x07, 0x07, 0x07 },
96     { /*  BS */ _PDCLIB_CTYPE_CNTRL,                                             0x08, 0x08, 0x08 },
97     { /*  HT */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_BLANK | _PDCLIB_CTYPE_SPACE, 0x09, 0x09, 0x09 },
98     { /*  LF */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE,                       0x0A, 0x0A, 0x0A },
99     { /*  VT */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE,                       0x0B, 0x0B, 0x0B },
100     { /*  FF */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE,                       0x0C, 0x0C, 0x0C },
101     { /*  CR */ _PDCLIB_CTYPE_CNTRL | _PDCLIB_CTYPE_SPACE,                       0x0D, 0x0D, 0x0D },
102     { /*  SO */ _PDCLIB_CTYPE_CNTRL,                                             0x0E, 0x0E, 0x0E },
103     { /*  SI */ _PDCLIB_CTYPE_CNTRL,                                             0x0F, 0x0F, 0x0F },
104     { /* DLE */ _PDCLIB_CTYPE_CNTRL,                                             0x10, 0x10, 0x10 },
105     { /* DC1 */ _PDCLIB_CTYPE_CNTRL,                                             0x11, 0x11, 0x11 },
106     { /* DC2 */ _PDCLIB_CTYPE_CNTRL,                                             0x12, 0x12, 0x12 },
107     { /* DC3 */ _PDCLIB_CTYPE_CNTRL,                                             0x13, 0x13, 0x13 },
108     { /* DC4 */ _PDCLIB_CTYPE_CNTRL,                                             0x14, 0x14, 0x14 },
109     { /* NAK */ _PDCLIB_CTYPE_CNTRL,                                             0x15, 0x15, 0x15 },
110     { /* SYN */ _PDCLIB_CTYPE_CNTRL,                                             0x16, 0x16, 0x16 },
111     { /* ETB */ _PDCLIB_CTYPE_CNTRL,                                             0x17, 0x17, 0x17 },
112     { /* CAN */ _PDCLIB_CTYPE_CNTRL,                                             0x18, 0x18, 0x18 },
113     { /*  EM */ _PDCLIB_CTYPE_CNTRL,                                             0x19, 0x19, 0x19 },
114     { /* SUB */ _PDCLIB_CTYPE_CNTRL,                                             0x1A, 0x1A, 0x1A },
115     { /* ESC */ _PDCLIB_CTYPE_CNTRL,                                             0x1B, 0x1B, 0x1B },
116     { /*  FS */ _PDCLIB_CTYPE_CNTRL,                                             0x1C, 0x1C, 0x1C },
117     { /*  GS */ _PDCLIB_CTYPE_CNTRL,                                             0x1D, 0x1D, 0x1D },
118     { /*  RS */ _PDCLIB_CTYPE_CNTRL,                                             0x1E, 0x1E, 0x1E },
119     { /*  US */ _PDCLIB_CTYPE_CNTRL,                                             0x1F, 0x1F, 0x1F },
120     { /*  SP */ _PDCLIB_CTYPE_BLANK | _PDCLIB_CTYPE_SPACE,                       0x20, 0x20, 0x20 },
121     { /* '!' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x21, 0x21, 0x21 },
122     { /* '"' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x22, 0x22, 0x22 },
123     { /* '#' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x23, 0x23, 0x23 },
124     { /* '$' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x24, 0x24, 0x24 },
125     { /* '%' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x25, 0x25, 0x25 },
126     { /* '&' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x26, 0x26, 0x26 },
127     { /* ''' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x27, 0x27, 0x27 },
128     { /* '(' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x28, 0x28, 0x28 },
129     { /* ')' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x29, 0x29, 0x29 },
130     { /* '*' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x2A, 0x2A, 0x2A },
131     { /* '+' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x2B, 0x2B, 0x2B },
132     { /* ',' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x2C, 0x2C, 0x2C },
133     { /* '-' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x2D, 0x2D, 0x2D },
134     { /* '.' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x2E, 0x2E, 0x2E },
135     { /* '/' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x2F, 0x2F, 0x2F },
136     { /* '0' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x30, 0x30, 0x30 },
137     { /* '1' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x31, 0x31, 0x31 },
138     { /* '2' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x32, 0x32, 0x32 },
139     { /* '3' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x33, 0x33, 0x33 },
140     { /* '4' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x34, 0x34, 0x34 },
141     { /* '5' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x35, 0x35, 0x35 },
142     { /* '6' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x36, 0x36, 0x36 },
143     { /* '7' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x37, 0x37, 0x37 },
144     { /* '8' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x38, 0x38, 0x38 },
145     { /* '9' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_DIGIT | _PDCLIB_CTYPE_XDIGT, 0x39, 0x39, 0x39 },
146     { /* ':' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x3A, 0x3A, 0x3A },
147     { /* ';' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x3B, 0x3B, 0x3B },
148     { /* '<' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x3C, 0x3C, 0x3C },
149     { /* '=' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x3D, 0x3D, 0x3D },
150     { /* '>' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x3E, 0x3E, 0x3E },
151     { /* '?' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x3F, 0x3F, 0x3F },
152     { /* '@' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x40, 0x40, 0x40 },
153     { /* 'A' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x41, 0x61, 0x41 },
154     { /* 'B' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x42, 0x62, 0x42 },
155     { /* 'C' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x43, 0x63, 0x43 },
156     { /* 'D' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x44, 0x64, 0x44 },
157     { /* 'E' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x45, 0x65, 0x45 },
158     { /* 'F' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER | _PDCLIB_CTYPE_XDIGT, 0x46, 0x66, 0x46 },
159     { /* 'G' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x47, 0x67, 0x47 },
160     { /* 'H' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x48, 0x68, 0x48 },
161     { /* 'I' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x49, 0x69, 0x49 },
162     { /* 'J' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4A, 0x6A, 0x4A },
163     { /* 'K' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4B, 0x6B, 0x4B },
164     { /* 'L' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4C, 0x6C, 0x4C },
165     { /* 'M' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4D, 0x6D, 0x4D },
166     { /* 'N' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4E, 0x6E, 0x4E },
167     { /* 'O' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x4F, 0x6F, 0x4F },
168     { /* 'P' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x50, 0x70, 0x50 },
169     { /* 'Q' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x51, 0x71, 0x51 },
170     { /* 'R' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x52, 0x72, 0x52 },
171     { /* 'S' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x53, 0x73, 0x53 },
172     { /* 'T' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x54, 0x74, 0x54 },
173     { /* 'U' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x55, 0x75, 0x55 },
174     { /* 'V' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x56, 0x76, 0x56 },
175     { /* 'W' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x57, 0x77, 0x57 },
176     { /* 'X' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x58, 0x78, 0x58 },
177     { /* 'Y' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x59, 0x79, 0x59 },
178     { /* 'Z' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_UPPER, 0x5A, 0x7A, 0x5A },
179     { /* '[' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x5B, 0x5B, 0x5B },
180     { /* '\' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x5C, 0x5C, 0x5C },
181     { /* ']' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x5D, 0x5D, 0x5D },
182     { /* '^' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x5E, 0x5E, 0x5E },
183     { /* '_' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x5F, 0x5F, 0x5F },
184     { /* '`' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x60, 0x60, 0x60 },
185     { /* 'a' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x41, 0x61, 0x61 },
186     { /* 'b' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x42, 0x62, 0x62 },
187     { /* 'c' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x43, 0x63, 0x63 },
188     { /* 'd' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x44, 0x64, 0x64 },
189     { /* 'e' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x45, 0x65, 0x65 },
190     { /* 'f' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER | _PDCLIB_CTYPE_XDIGT, 0x46, 0x66, 0x66 },
191     { /* 'g' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x47, 0x67, 0x67 },
192     { /* 'h' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x48, 0x68, 0x68 },
193     { /* 'i' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x49, 0x69, 0x69 },
194     { /* 'j' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4A, 0x6A, 0x6A },
195     { /* 'k' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4B, 0x6B, 0x6B },
196     { /* 'l' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4C, 0x6C, 0x6C },
197     { /* 'm' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4D, 0x6D, 0x6D },
198     { /* 'n' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4E, 0x6E, 0x6E },
199     { /* 'o' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x4F, 0x6F, 0x6F },
200     { /* 'p' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x50, 0x70, 0x70 },
201     { /* 'q' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x51, 0x71, 0x71 },
202     { /* 'r' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x52, 0x72, 0x72 },
203     { /* 's' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x53, 0x73, 0x73 },
204     { /* 't' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x54, 0x74, 0x74 },
205     { /* 'u' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x55, 0x75, 0x75 },
206     { /* 'v' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x56, 0x76, 0x76 },
207     { /* 'w' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x57, 0x77, 0x77 },
208     { /* 'x' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x58, 0x78, 0x78 },
209     { /* 'y' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x59, 0x79, 0x79 },
210     { /* 'z' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_ALPHA | _PDCLIB_CTYPE_LOWER, 0x5A, 0x7A, 0x7A },
211     { /* '{' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x7B, 0x7B, 0x7B },
212     { /* '|' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x7C, 0x7C, 0x7C },
213     { /* '}' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x7D, 0x7D, 0x7D },
214     { /* '~' */ _PDCLIB_CTYPE_GRAPH | _PDCLIB_CTYPE_PUNCT,                       0x7E, 0x7E, 0x7E },
215     { /* DEL */ _PDCLIB_CTYPE_CNTRL,                                             0x7F, 0x7F, 0x7F },
216     { 0x00, 0x80, 0x80, 0x80 },
217     { 0x00, 0x81, 0x81, 0x81 },
218     { 0x00, 0x82, 0x82, 0x82 },
219     { 0x00, 0x83, 0x83, 0x83 },
220     { 0x00, 0x84, 0x84, 0x84 },
221     { 0x00, 0x85, 0x85, 0x85 },
222     { 0x00, 0x86, 0x86, 0x86 },
223     { 0x00, 0x87, 0x87, 0x87 },
224     { 0x00, 0x88, 0x88, 0x88 },
225     { 0x00, 0x89, 0x89, 0x89 },
226     { 0x00, 0x8A, 0x8A, 0x8A },
227     { 0x00, 0x8B, 0x8B, 0x8B },
228     { 0x00, 0x8C, 0x8C, 0x8C },
229     { 0x00, 0x8D, 0x8D, 0x8D },
230     { 0x00, 0x8E, 0x8E, 0x8E },
231     { 0x00, 0x8F, 0x8F, 0x8F },
232     { 0x00, 0x90, 0x90, 0x90 },
233     { 0x00, 0x91, 0x91, 0x91 },
234     { 0x00, 0x92, 0x92, 0x92 },
235     { 0x00, 0x93, 0x93, 0x93 },
236     { 0x00, 0x94, 0x94, 0x94 },
237     { 0x00, 0x95, 0x95, 0x95 },
238     { 0x00, 0x96, 0x96, 0x96 },
239     { 0x00, 0x97, 0x97, 0x97 },
240     { 0x00, 0x98, 0x98, 0x98 },
241     { 0x00, 0x99, 0x99, 0x99 },
242     { 0x00, 0x9A, 0x9A, 0x9A },
243     { 0x00, 0x9B, 0x9B, 0x9B },
244     { 0x00, 0x9C, 0x9C, 0x9C },
245     { 0x00, 0x9D, 0x9D, 0x9D },
246     { 0x00, 0x9E, 0x9E, 0x9E },
247     { 0x00, 0x9F, 0x9F, 0x9F },
248     { 0x00, 0xA0, 0xA0, 0xA0 },
249     { 0x00, 0xA1, 0xA1, 0xA1 },
250     { 0x00, 0xA2, 0xA2, 0xA2 },
251     { 0x00, 0xA3, 0xA3, 0xA3 },
252     { 0x00, 0xA4, 0xA4, 0xA4 },
253     { 0x00, 0xA5, 0xA5, 0xA5 },
254     { 0x00, 0xA6, 0xA6, 0xA6 },
255     { 0x00, 0xA7, 0xA7, 0xA7 },
256     { 0x00, 0xA8, 0xA8, 0xA8 },
257     { 0x00, 0xA9, 0xA9, 0xA9 },
258     { 0x00, 0xAA, 0xAA, 0xAA },
259     { 0x00, 0xAB, 0xAB, 0xAB },
260     { 0x00, 0xAC, 0xAC, 0xAC },
261     { 0x00, 0xAD, 0xAD, 0xAD },
262     { 0x00, 0xAE, 0xAE, 0xAE },
263     { 0x00, 0xAF, 0xAF, 0xAF },
264     { 0x00, 0xB0, 0xB0, 0xB0 },
265     { 0x00, 0xB1, 0xB1, 0xB1 },
266     { 0x00, 0xB2, 0xB2, 0xB2 },
267     { 0x00, 0xB3, 0xB3, 0xB3 },
268     { 0x00, 0xB4, 0xB4, 0xB4 },
269     { 0x00, 0xB5, 0xB5, 0xB5 },
270     { 0x00, 0xB6, 0xB6, 0xB6 },
271     { 0x00, 0xB7, 0xB7, 0xB7 },
272     { 0x00, 0xB8, 0xB8, 0xB8 },
273     { 0x00, 0xB9, 0xB9, 0xB9 },
274     { 0x00, 0xBA, 0xBA, 0xBA },
275     { 0x00, 0xBB, 0xBB, 0xBB },
276     { 0x00, 0xBC, 0xBC, 0xBC },
277     { 0x00, 0xBD, 0xBD, 0xBD },
278     { 0x00, 0xBE, 0xBE, 0xBE },
279     { 0x00, 0xBF, 0xBF, 0xBF },
280     { 0x00, 0xC0, 0xC0, 0xC0 },
281     { 0x00, 0xC1, 0xC1, 0xC1 },
282     { 0x00, 0xC2, 0xC2, 0xC2 },
283     { 0x00, 0xC3, 0xC3, 0xC3 },
284     { 0x00, 0xC4, 0xC4, 0xC4 },
285     { 0x00, 0xC5, 0xC5, 0xC5 },
286     { 0x00, 0xC6, 0xC6, 0xC6 },
287     { 0x00, 0xC7, 0xC7, 0xC7 },
288     { 0x00, 0xC8, 0xC8, 0xC8 },
289     { 0x00, 0xC9, 0xC9, 0xC9 },
290     { 0x00, 0xCA, 0xCA, 0xCA },
291     { 0x00, 0xCB, 0xCB, 0xCB },
292     { 0x00, 0xCC, 0xCC, 0xCC },
293     { 0x00, 0xCD, 0xCD, 0xCD },
294     { 0x00, 0xCE, 0xCE, 0xCE },
295     { 0x00, 0xCF, 0xCF, 0xCF },
296     { 0x00, 0xD0, 0xD0, 0xD0 },
297     { 0x00, 0xD1, 0xD1, 0xD1 },
298     { 0x00, 0xD2, 0xD2, 0xD2 },
299     { 0x00, 0xD3, 0xD3, 0xD3 },
300     { 0x00, 0xD4, 0xD4, 0xD4 },
301     { 0x00, 0xD5, 0xD5, 0xD5 },
302     { 0x00, 0xD6, 0xD6, 0xD6 },
303     { 0x00, 0xD7, 0xD7, 0xD7 },
304     { 0x00, 0xD8, 0xD8, 0xD8 },
305     { 0x00, 0xD9, 0xD9, 0xD9 },
306     { 0x00, 0xDA, 0xDA, 0xDA },
307     { 0x00, 0xDB, 0xDB, 0xDB },
308     { 0x00, 0xDC, 0xDC, 0xDC },
309     { 0x00, 0xDD, 0xDD, 0xDD },
310     { 0x00, 0xDE, 0xDE, 0xDE },
311     { 0x00, 0xDF, 0xDF, 0xDF },
312     { 0x00, 0xE0, 0xE0, 0xE0 },
313     { 0x00, 0xE1, 0xE1, 0xE1 },
314     { 0x00, 0xE2, 0xE2, 0xE2 },
315     { 0x00, 0xE3, 0xE3, 0xE3 },
316     { 0x00, 0xE4, 0xE4, 0xE4 },
317     { 0x00, 0xE5, 0xE5, 0xE5 },
318     { 0x00, 0xE6, 0xE6, 0xE6 },
319     { 0x00, 0xE7, 0xE7, 0xE7 },
320     { 0x00, 0xE8, 0xE8, 0xE8 },
321     { 0x00, 0xE9, 0xE9, 0xE9 },
322     { 0x00, 0xEA, 0xEA, 0xEA },
323     { 0x00, 0xEB, 0xEB, 0xEB },
324     { 0x00, 0xEC, 0xEC, 0xEC },
325     { 0x00, 0xED, 0xED, 0xED },
326     { 0x00, 0xEE, 0xEE, 0xEE },
327     { 0x00, 0xEF, 0xEF, 0xEF },
328     { 0x00, 0xF0, 0xF0, 0xF0 },
329     { 0x00, 0xF1, 0xF1, 0xF1 },
330     { 0x00, 0xF2, 0xF2, 0xF2 },
331     { 0x00, 0xF3, 0xF3, 0xF3 },
332     { 0x00, 0xF4, 0xF4, 0xF4 },
333     { 0x00, 0xF5, 0xF5, 0xF5 },
334     { 0x00, 0xF6, 0xF6, 0xF6 },
335     { 0x00, 0xF7, 0xF7, 0xF7 },
336     { 0x00, 0xF8, 0xF8, 0xF8 },
337     { 0x00, 0xF9, 0xF9, 0xF9 },
338     { 0x00, 0xFA, 0xFA, 0xFA },
339     { 0x00, 0xFB, 0xFB, 0xFB },
340     { 0x00, 0xFC, 0xFC, 0xFC },
341     { 0x00, 0xFD, 0xFD, 0xFD },
342     { 0x00, 0xFE, 0xFE, 0xFE },
343     { 0x00, 0xFF, 0xFF, 0xFF }
344 };
345
346 extern const struct _PDCLIB_charcodec_t _PDCLIB_ascii_codec;
347 struct _PDCLIB_locale _PDCLIB_global_locale = {
348     ._Codec = &_PDCLIB_ascii_codec,
349     ._Conv  = { 
350         /* decimal_point      */ (char *)".",
351         /* thousands_sep      */ (char *)"",
352         /* grouping           */ (char *)"",
353         /* mon_decimal_point  */ (char *)"",
354         /* mon_thousands_sep  */ (char *)"",
355         /* mon_grouping       */ (char *)"",
356         /* positive_sign      */ (char *)"",
357         /* negative_sign      */ (char *)"",
358         /* currency_symbol    */ (char *)"",
359         /* int_curr_symbol    */ (char *)"",
360         /* frac_digits        */ CHAR_MAX,
361         /* p_cs_precedes      */ CHAR_MAX,
362         /* n_cs_precedes      */ CHAR_MAX,
363         /* p_sep_by_space     */ CHAR_MAX,
364         /* n_sep_by_space     */ CHAR_MAX,
365         /* p_sign_posn        */ CHAR_MAX,
366         /* n_sign_posn        */ CHAR_MAX,
367         /* int_frac_digits    */ CHAR_MAX,
368         /* int_p_cs_precedes  */ CHAR_MAX,
369         /* int_n_cs_precedes  */ CHAR_MAX,
370         /* int_p_sep_by_space */ CHAR_MAX,
371         /* int_n_sep_by_space */ CHAR_MAX,
372         /* int_p_sign_posn    */ CHAR_MAX,
373         /* int_n_sign_posn    */ CHAR_MAX,
374     },
375     ._CType = &global_ctype[1],
376     ._ErrnoStr = {
377         "Success"
378         "EPERM (operation not permitted)",
379         "ENOENT (no such file or directory)",
380         "ESRCH (no such process)",
381         "EINTR (interrupted)",
382         "EIO (io error)",
383         "ENXIO (no such device or address)",
384         "E2BIG (argument list too long)",
385         "ENOEXEC (executable format error)",
386         "EBADF (bad file descriptor)",
387         "ECHILD (no child process)",
388         "EAGAIN (resource unavailable try again)",
389         "ENOMEM (not enough memory)",
390         "EACCES (permission denied)",
391         "EFAULT (bad address)",
392         "Unknown error",
393         "EBUSY (device or resource busy)",
394         "EEXIST (file exists)",
395         "EXDEV (cross device link)",
396         "ENODEV (no such device)",
397         "ENOTDIR (not a directory)",
398         "EISDIR (is a directory)",
399         "EINVAL (invalid argument)",
400         "ENFILE (too many files open in system)",
401         "EMFILE (too many files open)",
402         "ENOTTY (inappropriate io control operation)",
403         "Unknown error",
404         "EFBIG (file too large)",
405         "ENOSPC (no space on device)",
406         "ESPIPE (invalid seek)",
407         "EROFS (read only file system)",
408         "EMLINK (too many links)",
409         "EPIPE (broken pipe)",
410         "EDOM (argument out of domain)",
411         "ERANGE (result out of range)",
412         "Unknown error",
413         "EDEADLK (resource deadlock would occur)",
414         "Unknown error",
415         "ENAMETOOLONG (filename too long)",
416         "ENOLCK (no lock available)",
417         "ENOSYS (function not supported)",
418         "ENOTEMPTY (directory not empty)",
419         "EILSEQ (illegal byte sequence)",
420         "Unknown error",
421         "Unknown error",
422         "Unknown error",
423         "Unknown error",
424         "Unknown error",
425         "Unknown error",
426         "Unknown error",
427         "Unknown error",
428         "Unknown error",
429         "Unknown error",
430         "Unknown error",
431         "Unknown error",
432         "Unknown error",
433         "Unknown error",
434         "Unknown error",
435         "Unknown error",
436         "Unknown error",
437         "Unknown error",
438         "Unknown error",
439         "Unknown error",
440         "Unknown error",
441         "Unknown error",
442         "Unknown error",
443         "Unknown error",
444         "Unknown error",
445         "Unknown error",
446         "Unknown error",
447         "Unknown error",
448         "Unknown error",
449         "Unknown error",
450         "Unknown error",
451         "Unknown error",
452         "Unknown error",
453         "Unknown error",
454         "Unknown error",
455         "Unknown error",
456         "Unknown error",
457         "Unknown error",
458         "Unknown error",
459         "Unknown error",
460         "Unknown error",
461         "Unknown error",
462         "Unknown error",
463         "Unknown error",
464         "Unknown error",
465         "Unknown error",
466         "Unknown error",
467         "Unknown error",
468         "Unknown error",
469         "Unknown error",
470         "Unknown error",
471         "Unknown error",
472         "Unknown error",
473         "Unknown error",
474         "Unknown error",
475         "Unknown error",
476         "Unknown error",
477         "EADDRINUSE (address in use)",
478         "EADDRNOTAVAIL (address not available)",
479         "EAFNOSUPPORT (address family not supported)",
480         "EALREADY (connection already in progress)",
481         "EBADMSG (bad message)",
482         "ECANCELED (operation canceled)",
483         "ECONNABORTED (connection aborted)",
484         "ECONNREFUSED (connection refused)",
485         "ECONNRESET (connection reset)",
486         "EDESTADDRREQ (destination address required)",
487         "EHOSTUNREACH (host unreachable)",
488         "EIDRM (identifier removed)",
489         "EINPROGRESS (operation in progress)",
490         "EISCONN (already connected)",
491         "ELOOP (too many symbolic link levels)",
492         "EMSGSIZE (message size)",
493         "ENETDOWN (network down)",
494         "ENETRESET (network reset)",
495         "ENETUNREACH (network unreachable)",
496         "ENOBUFS (no buffer space)",
497         "ENODATA (no message available)",
498         "ENOLINK (no link)",
499         "ENOMSG (no message)",
500         "ENOPROTOOPT (no protocol option)",
501         "ENOSR (no stream resources)",
502         "ENOSTR (not a stream)",
503         "ENOTCONN (not connected)",
504         "ENOTRECOVERABLE (state not recoverable)",
505         "ENOTSOCK (not a socket)",
506         "ENOTSUP (not supported)",
507         "EOPNOTSUPP (operation not supported)",
508         "Unknown error",
509         "EOVERFLOW (value too large)",
510         "EOWNERDEAD (owner dead)",
511         "EPROTO (protocol error)",
512         "EPROTONOSUPPORT (protocol not supported)",
513         "EPROTOTYPE (wrong protocol type)",
514         "ETIME (stream timeout)",
515         "ETIMEDOUT (timed out)",
516         "ETXTBSY (text file busy)",
517         "EWOULDBLOCK (operation would block)",
518     },
519 };
520 #endif
521
522 #ifdef TEST
523 #include "_PDCLIB_test.h"
524
525 int main( void )
526 {
527     /* Testing covered by several other testdrivers using stdin / stdout / 
528        stderr.
529     */
530     return TEST_RESULTS;
531 }
532
533 #endif