]> pd.if.org Git - pdclib/blobdiff - functions/stdio/fopen.c
Merged PDPCLIB and Therx code.
[pdclib] / functions / stdio / fopen.c
index 04020d94645a1f52dee6f3bd88da52c0e91f4850..3bab83a5ad1cdae875ddf8e2e5768ed0764d1fc1 100644 (file)
@@ -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;
+}
+*/