locale 0.2.2

Library for basic localisation. Warning: Major rewrite pending for 0.3!
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
//! Items for use with nl_langinfo_l and associated properties.
#![allow(non_camel_case_types)]

use ::std::borrow::Cow;
use ::std::ffi::CStr;
use ::std::fmt::Debug;
use ::std::mem::transmute_copy;
use super::ffi;
use super::IConv;

pub trait LanginfoItem<'a> : Copy + Sized {
    type Type : Debug;
    fn needs_iconv() -> Option<CodesetItems>;
    unsafe fn decode(&self, *const ::libc::c_char, Option<&IConv>) -> Self::Type;
    fn to_ffi(self) -> ffi::nl_item;
}

unsafe fn decode_string<'a>(ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
    if ptr.is_null() {
        return Cow::Borrowed("");
    }
    let cres: &'a CStr = CStr::from_ptr(ptr);
    if let Some(iconv) = iconv {
        let capacity = 4 * cres.to_bytes().len();
        let mut buf = Vec::with_capacity(capacity);
        buf.set_len(capacity);
        let conv = iconv.convert(cres.to_bytes(), &mut buf);
        buf.set_len(conv.2);
        if let Ok(s) = String::from_utf8(buf) {
            return Cow::Owned(s);
        }
    }
    return String::from_utf8_lossy(cres.to_bytes());
}

unsafe fn decode_strings<'a>(mut ptr: *const ::libc::c_char, iconv: Option<&IConv>, max: usize) -> Vec<Cow<'a, str>> {
    let mut res = Vec::with_capacity(max);
    while max > 0 && !ptr.is_null() && *ptr != 0 {
        let len = CStr::from_ptr(ptr).to_bytes_with_nul().len();
        let s = decode_string(ptr, iconv);
        ptr = ptr.offset(len as isize);
        res.push(s);
    }
    return res;
}

unsafe fn decode_bytes<'a>(ptr: *const ::libc::c_char) -> &'a [i8] {
    if ptr.is_null() {
        &[]
    } else {
        ::std::slice::from_raw_parts(ptr as *const i8, ::libc::strlen(ptr) as usize)
    }
}

/// `nl_langinfo` items that return charset names
#[derive(Copy, Clone, Debug)]
pub enum CodesetItems {
    _NL_COLLATE_CODESET = ffi::_NL_COLLATE_CODESET as isize,
    _NL_CTYPE_CODESET_NAME = ffi::_NL_CTYPE_CODESET_NAME as isize,
    _NL_MONETARY_CODESET = ffi::_NL_MONETARY_CODESET as isize,
    _NL_NUMERIC_CODESET = ffi::_NL_NUMERIC_CODESET as isize,
    _NL_TIME_CODESET = ffi::_NL_TIME_CODESET as isize,
    _NL_MESSAGES_CODESET = ffi::_NL_MESSAGES_CODESET as isize,
    _NL_PAPER_CODESET = ffi::_NL_PAPER_CODESET as isize,
    _NL_NAME_CODESET = ffi::_NL_NAME_CODESET as isize,
    _NL_ADDRESS_CODESET = ffi::_NL_ADDRESS_CODESET as isize,
    _NL_TELEPHONE_CODESET = ffi::_NL_TELEPHONE_CODESET as isize,
    _NL_MEASUREMENT_CODESET = ffi::_NL_MEASUREMENT_CODESET as isize,
    _NL_IDENTIFICATION_CODESET = ffi::_NL_IDENTIFICATION_CODESET as isize,
}

impl<'a> LanginfoItem<'a> for CodesetItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { None }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, _: Option<&IConv>) -> Cow<'a, str> {
        String::from_utf8_lossy(CStr::from_ptr(ptr).to_bytes())
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::CodesetItems::*;
pub use self::CodesetItems::_NL_CTYPE_CODESET_NAME as CODESET;

/// `nl_langinfo` items in `LC_COLLATE` category that have string values
///
/// The decoding function uses appropriate 
#[derive(Copy, Clone, Debug)]
pub enum CollateStringItems {
    _NL_COLLATE_RULESETS = ffi::_NL_COLLATE_RULESETS as isize,
}

impl<'a> LanginfoItem<'a> for CollateStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_COLLATE_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::CollateStringItems::*;

/// `nl_langinfo` items in `LC_CTYPE` category that have string values
#[derive(Copy, Clone, Debug)]
pub enum CTypeStringItems {
    _NL_CTYPE_INDIGITS0_MB = ffi::_NL_CTYPE_INDIGITS0_MB as isize,
    _NL_CTYPE_INDIGITS1_MB = ffi::_NL_CTYPE_INDIGITS1_MB as isize,
    _NL_CTYPE_INDIGITS2_MB = ffi::_NL_CTYPE_INDIGITS2_MB as isize,
    _NL_CTYPE_INDIGITS3_MB = ffi::_NL_CTYPE_INDIGITS3_MB as isize,
    _NL_CTYPE_INDIGITS4_MB = ffi::_NL_CTYPE_INDIGITS4_MB as isize,
    _NL_CTYPE_INDIGITS5_MB = ffi::_NL_CTYPE_INDIGITS5_MB as isize,
    _NL_CTYPE_INDIGITS6_MB = ffi::_NL_CTYPE_INDIGITS6_MB as isize,
    _NL_CTYPE_INDIGITS7_MB = ffi::_NL_CTYPE_INDIGITS7_MB as isize,
    _NL_CTYPE_INDIGITS8_MB = ffi::_NL_CTYPE_INDIGITS8_MB as isize,
    _NL_CTYPE_INDIGITS9_MB = ffi::_NL_CTYPE_INDIGITS9_MB as isize,
    _NL_CTYPE_OUTDIGIT0_MB = ffi::_NL_CTYPE_OUTDIGIT0_MB as isize,
    _NL_CTYPE_OUTDIGIT1_MB = ffi::_NL_CTYPE_OUTDIGIT1_MB as isize,
    _NL_CTYPE_OUTDIGIT2_MB = ffi::_NL_CTYPE_OUTDIGIT2_MB as isize,
    _NL_CTYPE_OUTDIGIT3_MB = ffi::_NL_CTYPE_OUTDIGIT3_MB as isize,
    _NL_CTYPE_OUTDIGIT4_MB = ffi::_NL_CTYPE_OUTDIGIT4_MB as isize,
    _NL_CTYPE_OUTDIGIT5_MB = ffi::_NL_CTYPE_OUTDIGIT5_MB as isize,
    _NL_CTYPE_OUTDIGIT6_MB = ffi::_NL_CTYPE_OUTDIGIT6_MB as isize,
    _NL_CTYPE_OUTDIGIT7_MB = ffi::_NL_CTYPE_OUTDIGIT7_MB as isize,
    _NL_CTYPE_OUTDIGIT8_MB = ffi::_NL_CTYPE_OUTDIGIT8_MB as isize,
    _NL_CTYPE_OUTDIGIT9_MB = ffi::_NL_CTYPE_OUTDIGIT9_MB as isize,
    _NL_CTYPE_TRANSLIT_IGNORE = ffi::_NL_CTYPE_TRANSLIT_IGNORE as isize,
}

impl<'a> LanginfoItem<'a> for CTypeStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_CTYPE_CODESET_NAME) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::CTypeStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum CTypeStringListItems {
    _NL_CTYPE_CLASS_NAMES = ffi::_NL_CTYPE_CLASS_NAMES as isize,
    _NL_CTYPE_MAP_NAMES = ffi::_NL_CTYPE_MAP_NAMES as isize,
}

impl<'a> LanginfoItem<'a> for CTypeStringListItems {
    type Type = Vec<Cow<'a, str>>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_CTYPE_CODESET_NAME) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Vec<Cow<'a, str>> {
        decode_strings(ptr, iconv, 32)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::CTypeStringListItems::*;

#[derive(Copy, Clone, Debug)]
pub enum MonetaryStringItems {
    INT_CURR_SYMBOL = ffi::__INT_CURR_SYMBOL as isize,
    CURRENCY_SYMBOL = ffi::__CURRENCY_SYMBOL as isize,
    MON_DECIMAL_POINT = ffi::__MON_DECIMAL_POINT as isize,
    MON_THOUSANDS_SEP = ffi::__MON_THOUSANDS_SEP as isize,
    POSITIVE_SIGN = ffi::__POSITIVE_SIGN as isize,
    NEGATIVE_SIGN = ffi::__NEGATIVE_SIGN as isize,
    _NL_MONETARY_CRNCYSTR = ffi::_NL_MONETARY_CRNCYSTR as isize,
    _NL_MONETARY_DUO_INT_CURR_SYMBOL = ffi::_NL_MONETARY_DUO_INT_CURR_SYMBOL as isize,
    _NL_MONETARY_DUO_CURRENCY_SYMBOL = ffi::_NL_MONETARY_DUO_CURRENCY_SYMBOL as isize,
}

impl<'a> LanginfoItem<'a> for MonetaryStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_MONETARY_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::MonetaryStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum NumericStringItems {
    __DECIMAL_POINT = ffi::__DECIMAL_POINT as isize,
    __THOUSANDS_SEP = ffi::__THOUSANDS_SEP as isize,
}

impl<'a> LanginfoItem<'a> for NumericStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_NUMERIC_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::NumericStringItems::*;

pub use self::NumericStringItems::__DECIMAL_POINT as RADIXCHAR;
pub use self::NumericStringItems::__THOUSANDS_SEP as THOUSEP;

#[derive(Copy, Clone, Debug)]
pub enum TimeStringItems {
    ABDAY_1 = ffi::ABDAY_1 as isize,
    ABDAY_2 = ffi::ABDAY_2 as isize,
    ABDAY_3 = ffi::ABDAY_3 as isize,
    ABDAY_4 = ffi::ABDAY_4 as isize,
    ABDAY_5 = ffi::ABDAY_5 as isize,
    ABDAY_6 = ffi::ABDAY_6 as isize,
    ABDAY_7 = ffi::ABDAY_7 as isize,
    DAY_1 = ffi::DAY_1 as isize,
    DAY_2 = ffi::DAY_2 as isize,
    DAY_3 = ffi::DAY_3 as isize,
    DAY_4 = ffi::DAY_4 as isize,
    DAY_5 = ffi::DAY_5 as isize,
    DAY_6 = ffi::DAY_6 as isize,
    DAY_7 = ffi::DAY_7 as isize,
    ABMON_1 = ffi::ABMON_1 as isize,
    ABMON_2 = ffi::ABMON_2 as isize,
    ABMON_3 = ffi::ABMON_3 as isize,
    ABMON_4 = ffi::ABMON_4 as isize,
    ABMON_5 = ffi::ABMON_5 as isize,
    ABMON_6 = ffi::ABMON_6 as isize,
    ABMON_7 = ffi::ABMON_7 as isize,
    ABMON_8 = ffi::ABMON_8 as isize,
    ABMON_9 = ffi::ABMON_9 as isize,
    ABMON_10 = ffi::ABMON_10 as isize,
    ABMON_11 = ffi::ABMON_11 as isize,
    ABMON_12 = ffi::ABMON_12 as isize,
    MON_1 = ffi::MON_1 as isize,
    MON_2 = ffi::MON_2 as isize,
    MON_3 = ffi::MON_3 as isize,
    MON_4 = ffi::MON_4 as isize,
    MON_5 = ffi::MON_5 as isize,
    MON_6 = ffi::MON_6 as isize,
    MON_7 = ffi::MON_7 as isize,
    MON_8 = ffi::MON_8 as isize,
    MON_9 = ffi::MON_9 as isize,
    MON_10 = ffi::MON_10 as isize,
    MON_11 = ffi::MON_11 as isize,
    MON_12 = ffi::MON_12 as isize,
    AM_STR = ffi::AM_STR as isize,
    PM_STR = ffi::PM_STR as isize,
    D_T_FMT = ffi::D_T_FMT as isize,
    D_FMT = ffi::D_FMT as isize,
    T_FMT = ffi::T_FMT as isize,
    T_FMT_AMPM = ffi::T_FMT_AMPM as isize,
    ERA_YEAR = ffi::__ERA_YEAR as isize,
    ERA_D_FMT = ffi::ERA_D_FMT as isize,
    ERA_D_T_FMT = ffi::ERA_D_T_FMT as isize,
    ERA_T_FMT = ffi::ERA_T_FMT as isize,
    _NL_TIME_ERA_ENTRIES = ffi::_NL_TIME_ERA_ENTRIES as isize,
    _NL_TIME_TIMEZONE = ffi::_NL_TIME_TIMEZONE as isize,
    _DATE_FMT = ffi::_DATE_FMT as isize,
}

impl<'a> LanginfoItem<'a> for TimeStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_TIME_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::TimeStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum TimeStringListItems {
    ERA = ffi::ERA as isize,
    ALT_DIGITS = ffi::ALT_DIGITS as isize,
}

impl<'a> LanginfoItem<'a> for TimeStringListItems {
    type Type = Vec<Cow<'a, str>>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_TIME_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Vec<Cow<'a, str>> {
        decode_strings(ptr, iconv, 100)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::TimeStringListItems::*;

#[derive(Copy, Clone, Debug)]
pub enum MessagesStringItems {
    YESEXPR = ffi::__YESEXPR as isize,
    NOEXPR = ffi::__NOEXPR as isize,
    YESSTR = ffi::__YESSTR as isize,
    NOSTR = ffi::__NOSTR as isize,
}

impl<'a> LanginfoItem<'a> for MessagesStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_MESSAGES_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::MessagesStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum NameStringItems {
    _NL_NAME_NAME_FMT = ffi::_NL_NAME_NAME_FMT as isize,
    _NL_NAME_NAME_GEN = ffi::_NL_NAME_NAME_GEN as isize,
    _NL_NAME_NAME_MR = ffi::_NL_NAME_NAME_MR as isize,
    _NL_NAME_NAME_MRS = ffi::_NL_NAME_NAME_MRS as isize,
    _NL_NAME_NAME_MISS = ffi::_NL_NAME_NAME_MISS as isize,
    _NL_NAME_NAME_MS = ffi::_NL_NAME_NAME_MS as isize,
}

impl<'a> LanginfoItem<'a> for NameStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_NAME_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::NameStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum AddressStringItems {
    _NL_ADDRESS_POSTAL_FMT = ffi::_NL_ADDRESS_POSTAL_FMT as isize,
    _NL_ADDRESS_COUNTRY_NAME = ffi::_NL_ADDRESS_COUNTRY_NAME as isize,
    _NL_ADDRESS_COUNTRY_POST = ffi::_NL_ADDRESS_COUNTRY_POST as isize,
    _NL_ADDRESS_COUNTRY_AB2 = ffi::_NL_ADDRESS_COUNTRY_AB2 as isize,
    _NL_ADDRESS_COUNTRY_AB3 = ffi::_NL_ADDRESS_COUNTRY_AB3 as isize,
    _NL_ADDRESS_COUNTRY_CAR = ffi::_NL_ADDRESS_COUNTRY_CAR as isize,
    _NL_ADDRESS_COUNTRY_ISBN = ffi::_NL_ADDRESS_COUNTRY_ISBN as isize,
    _NL_ADDRESS_LANG_NAME = ffi::_NL_ADDRESS_LANG_NAME as isize,
    _NL_ADDRESS_LANG_AB = ffi::_NL_ADDRESS_LANG_AB as isize,
    _NL_ADDRESS_LANG_TERM = ffi::_NL_ADDRESS_LANG_TERM as isize,
    _NL_ADDRESS_LANG_LIB = ffi::_NL_ADDRESS_LANG_LIB as isize,
}

impl<'a> LanginfoItem<'a> for AddressStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_ADDRESS_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::AddressStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum TelephoneStringItems {
    _NL_TELEPHONE_TEL_INT_FMT = ffi::_NL_TELEPHONE_TEL_INT_FMT as isize,
    _NL_TELEPHONE_TEL_DOM_FMT = ffi::_NL_TELEPHONE_TEL_DOM_FMT as isize,
    _NL_TELEPHONE_INT_SELECT = ffi::_NL_TELEPHONE_INT_SELECT as isize,
    _NL_TELEPHONE_INT_PREFIX = ffi::_NL_TELEPHONE_INT_PREFIX as isize,
}

impl<'a> LanginfoItem<'a> for TelephoneStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_TELEPHONE_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::TelephoneStringItems::*;

#[derive(Copy, Clone, Debug)]
pub enum ByteItems {
    // Monetary
    __INT_FRAC_DIGITS = ffi::__INT_FRAC_DIGITS as isize,
    __FRAC_DIGITS = ffi::__FRAC_DIGITS as isize,
    __P_CS_PRECEDES = ffi::__P_CS_PRECEDES as isize,
    __P_SEP_BY_SPACE = ffi::__P_SEP_BY_SPACE as isize,
    __N_CS_PRECEDES = ffi::__N_CS_PRECEDES as isize,
    __N_SEP_BY_SPACE = ffi::__N_SEP_BY_SPACE as isize,
    __P_SIGN_POSN = ffi::__P_SIGN_POSN as isize,
    __N_SIGN_POSN = ffi::__N_SIGN_POSN as isize,
    __INT_P_CS_PRECEDES = ffi::__INT_P_CS_PRECEDES as isize,
    __INT_P_SEP_BY_SPACE = ffi::__INT_P_SEP_BY_SPACE as isize,
    __INT_N_CS_PRECEDES = ffi::__INT_N_CS_PRECEDES as isize,
    __INT_N_SEP_BY_SPACE = ffi::__INT_N_SEP_BY_SPACE as isize,
    __INT_P_SIGN_POSN = ffi::__INT_P_SIGN_POSN as isize,
    __INT_N_SIGN_POSN = ffi::__INT_N_SIGN_POSN as isize,
    _NL_MONETARY_DUO_INT_FRAC_DIGITS = ffi::_NL_MONETARY_DUO_INT_FRAC_DIGITS as isize,
    _NL_MONETARY_DUO_FRAC_DIGITS = ffi::_NL_MONETARY_DUO_FRAC_DIGITS as isize,
    _NL_MONETARY_DUO_P_CS_PRECEDES = ffi::_NL_MONETARY_DUO_P_CS_PRECEDES as isize,
    _NL_MONETARY_DUO_P_SEP_BY_SPACE = ffi::_NL_MONETARY_DUO_P_SEP_BY_SPACE as isize,
    _NL_MONETARY_DUO_N_CS_PRECEDES = ffi::_NL_MONETARY_DUO_N_CS_PRECEDES as isize,
    _NL_MONETARY_DUO_N_SEP_BY_SPACE = ffi::_NL_MONETARY_DUO_N_SEP_BY_SPACE as isize,
    _NL_MONETARY_DUO_INT_P_CS_PRECEDES = ffi::_NL_MONETARY_DUO_INT_P_CS_PRECEDES as isize,
    _NL_MONETARY_DUO_INT_P_SEP_BY_SPACE = ffi::_NL_MONETARY_DUO_INT_P_SEP_BY_SPACE as isize,
    _NL_MONETARY_DUO_INT_N_CS_PRECEDES = ffi::_NL_MONETARY_DUO_INT_N_CS_PRECEDES as isize,
    _NL_MONETARY_DUO_INT_N_SEP_BY_SPACE = ffi::_NL_MONETARY_DUO_INT_N_SEP_BY_SPACE as isize,
    _NL_MONETARY_DUO_P_SIGN_POSN = ffi::_NL_MONETARY_DUO_P_SIGN_POSN as isize,
    _NL_MONETARY_DUO_N_SIGN_POSN = ffi::_NL_MONETARY_DUO_N_SIGN_POSN as isize,
    _NL_MONETARY_DUO_INT_P_SIGN_POSN = ffi::_NL_MONETARY_DUO_INT_P_SIGN_POSN as isize,
    _NL_MONETARY_DUO_INT_N_SIGN_POSN = ffi::_NL_MONETARY_DUO_INT_N_SIGN_POSN as isize,
    // Time
    _NL_TIME_WEEK_NDAYS = ffi::_NL_TIME_WEEK_NDAYS as isize,
    _NL_TIME_WEEK_1STWEEK = ffi::_NL_TIME_WEEK_1STWEEK as isize,
    _NL_TIME_FIRST_WEEKDAY = ffi::_NL_TIME_FIRST_WEEKDAY as isize,
    _NL_TIME_FIRST_WORKDAY = ffi::_NL_TIME_FIRST_WORKDAY as isize,
    _NL_TIME_CAL_DIRECTION = ffi::_NL_TIME_CAL_DIRECTION as isize,
    // Measurement
    _NL_MEASUREMENT_MEASUREMENT = ffi::_NL_MEASUREMENT_MEASUREMENT as isize,
}

impl<'a> LanginfoItem<'a> for ByteItems {
    type Type = i8;
    fn needs_iconv() -> Option<CodesetItems> { None }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, _: Option<&IConv>) -> i8 {
        *ptr as i8
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::ByteItems::*;

#[derive(Copy, Clone, Debug)]
pub enum ByteArrayItems {
    // CType
    _NL_CTYPE_WIDTH = ffi::_NL_CTYPE_WIDTH as isize,
    // Monetary
    __MON_GROUPING = ffi::__MON_GROUPING as isize,
    // Numeric
    __GROUPING = ffi::__GROUPING as isize,
}

impl<'a> LanginfoItem<'a> for ByteArrayItems {
    type Type = &'a [i8];
    fn needs_iconv() -> Option<CodesetItems> { None }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, _: Option<&IConv>) -> &'a [i8] {
        decode_bytes(ptr)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::ByteArrayItems::*;

#[derive(Copy, Clone, Debug)]
pub enum IntegralItems {
    // Collate
    _NL_COLLATE_NRULES = ffi::_NL_COLLATE_NRULES as isize,
    _NL_COLLATE_SYMB_HASH_SIZEMB = ffi::_NL_COLLATE_SYMB_HASH_SIZEMB as isize,
    // CType
    _NL_CTYPE_MB_CUR_MAX = ffi::_NL_CTYPE_MB_CUR_MAX as isize,
    _NL_CTYPE_CLASS_OFFSET = ffi::_NL_CTYPE_CLASS_OFFSET as isize,
    _NL_CTYPE_MAP_OFFSET = ffi::_NL_CTYPE_MAP_OFFSET as isize,
    _NL_CTYPE_INDIGITS_MB_LEN = ffi::_NL_CTYPE_INDIGITS_MB_LEN as isize,
    _NL_CTYPE_INDIGITS_WC_LEN = ffi::_NL_CTYPE_INDIGITS_WC_LEN as isize,
    _NL_CTYPE_TRANSLIT_TAB_SIZE = ffi::_NL_CTYPE_TRANSLIT_TAB_SIZE as isize,
    _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN = ffi::_NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN as isize,
    _NL_CTYPE_TRANSLIT_IGNORE_LEN = ffi::_NL_CTYPE_TRANSLIT_IGNORE_LEN as isize,
    _NL_CTYPE_MAP_TO_NONASCII = ffi::_NL_CTYPE_MAP_TO_NONASCII as isize,
    _NL_CTYPE_NONASCII_CASE = ffi::_NL_CTYPE_NONASCII_CASE as isize,
    // Monetary
    _NL_MONETARY_UNO_VALID_FROM = ffi::_NL_MONETARY_UNO_VALID_FROM as isize,
    _NL_MONETARY_UNO_VALID_TO = ffi::_NL_MONETARY_UNO_VALID_TO as isize,
    _NL_MONETARY_DUO_VALID_FROM = ffi::_NL_MONETARY_DUO_VALID_FROM as isize,
    _NL_MONETARY_DUO_VALID_TO = ffi::_NL_MONETARY_DUO_VALID_TO as isize,
    // Time
    _NL_TIME_ERA_NUM_ENTRIES = ffi::_NL_TIME_ERA_NUM_ENTRIES as isize,
    _NL_TIME_WEEK_1STDAY = ffi::_NL_TIME_WEEK_1STDAY as isize,
    // Paper
    _NL_PAPER_HEIGHT = ffi::_NL_PAPER_HEIGHT as isize,
    _NL_PAPER_WIDTH = ffi::_NL_PAPER_WIDTH as isize,
    // Address
    _NL_ADDRESS_COUNTRY_NUM = ffi::_NL_ADDRESS_COUNTRY_NUM as isize,
}

impl<'a> LanginfoItem<'a> for IntegralItems {
    type Type = u32;
    fn needs_iconv() -> Option<CodesetItems> { None }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, _: Option<&IConv>) -> u32 {
        transmute_copy(&ptr)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::IntegralItems::*;

#[derive(Copy, Clone, Debug)]
pub enum CharacterItems {
    // CType
    _NL_CTYPE_OUTDIGIT0_WC = ffi::_NL_CTYPE_OUTDIGIT0_WC as isize,
    _NL_CTYPE_OUTDIGIT1_WC = ffi::_NL_CTYPE_OUTDIGIT1_WC as isize,
    _NL_CTYPE_OUTDIGIT2_WC = ffi::_NL_CTYPE_OUTDIGIT2_WC as isize,
    _NL_CTYPE_OUTDIGIT3_WC = ffi::_NL_CTYPE_OUTDIGIT3_WC as isize,
    _NL_CTYPE_OUTDIGIT4_WC = ffi::_NL_CTYPE_OUTDIGIT4_WC as isize,
    _NL_CTYPE_OUTDIGIT5_WC = ffi::_NL_CTYPE_OUTDIGIT5_WC as isize,
    _NL_CTYPE_OUTDIGIT6_WC = ffi::_NL_CTYPE_OUTDIGIT6_WC as isize,
    _NL_CTYPE_OUTDIGIT7_WC = ffi::_NL_CTYPE_OUTDIGIT7_WC as isize,
    _NL_CTYPE_OUTDIGIT8_WC = ffi::_NL_CTYPE_OUTDIGIT8_WC as isize,
    _NL_CTYPE_OUTDIGIT9_WC = ffi::_NL_CTYPE_OUTDIGIT9_WC as isize,
    // Monetary
    _NL_MONETARY_DECIMAL_POINT_WC = ffi::_NL_MONETARY_DECIMAL_POINT_WC as isize,
    _NL_MONETARY_THOUSANDS_SEP_WC = ffi::_NL_MONETARY_THOUSANDS_SEP_WC as isize,
    // Numeric
    _NL_NUMERIC_DECIMAL_POINT_WC = ffi::_NL_NUMERIC_DECIMAL_POINT_WC as isize,
    _NL_NUMERIC_THOUSANDS_SEP_WC = ffi::_NL_NUMERIC_THOUSANDS_SEP_WC as isize,
}

impl<'a> LanginfoItem<'a> for CharacterItems {
    type Type = char;
    fn needs_iconv() -> Option<CodesetItems> { None }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, _: Option<&IConv>) -> char {
        transmute_copy(&ptr)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::CharacterItems::*;

#[derive(Copy, Clone, Debug)]
pub enum IdentificationStringItems {
    _NL_IDENTIFICATION_TITLE = ffi::_NL_IDENTIFICATION_TITLE as isize,
    _NL_IDENTIFICATION_SOURCE = ffi::_NL_IDENTIFICATION_SOURCE as isize,
    _NL_IDENTIFICATION_ADDRESS = ffi::_NL_IDENTIFICATION_ADDRESS as isize,
    _NL_IDENTIFICATION_CONTACT = ffi::_NL_IDENTIFICATION_CONTACT as isize,
    _NL_IDENTIFICATION_EMAIL = ffi::_NL_IDENTIFICATION_EMAIL as isize,
    _NL_IDENTIFICATION_TEL = ffi::_NL_IDENTIFICATION_TEL as isize,
    _NL_IDENTIFICATION_FAX = ffi::_NL_IDENTIFICATION_FAX as isize,
    _NL_IDENTIFICATION_LANGUAGE = ffi::_NL_IDENTIFICATION_LANGUAGE as isize,
    _NL_IDENTIFICATION_TERRITORY = ffi::_NL_IDENTIFICATION_TERRITORY as isize,
    _NL_IDENTIFICATION_AUDIENCE = ffi::_NL_IDENTIFICATION_AUDIENCE as isize,
    _NL_IDENTIFICATION_APPLICATION = ffi::_NL_IDENTIFICATION_APPLICATION as isize,
    _NL_IDENTIFICATION_ABBREVIATION = ffi::_NL_IDENTIFICATION_ABBREVIATION as isize,
    _NL_IDENTIFICATION_REVISION = ffi::_NL_IDENTIFICATION_REVISION as isize,
    _NL_IDENTIFICATION_DATE = ffi::_NL_IDENTIFICATION_DATE as isize,
    _NL_IDENTIFICATION_CATEGORY = ffi::_NL_IDENTIFICATION_CATEGORY as isize,
    _NL_IDENTIFICATION_CATEGORY_1,
    _NL_IDENTIFICATION_CATEGORY_2,
    _NL_IDENTIFICATION_CATEGORY_3,
    _NL_IDENTIFICATION_CATEGORY_4,
    _NL_IDENTIFICATION_CATEGORY_5,
    _NL_IDENTIFICATION_CATEGORY_6,
    _NL_IDENTIFICATION_CATEGORY_7,
    _NL_IDENTIFICATION_CATEGORY_8,
    _NL_IDENTIFICATION_CATEGORY_9,
    _NL_IDENTIFICATION_CATEGORY_10,
    _NL_IDENTIFICATION_CATEGORY_11,
    _NL_IDENTIFICATION_CATEGORY_12,
}

impl<'a> LanginfoItem<'a> for IdentificationStringItems {
    type Type = Cow<'a, str>;
    fn needs_iconv() -> Option<CodesetItems> { Some(CodesetItems::_NL_IDENTIFICATION_CODESET) }
    unsafe fn decode(&self, ptr: *const ::libc::c_char, iconv: Option<&IConv>) -> Cow<'a, str> {
        decode_string(ptr, iconv)
    }
    fn to_ffi(self) -> ffi::nl_item { self as ffi::nl_item }
}

pub use self::IdentificationStringItems::*;