1 /* VMS::Stdio - VMS extensions to stdio routines
4 * Author: Charles Bailey bailey@genetics.upenn.edu
19 if (strnNE(name, "O_", 2)) return FALSE;
21 if (strEQ(name, "O_APPEND"))
23 { *pval = O_APPEND; return TRUE; }
27 if (strEQ(name, "O_CREAT"))
29 { *pval = O_CREAT; return TRUE; }
33 if (strEQ(name, "O_EXCL"))
35 { *pval = O_EXCL; return TRUE; }
39 if (strEQ(name, "O_NDELAY"))
41 { *pval = O_NDELAY; return TRUE; }
45 if (strEQ(name, "O_NOWAIT"))
47 { *pval = O_NOWAIT; return TRUE; }
51 if (strEQ(name, "O_RDONLY"))
53 { *pval = O_RDONLY; return TRUE; }
57 if (strEQ(name, "O_RDWR"))
59 { *pval = O_RDWR; return TRUE; }
63 if (strEQ(name, "O_TRUNC"))
65 { *pval = O_TRUNC; return TRUE; }
69 if (strEQ(name, "O_WRONLY"))
71 { *pval = O_WRONLY; return TRUE; }
81 newFH(FILE *fp, char type) {
83 GV **stashp, *gv = (GV *)NEWSV(0,0);
87 /* Find stash for VMS::Stdio. We don't do this once at boot
88 * to allow for possibility of threaded Perl with per-thread
89 * symbol tables. This code (through io = ...) is really
90 * equivalent to gv_fetchpv("VMS::Stdio::__FH__",TRUE,SVt_PVIO),
91 * with a little less overhead, and good exercise for me. :-) */
92 stashp = (GV **)hv_fetch(defstash,"VMS::",5,TRUE);
93 if (!stashp || *stashp == (GV *)&sv_undef) return Nullsv;
94 if (!(stash = GvHV(*stashp))) stash = GvHV(*stashp) = newHV();
95 stashp = (GV **)hv_fetch(GvHV(*stashp),"Stdio::",7,TRUE);
96 if (!stashp || *stashp == (GV *)&sv_undef) return Nullsv;
97 if (!(stash = GvHV(*stashp))) stash = GvHV(*stashp) = newHV();
99 /* Set up GV to point to IO, and then take reference */
100 gv_init(gv,stash,"__FH__",6,0);
101 io = GvIOp(gv) = newIO();
103 if (type != '<') IoOFP(io) = fp;
105 rv = newRV((SV *)gv);
107 return sv_bless(rv,stash);
110 MODULE = VMS::Stdio PACKAGE = VMS::Stdio
118 if (constant(name, &i))
119 ST(0) = sv_2mortal(newSViv(i));
129 if (SvOK(sv)) fp = IoIFP(sv_2io(sv));
130 ST(0) = fflush(fp) ? &sv_undef : &sv_yes;
138 ST(0) = sv_newmortal();
139 if (fgetname(fp,fname) != NULL) sv_setpv(ST(0),fname);
146 ST(0) = rewind(fp) ? &sv_undef : &sv_yes;
153 ST(0) = remove(name) ? &sv_undef : &sv_yes;
160 ST(0) = fsync(fileno(fp)) ? &sv_undef : &sv_yes;
166 char fname[L_tmpnam];
167 ST(0) = sv_newmortal();
168 if (tmpnam(fname) != NULL) sv_setpv(ST(0),fname);
175 char *args[8],mode[3] = {'r','\0','\0'}, type = '<';
176 register int i, myargc;
179 if (!spec || !*spec) {
180 SETERRNO(EINVAL,LIB$_INVARG);
183 if (items > 9) croak("too many args");
185 /* First, set up name and mode args from perl's string */
191 if (*(spec+1) == '>') *mode = 'a', spec += 2;
192 else *mode = 'w', spec++;
194 else if (*spec == '<') spec++;
196 for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+1),na);
197 /* This hack brought to you by C's opaque arglist management */
200 fp = fopen(spec,mode);
203 fp = fopen(spec,mode,args[0]);
206 fp = fopen(spec,mode,args[0],args[1]);
209 fp = fopen(spec,mode,args[0],args[1],args[2]);
212 fp = fopen(spec,mode,args[0],args[1],args[2],args[3]);
215 fp = fopen(spec,mode,args[0],args[1],args[2],args[3],args[4]);
218 fp = fopen(spec,mode,args[0],args[1],args[2],args[3],args[4],args[5]);
221 fp = fopen(spec,mode,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
224 fp = fopen(spec,mode,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
228 SV *fh = newFH(fp,(mode[1] ? '+' : (mode[0] == 'r' ? '<' : (mode[0] == 'a' ? 'a' : '>'))));
229 ST(0) = (fh ? sv_2mortal(fh) : &sv_undef);
231 else { ST(0) = &sv_undef; }
234 vmssysopen(spec,mode,perm,...)
244 if (!spec || !*spec) {
245 SETERRNO(EINVAL,LIB$_INVARG);
248 if (items > 11) croak("too many args");
250 for (i = 0; i < myargc; i++) args[i] = SvPV(ST(i+3),na);
251 /* More fun with C calls; can't combine with above because
252 args 2,3 of different types in fopen() and open() */
255 fd = open(spec,mode,perm);
258 fd = open(spec,mode,perm,args[0]);
261 fd = open(spec,mode,perm,args[0],args[1]);
264 fd = open(spec,mode,perm,args[0],args[1],args[2]);
267 fd = open(spec,mode,perm,args[0],args[1],args[2],args[3]);
270 fd = open(spec,mode,perm,args[0],args[1],args[2],args[3],args[4]);
273 fd = open(spec,mode,perm,args[0],args[1],args[2],args[3],args[4],args[5]);
276 fd = open(spec,mode,perm,args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
279 fd = open(spec,mode,perm,args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
284 ((fp = fdopen(fd, &("r\000w\000r+"[2*i]))) != Nullfp)) {
285 SV *fh = newFH(fp,"<>++"[i]);
286 ST(0) = (fh ? sv_2mortal(fh) : &sv_undef);
288 else { ST(0) = &sv_undef; }
295 ST(0) = fwait(fp) ? &sv_undef : &sv_yes;