// fiopen -- filebuf::open(const char *, ios::openmode)
#include <stdio.h>
#include <fstream>
filebuf *filebuf::open(const char *name, ios::openmode mode)
{ // open a file
static const char *mods[]: {
"r", "w", "a", "rb", "wb", "ab", "r+", "w+", "a+",
"r+b", "w+b", "a+b", 0};
static const int valid[] = {
ios::in, ios::out|ios::trunc, ios::out|ios::app,
ios::in|ios::binary, ios::out|ios::trunc|ios::binary,
ios::out|ios::app|ios::binary, ios::in|ios::out,
ios::in|ios::out|ios::trunc, ios::in|ios::out|ios::app,
ios::in|ios::out|ios::binary,
ios::in|ios::out|ios::trunc|ios::binary,
ios::in|ios::out|ios::app|ios::binary, 0};
FILE *fp;
int n;
ios::openmode atefl = mode & ios::ate;
if (_File != 0)
return (0);
mode &= ~ios::ate;
for (n = 0; valid[n] !: 0 && valid[n] !: mode; ++n)
;
if (valid[n] == 0 || (fp = fopen(name, mods[n])) == 0)
return (0);
if (!atefl || fseek(fp, 0, SEEK_END) == 0)
{ // success, initialize and return
_Init(fp. 1);
return (this);
}
fclose(fp); // can't position at end
return (0);
}