Guard the nl_langinfo() with HAS_NL_LANGINFO
[p5sagit/p5-mst-13.2.git] / ext / I18N / Langinfo / Langinfo.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 #ifdef I_LANGINFO
6 #   include <langinfo.h>
7 #endif
8
9 #define PERL_constant_NOTFOUND  1
10 #define PERL_constant_NOTDEF    2
11 #define PERL_constant_ISIV      3
12 #define PERL_constant_ISNO      4
13 #define PERL_constant_ISNV      5
14 #define PERL_constant_ISPV      6
15 #define PERL_constant_ISPVN     7
16 #define PERL_constant_ISSV      8
17 #define PERL_constant_ISUNDEF   9
18 #define PERL_constant_ISUV      10
19 #define PERL_constant_ISYES     11
20
21 #ifndef NVTYPE
22 typedef double NV; /* 5.6 and later define NVTYPE, and typedef NV to it.  */
23 #endif
24 static int
25 constant_5 (pTHX_ const char *name, IV *iv_return) {
26   /* When generated this function returned values for the list of names given
27      here.  However, subsequent manual editing may have added or removed some.
28      DAY_1 DAY_2 DAY_3 DAY_4 DAY_5 DAY_6 DAY_7 D_FMT MON_1 MON_2 MON_3 MON_4
29      MON_5 MON_6 MON_7 MON_8 MON_9 NOSTR T_FMT */
30   /* Offset 4 gives the best switch position.  */
31   switch (name[4]) {
32   case '1':
33     if (memEQ(name, "DAY_1", 5)) {
34     /*                   ^      */
35 #ifdef DAY_1
36       *iv_return = DAY_1;
37       return PERL_constant_ISIV;
38 #else
39       return PERL_constant_NOTDEF;
40 #endif
41     }
42     if (memEQ(name, "MON_1", 5)) {
43     /*                   ^      */
44 #ifdef MON_1
45       *iv_return = MON_1;
46       return PERL_constant_ISIV;
47 #else
48       return PERL_constant_NOTDEF;
49 #endif
50     }
51     break;
52   case '2':
53     if (memEQ(name, "DAY_2", 5)) {
54     /*                   ^      */
55 #ifdef DAY_2
56       *iv_return = DAY_2;
57       return PERL_constant_ISIV;
58 #else
59       return PERL_constant_NOTDEF;
60 #endif
61     }
62     if (memEQ(name, "MON_2", 5)) {
63     /*                   ^      */
64 #ifdef MON_2
65       *iv_return = MON_2;
66       return PERL_constant_ISIV;
67 #else
68       return PERL_constant_NOTDEF;
69 #endif
70     }
71     break;
72   case '3':
73     if (memEQ(name, "DAY_3", 5)) {
74     /*                   ^      */
75 #ifdef DAY_3
76       *iv_return = DAY_3;
77       return PERL_constant_ISIV;
78 #else
79       return PERL_constant_NOTDEF;
80 #endif
81     }
82     if (memEQ(name, "MON_3", 5)) {
83     /*                   ^      */
84 #ifdef MON_3
85       *iv_return = MON_3;
86       return PERL_constant_ISIV;
87 #else
88       return PERL_constant_NOTDEF;
89 #endif
90     }
91     break;
92   case '4':
93     if (memEQ(name, "DAY_4", 5)) {
94     /*                   ^      */
95 #ifdef DAY_4
96       *iv_return = DAY_4;
97       return PERL_constant_ISIV;
98 #else
99       return PERL_constant_NOTDEF;
100 #endif
101     }
102     if (memEQ(name, "MON_4", 5)) {
103     /*                   ^      */
104 #ifdef MON_4
105       *iv_return = MON_4;
106       return PERL_constant_ISIV;
107 #else
108       return PERL_constant_NOTDEF;
109 #endif
110     }
111     break;
112   case '5':
113     if (memEQ(name, "DAY_5", 5)) {
114     /*                   ^      */
115 #ifdef DAY_5
116       *iv_return = DAY_5;
117       return PERL_constant_ISIV;
118 #else
119       return PERL_constant_NOTDEF;
120 #endif
121     }
122     if (memEQ(name, "MON_5", 5)) {
123     /*                   ^      */
124 #ifdef MON_5
125       *iv_return = MON_5;
126       return PERL_constant_ISIV;
127 #else
128       return PERL_constant_NOTDEF;
129 #endif
130     }
131     break;
132   case '6':
133     if (memEQ(name, "DAY_6", 5)) {
134     /*                   ^      */
135 #ifdef DAY_6
136       *iv_return = DAY_6;
137       return PERL_constant_ISIV;
138 #else
139       return PERL_constant_NOTDEF;
140 #endif
141     }
142     if (memEQ(name, "MON_6", 5)) {
143     /*                   ^      */
144 #ifdef MON_6
145       *iv_return = MON_6;
146       return PERL_constant_ISIV;
147 #else
148       return PERL_constant_NOTDEF;
149 #endif
150     }
151     break;
152   case '7':
153     if (memEQ(name, "DAY_7", 5)) {
154     /*                   ^      */
155 #ifdef DAY_7
156       *iv_return = DAY_7;
157       return PERL_constant_ISIV;
158 #else
159       return PERL_constant_NOTDEF;
160 #endif
161     }
162     if (memEQ(name, "MON_7", 5)) {
163     /*                   ^      */
164 #ifdef MON_7
165       *iv_return = MON_7;
166       return PERL_constant_ISIV;
167 #else
168       return PERL_constant_NOTDEF;
169 #endif
170     }
171     break;
172   case '8':
173     if (memEQ(name, "MON_8", 5)) {
174     /*                   ^      */
175 #ifdef MON_8
176       *iv_return = MON_8;
177       return PERL_constant_ISIV;
178 #else
179       return PERL_constant_NOTDEF;
180 #endif
181     }
182     break;
183   case '9':
184     if (memEQ(name, "MON_9", 5)) {
185     /*                   ^      */
186 #ifdef MON_9
187       *iv_return = MON_9;
188       return PERL_constant_ISIV;
189 #else
190       return PERL_constant_NOTDEF;
191 #endif
192     }
193     break;
194   case 'R':
195     if (memEQ(name, "NOSTR", 5)) {
196     /*                   ^      */
197 #ifdef NOSTR
198       *iv_return = NOSTR;
199       return PERL_constant_ISIV;
200 #else
201       return PERL_constant_NOTDEF;
202 #endif
203     }
204     break;
205   case 'T':
206     if (memEQ(name, "D_FMT", 5)) {
207     /*                   ^      */
208 #ifdef D_FMT
209       *iv_return = D_FMT;
210       return PERL_constant_ISIV;
211 #else
212       return PERL_constant_NOTDEF;
213 #endif
214     }
215     if (memEQ(name, "T_FMT", 5)) {
216     /*                   ^      */
217 #ifdef T_FMT
218       *iv_return = T_FMT;
219       return PERL_constant_ISIV;
220 #else
221       return PERL_constant_NOTDEF;
222 #endif
223     }
224     break;
225   }
226   return PERL_constant_NOTFOUND;
227 }
228
229 static int
230 constant_6 (pTHX_ const char *name, IV *iv_return) {
231   /* When generated this function returned values for the list of names given
232      here.  However, subsequent manual editing may have added or removed some.
233      AM_STR MON_10 MON_11 MON_12 NOEXPR PM_STR YESSTR */
234   /* Offset 0 gives the best switch position.  */
235   switch (name[0]) {
236   case 'A':
237     if (memEQ(name, "AM_STR", 6)) {
238     /*               ^           */
239 #ifdef AM_STR
240       *iv_return = AM_STR;
241       return PERL_constant_ISIV;
242 #else
243       return PERL_constant_NOTDEF;
244 #endif
245     }
246     break;
247   case 'M':
248     if (memEQ(name, "MON_10", 6)) {
249     /*               ^           */
250 #ifdef MON_10
251       *iv_return = MON_10;
252       return PERL_constant_ISIV;
253 #else
254       return PERL_constant_NOTDEF;
255 #endif
256     }
257     if (memEQ(name, "MON_11", 6)) {
258     /*               ^           */
259 #ifdef MON_11
260       *iv_return = MON_11;
261       return PERL_constant_ISIV;
262 #else
263       return PERL_constant_NOTDEF;
264 #endif
265     }
266     if (memEQ(name, "MON_12", 6)) {
267     /*               ^           */
268 #ifdef MON_12
269       *iv_return = MON_12;
270       return PERL_constant_ISIV;
271 #else
272       return PERL_constant_NOTDEF;
273 #endif
274     }
275     break;
276   case 'N':
277     if (memEQ(name, "NOEXPR", 6)) {
278     /*               ^           */
279 #ifdef NOEXPR
280       *iv_return = NOEXPR;
281       return PERL_constant_ISIV;
282 #else
283       return PERL_constant_NOTDEF;
284 #endif
285     }
286     break;
287   case 'P':
288     if (memEQ(name, "PM_STR", 6)) {
289     /*               ^           */
290 #ifdef PM_STR
291       *iv_return = PM_STR;
292       return PERL_constant_ISIV;
293 #else
294       return PERL_constant_NOTDEF;
295 #endif
296     }
297     break;
298   case 'Y':
299     if (memEQ(name, "YESSTR", 6)) {
300     /*               ^           */
301 #ifdef YESSTR
302       *iv_return = YESSTR;
303       return PERL_constant_ISIV;
304 #else
305       return PERL_constant_NOTDEF;
306 #endif
307     }
308     break;
309   }
310   return PERL_constant_NOTFOUND;
311 }
312
313 static int
314 constant_7 (pTHX_ const char *name, IV *iv_return) {
315   /* When generated this function returned values for the list of names given
316      here.  However, subsequent manual editing may have added or removed some.
317      ABDAY_1 ABDAY_2 ABDAY_3 ABDAY_4 ABDAY_5 ABDAY_6 ABDAY_7 ABMON_1 ABMON_2
318      ABMON_3 ABMON_4 ABMON_5 ABMON_6 ABMON_7 ABMON_8 ABMON_9 CODESET D_T_FMT
319      THOUSEP YESEXPR */
320   /* Offset 6 gives the best switch position.  */
321   switch (name[6]) {
322   case '1':
323     if (memEQ(name, "ABDAY_1", 7)) {
324     /*                     ^      */
325 #ifdef ABDAY_1
326       *iv_return = ABDAY_1;
327       return PERL_constant_ISIV;
328 #else
329       return PERL_constant_NOTDEF;
330 #endif
331     }
332     if (memEQ(name, "ABMON_1", 7)) {
333     /*                     ^      */
334 #ifdef ABMON_1
335       *iv_return = ABMON_1;
336       return PERL_constant_ISIV;
337 #else
338       return PERL_constant_NOTDEF;
339 #endif
340     }
341     break;
342   case '2':
343     if (memEQ(name, "ABDAY_2", 7)) {
344     /*                     ^      */
345 #ifdef ABDAY_2
346       *iv_return = ABDAY_2;
347       return PERL_constant_ISIV;
348 #else
349       return PERL_constant_NOTDEF;
350 #endif
351     }
352     if (memEQ(name, "ABMON_2", 7)) {
353     /*                     ^      */
354 #ifdef ABMON_2
355       *iv_return = ABMON_2;
356       return PERL_constant_ISIV;
357 #else
358       return PERL_constant_NOTDEF;
359 #endif
360     }
361     break;
362   case '3':
363     if (memEQ(name, "ABDAY_3", 7)) {
364     /*                     ^      */
365 #ifdef ABDAY_3
366       *iv_return = ABDAY_3;
367       return PERL_constant_ISIV;
368 #else
369       return PERL_constant_NOTDEF;
370 #endif
371     }
372     if (memEQ(name, "ABMON_3", 7)) {
373     /*                     ^      */
374 #ifdef ABMON_3
375       *iv_return = ABMON_3;
376       return PERL_constant_ISIV;
377 #else
378       return PERL_constant_NOTDEF;
379 #endif
380     }
381     break;
382   case '4':
383     if (memEQ(name, "ABDAY_4", 7)) {
384     /*                     ^      */
385 #ifdef ABDAY_4
386       *iv_return = ABDAY_4;
387       return PERL_constant_ISIV;
388 #else
389       return PERL_constant_NOTDEF;
390 #endif
391     }
392     if (memEQ(name, "ABMON_4", 7)) {
393     /*                     ^      */
394 #ifdef ABMON_4
395       *iv_return = ABMON_4;
396       return PERL_constant_ISIV;
397 #else
398       return PERL_constant_NOTDEF;
399 #endif
400     }
401     break;
402   case '5':
403     if (memEQ(name, "ABDAY_5", 7)) {
404     /*                     ^      */
405 #ifdef ABDAY_5
406       *iv_return = ABDAY_5;
407       return PERL_constant_ISIV;
408 #else
409       return PERL_constant_NOTDEF;
410 #endif
411     }
412     if (memEQ(name, "ABMON_5", 7)) {
413     /*                     ^      */
414 #ifdef ABMON_5
415       *iv_return = ABMON_5;
416       return PERL_constant_ISIV;
417 #else
418       return PERL_constant_NOTDEF;
419 #endif
420     }
421     break;
422   case '6':
423     if (memEQ(name, "ABDAY_6", 7)) {
424     /*                     ^      */
425 #ifdef ABDAY_6
426       *iv_return = ABDAY_6;
427       return PERL_constant_ISIV;
428 #else
429       return PERL_constant_NOTDEF;
430 #endif
431     }
432     if (memEQ(name, "ABMON_6", 7)) {
433     /*                     ^      */
434 #ifdef ABMON_6
435       *iv_return = ABMON_6;
436       return PERL_constant_ISIV;
437 #else
438       return PERL_constant_NOTDEF;
439 #endif
440     }
441     break;
442   case '7':
443     if (memEQ(name, "ABDAY_7", 7)) {
444     /*                     ^      */
445 #ifdef ABDAY_7
446       *iv_return = ABDAY_7;
447       return PERL_constant_ISIV;
448 #else
449       return PERL_constant_NOTDEF;
450 #endif
451     }
452     if (memEQ(name, "ABMON_7", 7)) {
453     /*                     ^      */
454 #ifdef ABMON_7
455       *iv_return = ABMON_7;
456       return PERL_constant_ISIV;
457 #else
458       return PERL_constant_NOTDEF;
459 #endif
460     }
461     break;
462   case '8':
463     if (memEQ(name, "ABMON_8", 7)) {
464     /*                     ^      */
465 #ifdef ABMON_8
466       *iv_return = ABMON_8;
467       return PERL_constant_ISIV;
468 #else
469       return PERL_constant_NOTDEF;
470 #endif
471     }
472     break;
473   case '9':
474     if (memEQ(name, "ABMON_9", 7)) {
475     /*                     ^      */
476 #ifdef ABMON_9
477       *iv_return = ABMON_9;
478       return PERL_constant_ISIV;
479 #else
480       return PERL_constant_NOTDEF;
481 #endif
482     }
483     break;
484   case 'P':
485     if (memEQ(name, "THOUSEP", 7)) {
486     /*                     ^      */
487 #ifdef THOUSEP
488       *iv_return = THOUSEP;
489       return PERL_constant_ISIV;
490 #else
491       return PERL_constant_NOTDEF;
492 #endif
493     }
494     break;
495   case 'R':
496     if (memEQ(name, "YESEXPR", 7)) {
497     /*                     ^      */
498 #ifdef YESEXPR
499       *iv_return = YESEXPR;
500       return PERL_constant_ISIV;
501 #else
502       return PERL_constant_NOTDEF;
503 #endif
504     }
505     break;
506   case 'T':
507     if (memEQ(name, "CODESET", 7)) {
508     /*                     ^      */
509 #ifdef CODESET
510       *iv_return = CODESET;
511       return PERL_constant_ISIV;
512 #else
513       return PERL_constant_NOTDEF;
514 #endif
515     }
516     if (memEQ(name, "D_T_FMT", 7)) {
517     /*                     ^      */
518 #ifdef D_T_FMT
519       *iv_return = D_T_FMT;
520       return PERL_constant_ISIV;
521 #else
522       return PERL_constant_NOTDEF;
523 #endif
524     }
525     break;
526   }
527   return PERL_constant_NOTFOUND;
528 }
529
530 static int
531 constant_8 (pTHX_ const char *name, IV *iv_return) {
532   /* When generated this function returned values for the list of names given
533      here.  However, subsequent manual editing may have added or removed some.
534      ABMON_10 ABMON_11 ABMON_12 CRNCYSTR */
535   /* Offset 7 gives the best switch position.  */
536   switch (name[7]) {
537   case '0':
538     if (memEQ(name, "ABMON_10", 8)) {
539     /*                      ^      */
540 #ifdef ABMON_10
541       *iv_return = ABMON_10;
542       return PERL_constant_ISIV;
543 #else
544       return PERL_constant_NOTDEF;
545 #endif
546     }
547     break;
548   case '1':
549     if (memEQ(name, "ABMON_11", 8)) {
550     /*                      ^      */
551 #ifdef ABMON_11
552       *iv_return = ABMON_11;
553       return PERL_constant_ISIV;
554 #else
555       return PERL_constant_NOTDEF;
556 #endif
557     }
558     break;
559   case '2':
560     if (memEQ(name, "ABMON_12", 8)) {
561     /*                      ^      */
562 #ifdef ABMON_12
563       *iv_return = ABMON_12;
564       return PERL_constant_ISIV;
565 #else
566       return PERL_constant_NOTDEF;
567 #endif
568     }
569     break;
570   case 'R':
571     if (memEQ(name, "CRNCYSTR", 8)) {
572     /*                      ^      */
573 #ifdef CRNCYSTR
574       *iv_return = CRNCYSTR;
575       return PERL_constant_ISIV;
576 #else
577       return PERL_constant_NOTDEF;
578 #endif
579     }
580     break;
581   }
582   return PERL_constant_NOTFOUND;
583 }
584
585 static int
586 constant_9 (pTHX_ const char *name, IV *iv_return) {
587   /* When generated this function returned values for the list of names given
588      here.  However, subsequent manual editing may have added or removed some.
589      ERA_D_FMT ERA_T_FMT RADIXCHAR */
590   /* Offset 4 gives the best switch position.  */
591   switch (name[4]) {
592   case 'D':
593     if (memEQ(name, "ERA_D_FMT", 9)) {
594     /*                   ^          */
595 #ifdef ERA_D_FMT
596       *iv_return = ERA_D_FMT;
597       return PERL_constant_ISIV;
598 #else
599       return PERL_constant_NOTDEF;
600 #endif
601     }
602     break;
603   case 'T':
604     if (memEQ(name, "ERA_T_FMT", 9)) {
605     /*                   ^          */
606 #ifdef ERA_T_FMT
607       *iv_return = ERA_T_FMT;
608       return PERL_constant_ISIV;
609 #else
610       return PERL_constant_NOTDEF;
611 #endif
612     }
613     break;
614   case 'X':
615     if (memEQ(name, "RADIXCHAR", 9)) {
616     /*                   ^          */
617 #ifdef RADIXCHAR
618       *iv_return = RADIXCHAR;
619       return PERL_constant_ISIV;
620 #else
621       return PERL_constant_NOTDEF;
622 #endif
623     }
624     break;
625   }
626   return PERL_constant_NOTFOUND;
627 }
628
629 static int
630 constant (pTHX_ const char *name, STRLEN len, IV *iv_return) {
631   /* Initially switch on the length of the name.  */
632   /* When generated this function returned values for the list of names given
633      in this section of perl code.  Rather than manually editing these functions
634      to add or remove constants, which would result in this comment and section
635      of code becoming inaccurate, we recommend that you edit this section of
636      code, and use it to regenerate a new set of constant functions which you
637      then use to replace the originals.
638
639      Regenerate these constant functions by feeding this entire source file to
640      perl -x
641
642 #!../../../perl -w
643 use ExtUtils::Constant qw (constant_types C_constant XS_constant);
644
645 my $types = {map {($_, 1)} qw(IV)};
646 my @names = (qw(ABDAY_1 ABDAY_2 ABDAY_3 ABDAY_4 ABDAY_5 ABDAY_6 ABDAY_7 ABMON_1
647                ABMON_10 ABMON_11 ABMON_12 ABMON_2 ABMON_3 ABMON_4 ABMON_5
648                ABMON_6 ABMON_7 ABMON_8 ABMON_9 ALT_DIGITS AM_STR CODESET
649                CRNCYSTR DAY_1 DAY_2 DAY_3 DAY_4 DAY_5 DAY_6 DAY_7 D_FMT D_T_FMT
650                ERA ERA_D_FMT ERA_D_T_FMT ERA_T_FMT MON_1 MON_10 MON_11 MON_12
651                MON_2 MON_3 MON_4 MON_5 MON_6 MON_7 MON_8 MON_9 NOEXPR NOSTR
652                PM_STR RADIXCHAR THOUSEP T_FMT T_FMT_AMPM YESEXPR YESSTR));
653
654 print constant_types(); # macro defs
655 foreach (C_constant ("I18N::Langinfo", 'constant', 'IV', $types, undef, 3, @names) ) {
656     print $_, "\n"; # C constant subs
657 }
658 print "#### XS Section:\n";
659 print XS_constant ("I18N::Langinfo", $types);
660 __END__
661    */
662
663   switch (len) {
664   case 3:
665     if (memEQ(name, "ERA", 3)) {
666 #ifdef ERA
667       *iv_return = ERA;
668       return PERL_constant_ISIV;
669 #else
670       return PERL_constant_NOTDEF;
671 #endif
672     }
673     break;
674   case 5:
675     return constant_5 (aTHX_ name, iv_return);
676     break;
677   case 6:
678     return constant_6 (aTHX_ name, iv_return);
679     break;
680   case 7:
681     return constant_7 (aTHX_ name, iv_return);
682     break;
683   case 8:
684     return constant_8 (aTHX_ name, iv_return);
685     break;
686   case 9:
687     return constant_9 (aTHX_ name, iv_return);
688     break;
689   case 10:
690     /* Names all of length 10.  */
691     /* ALT_DIGITS T_FMT_AMPM */
692     /* Offset 7 gives the best switch position.  */
693     switch (name[7]) {
694     case 'I':
695       if (memEQ(name, "ALT_DIGITS", 10)) {
696       /*                      ^         */
697 #ifdef ALT_DIGITS
698         *iv_return = ALT_DIGITS;
699         return PERL_constant_ISIV;
700 #else
701         return PERL_constant_NOTDEF;
702 #endif
703       }
704       break;
705     case 'M':
706       if (memEQ(name, "T_FMT_AMPM", 10)) {
707       /*                      ^         */
708 #ifdef T_FMT_AMPM
709         *iv_return = T_FMT_AMPM;
710         return PERL_constant_ISIV;
711 #else
712         return PERL_constant_NOTDEF;
713 #endif
714       }
715       break;
716     }
717     break;
718   case 11:
719     if (memEQ(name, "ERA_D_T_FMT", 11)) {
720 #ifdef ERA_D_T_FMT
721       *iv_return = ERA_D_T_FMT;
722       return PERL_constant_ISIV;
723 #else
724       return PERL_constant_NOTDEF;
725 #endif
726     }
727     break;
728   }
729   return PERL_constant_NOTFOUND;
730 }
731
732 MODULE = I18N::Langinfo PACKAGE = I18N::Langinfo
733
734 PROTOTYPES: ENABLE
735
736 void
737 constant(sv)
738     PREINIT:
739 #ifdef dXSTARG
740         dXSTARG; /* Faster if we have it.  */
741 #else
742         dTARGET;
743 #endif
744         STRLEN          len;
745         int             type;
746         IV              iv;
747         /* NV           nv;     Uncomment this if you need to return NVs */
748         /* const char   *pv;    Uncomment this if you need to return PVs */
749     INPUT:
750         SV *            sv;
751         const char *    s = SvPV(sv, len);
752     PPCODE:
753         /* Change this to constant(aTHX_ s, len, &iv, &nv);
754            if you need to return both NVs and IVs */
755         type = constant(aTHX_ s, len, &iv);
756       /* Return 1 or 2 items. First is error message, or undef if no error.
757            Second, if present, is found value */
758         switch (type) {
759         case PERL_constant_NOTFOUND:
760           sv = sv_2mortal(newSVpvf("%s is not a valid I18N::Langinfo macro", s));
761           PUSHs(sv);
762           break;
763         case PERL_constant_NOTDEF:
764           sv = sv_2mortal(newSVpvf(
765             "Your vendor has not defined I18N::Langinfo macro %s, used", s));
766           PUSHs(sv);
767           break;
768         case PERL_constant_ISIV:
769           EXTEND(SP, 1);
770           PUSHs(&PL_sv_undef);
771           PUSHi(iv);
772           break;
773         /* Uncomment this if you need to return NOs
774         case PERL_constant_ISNO:
775           EXTEND(SP, 1);
776           PUSHs(&PL_sv_undef);
777           PUSHs(&PL_sv_no);
778           break; */
779         /* Uncomment this if you need to return NVs
780         case PERL_constant_ISNV:
781           EXTEND(SP, 1);
782           PUSHs(&PL_sv_undef);
783           PUSHn(nv);
784           break; */
785         /* Uncomment this if you need to return PVs
786         case PERL_constant_ISPV:
787           EXTEND(SP, 1);
788           PUSHs(&PL_sv_undef);
789           PUSHp(pv, strlen(pv));
790           break; */
791         /* Uncomment this if you need to return PVNs
792         case PERL_constant_ISPVN:
793           EXTEND(SP, 1);
794           PUSHs(&PL_sv_undef);
795           PUSHp(pv, iv);
796           break; */
797         /* Uncomment this if you need to return SVs
798         case PERL_constant_ISSV:
799           EXTEND(SP, 1);
800           PUSHs(&PL_sv_undef);
801           PUSHs(sv);
802           break; */
803         /* Uncomment this if you need to return UNDEFs
804         case PERL_constant_ISUNDEF:
805           break; */
806         /* Uncomment this if you need to return UVs
807         case PERL_constant_ISUV:
808           EXTEND(SP, 1);
809           PUSHs(&PL_sv_undef);
810           PUSHu((UV)iv);
811           break; */
812         /* Uncomment this if you need to return YESs
813         case PERL_constant_ISYES:
814           EXTEND(SP, 1);
815           PUSHs(&PL_sv_undef);
816           PUSHs(&PL_sv_yes);
817           break; */
818         default:
819           sv = sv_2mortal(newSVpvf(
820             "Unexpected return type %d while processing I18N::Langinfo macro %s, used",
821                type, s));
822           PUSHs(sv);
823         }
824
825 SV*
826 langinfo(code)
827         int     code
828   CODE:
829 #ifdef HAS_NL_LANGINFO
830         char *s = nl_langinfo(code);
831         RETVAL = newSVpvn(s, strlen(s));
832 #else
833         croak("nl_langinfo() not implemented on this architecture");
834 #endif
835   OUTPUT:
836         RETVAL