+
+/* 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;
+}
+*/