1 /* missing functions copied from perlio.c */
2
3 #include "perlioutil.h"
4
5 #if defined(WIN32)
6
7 PerlIO_funcs *
PerlIO_find_layer(pTHX_ const char * name,STRLEN len,int load)8 PerlIO_find_layer(pTHX_ const char *name, STRLEN len, int load)
9 {
10 dVAR;
11 IV i;
12 if ((SSize_t) len <= 0)
13 len = strlen(name);
14 for (i = 0; i < PL_known_layers->cur; i++) {
15 PerlIO_funcs * const f = PL_known_layers->array[i].funcs;
16 if (memEQ(f->name, name, len) && f->name[len] == 0) {
17 PerlIO_debug("%.*s => %p\n", (int) len, name, (void*)f);
18 return f;
19 }
20 }
21 if (load && PL_subname && PL_def_layerlist
22 && PL_def_layerlist->cur >= 2) {
23 if (PL_in_load_module) {
24 Perl_croak(aTHX_ "Recursive call to Perl_load_module in PerlIO_find_layer");
25 return NULL;
26 } else {
27 SV * const pkgsv = newSVpvs("PerlIO");
28 SV * const layer = newSVpvn(name, len);
29 CV * const cv = get_cv("PerlIO::Layer::NoWarnings", FALSE);
30 ENTER;
31 SAVEINT(PL_in_load_module);
32 if (cv) {
33 SAVEGENERICSV(PL_warnhook);
34 PL_warnhook = (SV *) (SvREFCNT_inc_simple_NN(cv));
35 }
36 PL_in_load_module++;
37 /*
38 * The two SVs are magically freed by load_module
39 */
40 Perl_load_module(aTHX_ 0, pkgsv, NULL, layer, NULL);
41 PL_in_load_module--;
42 LEAVE;
43 return PerlIO_find_layer(aTHX_ name, len, 0);
44 }
45 }
46 PerlIO_debug("Cannot find %.*s\n", (int) len, name);
47 return NULL;
48 }
49
50
51 int
PerlIOUnix_oflags(const char * mode)52 PerlIOUnix_oflags(const char *mode)
53 {
54 int oflags = -1;
55 if (*mode == IoTYPE_IMPLICIT || *mode == IoTYPE_NUMERIC)
56 mode++;
57 switch (*mode) {
58 case 'r':
59 oflags = O_RDONLY;
60 if (*++mode == '+') {
61 oflags = O_RDWR;
62 mode++;
63 }
64 break;
65
66 case 'w':
67 oflags = O_CREAT | O_TRUNC;
68 if (*++mode == '+') {
69 oflags |= O_RDWR;
70 mode++;
71 }
72 else
73 oflags |= O_WRONLY;
74 break;
75
76 case 'a':
77 oflags = O_CREAT | O_APPEND;
78 if (*++mode == '+') {
79 oflags |= O_RDWR;
80 mode++;
81 }
82 else
83 oflags |= O_WRONLY;
84 break;
85 }
86 if (*mode == 'b') {
87 oflags |= O_BINARY;
88 oflags &= ~O_TEXT;
89 mode++;
90 }
91 else if (*mode == 't') {
92 oflags |= O_TEXT;
93 oflags &= ~O_BINARY;
94 mode++;
95 }
96 /*
97 * Always open in binary mode
98 */
99 oflags |= O_BINARY;
100 if (*mode || oflags == -1) {
101 SETERRNO(EINVAL, LIB_INVARG);
102 oflags = -1;
103 }
104 return oflags;
105 }
106
107
108
109 #endif /* WIN32 */
110