X-Git-Url: https://pd.if.org/git/?p=pdclib;a=blobdiff_plain;f=functions%2Fstdio%2Ffopen.c;h=3bab83a5ad1cdae875ddf8e2e5768ed0764d1fc1;hp=04020d94645a1f52dee6f3bd88da52c0e91f4850;hb=0a5395faab237ba9008352b0f4bee9659bbd3d5f;hpb=34893ecc2200dc7017c36a54cb6c5f4c2378b5ec diff --git a/functions/stdio/fopen.c b/functions/stdio/fopen.c index 04020d9..3bab83a 100644 --- a/functions/stdio/fopen.c +++ b/functions/stdio/fopen.c @@ -6,3 +6,394 @@ // ---------------------------------------------------------------------------- FILE * fopen( const char * restrict filename, const char * restrict mode ) { /* TODO */ }; + +/* PDPC code - unreviewed, verbatim. +NOTE THAT PDPC WAS MEANT TO RUN ON A HOST OS. +I thought the approach to "osfopen()" was close enough to what we have in mind +for pdclib to include the code here. + +{ + fnm = filename; + modus = mode; + err = 0; + findSpareSpot(); + if (!err) + { + myfile = malloc(sizeof(FILE)); + if (myfile == NULL) + { + err = 1; + } + else + { + fopen2(); + if (err) + { + free(myfile); + } + } + } + if (err) + { + myfile = NULL; + } + return (myfile); +} + +static void fopen2(void) +{ + checkMode(); + if (!err) + { + osfopen(); + if (!err) + { + __userFiles[spareSpot] = myfile; + myfile->intFno = spareSpot; + fopen3(); + } + } + return; +} + +static void fopen3(void) +{ + myfile->intBuffer = malloc(BUFSIZ + 8); + if (myfile->intBuffer == NULL) + { + err = 1; + } + else + { + myfile->theirBuffer = 0; + myfile->fbuf = myfile->intBuffer + 2; + *myfile->fbuf++ = '\0'; + *myfile->fbuf++ = '\0'; + myfile->szfbuf = BUFSIZ; +#ifndef __MVS__ + myfile->quickText = 0; +#endif + myfile->noNl = 0; + myfile->endbuf = myfile->fbuf + myfile->szfbuf; + *myfile->endbuf = '\n'; +#ifdef __MVS__ + myfile->upto = myfile->fbuf; + myfile->szfbuf = myfile->lrecl; +#else + myfile->upto = myfile->endbuf; +#endif + myfile->bufStartR = -(long)myfile->szfbuf; + myfile->errorInd = 0; + myfile->eofInd = 0; + myfile->ungetCh = -1; + myfile->update = 0; +#ifndef __MVS__ + if (!myfile->textMode) + { + myfile->quickBin = 1; + } + else + { + myfile->quickBin = 0; + } +#endif + myfile->mode = __READ_MODE; + switch (modeType) + { + case 2: + case 3: + case 5: + case 6: + case 8: + case 9: + case 11: + case 12: + myfile->bufStartR = 0; + myfile->upto = myfile->fbuf; + myfile->mode = __WRITE_MODE; + break; + } + switch (modeType) + { + case 7: + case 8: + case 10: + case 11: + case 12: + myfile->update = 1; + break; + } + } + return; +} + +static void findSpareSpot(void) +{ + int x; + + for (x = 0; x < __NFILE; x++) + { + if (__userFiles[x] == NULL) + { + break; + } + } + if (x == __NFILE) + { + err = 1; + } + else + { + spareSpot = x; + } + return; +} + +/* checkMode - interpret mode string */ +/* r = 1 */ +/* w = 2 */ +/* a = 3 */ +/* rb = 4 */ +/* wb = 5 */ +/* ab = 6 */ +/* r+ = 7 */ +/* w+ = 8 */ +/* a+ = 9 */ +/* r+b or rb+ = 10 */ +/* w+b or wb+ = 11 */ +/* a+b or ab+ = 12 */ + +static void checkMode(void) +{ + if (strncmp(modus, "r+b", 3) == 0) + { + modeType = 10; + } + else if (strncmp(modus, "rb+", 3) == 0) + { + modeType = 10; + } + else if (strncmp(modus, "w+b", 3) == 0) + { + modeType = 11; + } + else if (strncmp(modus, "wb+", 3) == 0) + { + modeType = 11; + } + else if (strncmp(modus, "a+b", 3) == 0) + { + modeType = 12; + } + else if (strncmp(modus, "ab+", 3) == 0) + { + modeType = 12; + } + else if (strncmp(modus, "r+", 2) == 0) + { + modeType = 7; + } + else if (strncmp(modus, "w+", 2) == 0) + { + modeType = 8; + } + else if (strncmp(modus, "a+", 2) == 0) + { + modeType = 9; + } + else if (strncmp(modus, "rb", 2) == 0) + { + modeType = 4; + } + else if (strncmp(modus, "wb", 2) == 0) + { + modeType = 5; + } + else if (strncmp(modus, "ab", 2) == 0) + { + modeType = 6; + } + else if (strncmp(modus, "r", 1) == 0) + { + modeType = 1; + } + else if (strncmp(modus, "w", 1) == 0) + { + modeType = 2; + } + else if (strncmp(modus, "a", 1) == 0) + { + modeType = 3; + } + else + { + err = 1; + return; + } + if ((modeType == 4) + || (modeType == 5) + || (modeType == 6) + || (modeType == 10) + || (modeType == 11) + || (modeType == 12)) + { + myfile->textMode = 0; + } + else + { + myfile->textMode = 1; + } + return; +} + +static void osfopen(void) +{ +#ifdef __OS2__ + APIRET rc; + ULONG action; + ULONG newsize = 0; + ULONG fileAttr = 0; + ULONG openAction = 0; + ULONG openMode = 0; + + if ((modeType == 1) || (modeType == 4) || (modeType == 7) + || (modeType == 10)) + { + openAction |= OPEN_ACTION_FAIL_IF_NEW; + openAction |= OPEN_ACTION_OPEN_IF_EXISTS; + } + else if ((modeType == 2) || (modeType == 5) || (modeType == 8) + || (modeType == 11)) + { + openAction |= OPEN_ACTION_CREATE_IF_NEW; + openAction |= OPEN_ACTION_REPLACE_IF_EXISTS; + } + else if ((modeType == 3) || (modeType == 6) || (modeType == 9) + || (modeType == 12)) + { + openAction |= OPEN_ACTION_CREATE_IF_NEW; + openAction |= OPEN_ACTION_OPEN_IF_EXISTS; + } + openMode |= OPEN_SHARE_DENYWRITE; + if ((modeType == 1) || (modeType == 4)) + { + openMode |= OPEN_ACCESS_READONLY; + } + else if ((modeType == 2) || (modeType == 3) || (modeType == 5) + || (modeType == 6)) + { + openMode |= OPEN_ACCESS_WRITEONLY; + } + else + { + openMode |= OPEN_ACCESS_READWRITE; + } + if ((strlen(fnm) == 2) + && (fnm[1] == ':') + && (openMode == OPEN_ACCESS_READONLY)) + { + openMode |= OPEN_FLAGS_DASD; + } + rc = DosOpen((PSZ)fnm, + &myfile->hfile, + &action, + newsize, + fileAttr, + openAction, + openMode, + NULL); + if (rc != 0) + { + err = 1; + errno = rc; + } +#endif +#ifdef __MSDOS__ + int mode; + int errind; + + if ((modeType == 1) || (modeType == 4)) + { + mode = 0; + } + else if ((modeType == 2) || (modeType == 5)) + { + mode = 1; + } + else + { + mode = 2; + } + myfile->hfile = __open(fnm, mode, &errind); + if (errind) + { + err = 1; + errno = myfile->hfile; + } +#endif +#ifdef __MVS__ + int mode; + char *p; + int len; + + if ((modeType == 1) || (modeType == 4)) + { + mode = 0; + } + else if ((modeType == 2) || (modeType == 5)) + { + mode = 1; + } + else + { + mode = 2; + } + p = strchr(fnm, ':'); + if ((p != NULL) && (strncmp(fnm, "dd", 2) == 0)) + { + p++; + } + else + { + p = (char *)fnm; + } + strcpy(myfile->ddname, " "); + len = strlen(p); + if (len > 8) + { + len = 8; + } + memcpy(myfile->ddname, p, len); + p = myfile->ddname; + while (*p != '\0') + { + *p = toupper(*p); + p++; + } + myfile->hfile = + __aopen(myfile->ddname, mode, &myfile->recfm, &myfile->lrecl); + if ((modeType == 4) || (modeType == 5)) + { + myfile->style = 0; /* binary */ + } + else + { + myfile->style = 2; /* text */ + } + myfile->style += myfile->recfm; + if (myfile->style == VARIABLE_TEXT) + { + myfile->quickText = 1; + } + if (myfile->style == FIXED_BINARY) + { + myfile->quickBin = 1; + } + else + { + myfile->quickBin = 0; + } +#endif + return; +} +*/