]> pd.if.org Git - pdclib/blob - functions/stdio/fopen.c
Merged PDPCLIB and Therx code.
[pdclib] / functions / stdio / fopen.c
1 // ----------------------------------------------------------------------------
2 // $Id$
3 // ----------------------------------------------------------------------------
4 // Public Domain C Library - http://pdclib.sourceforge.net
5 // This code is Public Domain. Use, modify, and redistribute at will.
6 // ----------------------------------------------------------------------------
7
8 FILE * fopen( const char * restrict filename, const char * restrict mode ) { /* TODO */ };
9
10 /* PDPC code - unreviewed, verbatim.
11 NOTE THAT PDPC WAS MEANT TO RUN ON A HOST OS.
12 I thought the approach to "osfopen()" was close enough to what we have in mind
13 for pdclib to include the code here.
14
15 {
16     fnm = filename;
17     modus = mode;
18     err = 0;
19     findSpareSpot();
20     if (!err)
21     {
22         myfile = malloc(sizeof(FILE));
23         if (myfile == NULL)
24         {
25             err = 1;
26         }
27         else
28         {
29             fopen2();
30             if (err)
31             {
32                 free(myfile);
33             }
34         }
35     }
36     if (err)
37     {
38         myfile = NULL;
39     }
40     return (myfile);
41 }
42
43 static void fopen2(void)
44 {
45     checkMode();
46     if (!err)
47     {
48         osfopen();
49         if (!err)
50         {
51             __userFiles[spareSpot] = myfile;
52             myfile->intFno = spareSpot;
53             fopen3();
54         }
55     }
56     return;
57 }
58
59 static void fopen3(void)
60 {
61     myfile->intBuffer = malloc(BUFSIZ + 8);
62     if (myfile->intBuffer == NULL)
63     {
64         err = 1;
65     }
66     else
67     {
68         myfile->theirBuffer = 0;
69         myfile->fbuf = myfile->intBuffer + 2;
70         *myfile->fbuf++ = '\0';
71         *myfile->fbuf++ = '\0';
72         myfile->szfbuf = BUFSIZ;
73 #ifndef __MVS__
74         myfile->quickText = 0;
75 #endif
76         myfile->noNl = 0;
77         myfile->endbuf = myfile->fbuf + myfile->szfbuf;
78         *myfile->endbuf = '\n';
79 #ifdef __MVS__
80         myfile->upto = myfile->fbuf;
81         myfile->szfbuf = myfile->lrecl;
82 #else
83         myfile->upto = myfile->endbuf;
84 #endif
85         myfile->bufStartR = -(long)myfile->szfbuf;
86         myfile->errorInd = 0;
87         myfile->eofInd = 0;
88         myfile->ungetCh = -1;
89         myfile->update = 0;
90 #ifndef __MVS__
91         if (!myfile->textMode)
92         {
93             myfile->quickBin = 1;
94         }
95         else
96         {
97             myfile->quickBin = 0;
98         }
99 #endif
100         myfile->mode = __READ_MODE;
101         switch (modeType)
102         {
103             case 2:
104             case 3:
105             case 5:
106             case 6:
107             case 8:
108             case 9:
109             case 11:
110             case 12:
111                 myfile->bufStartR = 0;
112                 myfile->upto = myfile->fbuf;
113                 myfile->mode = __WRITE_MODE;
114                 break;
115         }
116         switch (modeType)
117         {
118             case 7:
119             case 8:
120             case 10:
121             case 11:
122             case 12:
123                 myfile->update = 1;
124                 break;
125         }
126     }
127     return;
128 }
129
130 static void findSpareSpot(void)
131 {
132     int x;
133
134     for (x = 0; x < __NFILE; x++)
135     {
136         if (__userFiles[x] == NULL)
137         {
138             break;
139         }
140     }
141     if (x == __NFILE)
142     {
143         err = 1;
144     }
145     else
146     {
147         spareSpot = x;
148     }
149     return;
150 }
151
152 /* checkMode - interpret mode string */
153 /* r = 1 */
154 /* w = 2 */
155 /* a = 3 */
156 /* rb = 4 */
157 /* wb = 5 */
158 /* ab = 6 */
159 /* r+ = 7 */
160 /* w+ = 8 */
161 /* a+ = 9 */
162 /* r+b or rb+ = 10 */
163 /* w+b or wb+ = 11 */
164 /* a+b or ab+ = 12 */
165
166 static void checkMode(void)
167 {
168     if (strncmp(modus, "r+b", 3) == 0)
169     {
170         modeType = 10;
171     }
172     else if (strncmp(modus, "rb+", 3) == 0)
173     {
174         modeType = 10;
175     }
176     else if (strncmp(modus, "w+b", 3) == 0)
177     {
178         modeType = 11;
179     }
180     else if (strncmp(modus, "wb+", 3) == 0)
181     {
182         modeType = 11;
183     }
184     else if (strncmp(modus, "a+b", 3) == 0)
185     {
186         modeType = 12;
187     }
188     else if (strncmp(modus, "ab+", 3) == 0)
189     {
190         modeType = 12;
191     }
192     else if (strncmp(modus, "r+", 2) == 0)
193     {
194         modeType = 7;
195     }
196     else if (strncmp(modus, "w+", 2) == 0)
197     {
198         modeType = 8;
199     }
200     else if (strncmp(modus, "a+", 2) == 0)
201     {
202         modeType = 9;
203     }
204     else if (strncmp(modus, "rb", 2) == 0)
205     {
206         modeType = 4;
207     }
208     else if (strncmp(modus, "wb", 2) == 0)
209     {
210         modeType = 5;
211     }
212     else if (strncmp(modus, "ab", 2) == 0)
213     {
214         modeType = 6;
215     }
216     else if (strncmp(modus, "r", 1) == 0)
217     {
218         modeType = 1;
219     }
220     else if (strncmp(modus, "w", 1) == 0)
221     {
222         modeType = 2;
223     }
224     else if (strncmp(modus, "a", 1) == 0)
225     {
226         modeType = 3;
227     }
228     else
229     {
230         err = 1;
231         return;
232     }
233     if ((modeType == 4)
234         || (modeType == 5)
235         || (modeType == 6)
236         || (modeType == 10)
237         || (modeType == 11)
238         || (modeType == 12))
239     {
240         myfile->textMode = 0;
241     }
242     else
243     {
244         myfile->textMode = 1;
245     }
246     return;
247 }
248
249 static void osfopen(void)
250 {
251 #ifdef __OS2__
252     APIRET rc;
253     ULONG  action;
254     ULONG  newsize = 0;
255     ULONG  fileAttr = 0;
256     ULONG  openAction = 0;
257     ULONG  openMode = 0;
258
259     if ((modeType == 1) || (modeType == 4) || (modeType == 7)
260         || (modeType == 10))
261     {
262         openAction |= OPEN_ACTION_FAIL_IF_NEW;
263         openAction |= OPEN_ACTION_OPEN_IF_EXISTS;
264     }
265     else if ((modeType == 2) || (modeType == 5) || (modeType == 8)
266              || (modeType == 11))
267     {
268         openAction |= OPEN_ACTION_CREATE_IF_NEW;
269         openAction |= OPEN_ACTION_REPLACE_IF_EXISTS;
270     }
271     else if ((modeType == 3) || (modeType == 6) || (modeType == 9)
272              || (modeType == 12))
273     {
274         openAction |= OPEN_ACTION_CREATE_IF_NEW;
275         openAction |= OPEN_ACTION_OPEN_IF_EXISTS;
276     }
277     openMode |= OPEN_SHARE_DENYWRITE;
278     if ((modeType == 1) || (modeType == 4))
279     {
280         openMode |= OPEN_ACCESS_READONLY;
281     }
282     else if ((modeType == 2) || (modeType == 3) || (modeType == 5)
283              || (modeType == 6))
284     {
285         openMode |= OPEN_ACCESS_WRITEONLY;
286     }
287     else
288     {
289         openMode |= OPEN_ACCESS_READWRITE;
290     }
291     if ((strlen(fnm) == 2)
292         && (fnm[1] == ':')
293         && (openMode == OPEN_ACCESS_READONLY))
294     {
295         openMode |= OPEN_FLAGS_DASD;
296     }
297     rc = DosOpen((PSZ)fnm,
298                  &myfile->hfile,
299                  &action,
300                  newsize,
301                  fileAttr,
302                  openAction,
303                  openMode,
304                  NULL);
305     if (rc != 0)
306     {
307         err = 1;
308         errno = rc;
309     }
310 #endif
311 #ifdef __MSDOS__
312     int mode;
313     int errind;
314
315     if ((modeType == 1) || (modeType == 4))
316     {
317         mode = 0;
318     }
319     else if ((modeType == 2) || (modeType == 5))
320     {
321         mode = 1;
322     }
323     else
324     {
325         mode = 2;
326     }
327     myfile->hfile = __open(fnm, mode, &errind);
328     if (errind)
329     {
330         err = 1;
331         errno = myfile->hfile;
332     }
333 #endif
334 #ifdef __MVS__
335     int mode;
336     char *p;
337     int len;
338
339     if ((modeType == 1) || (modeType == 4))
340     {
341         mode = 0;
342     }
343     else if ((modeType == 2) || (modeType == 5))
344     {
345         mode = 1;
346     }
347     else
348     {
349         mode = 2;
350     }
351     p = strchr(fnm, ':');
352     if ((p != NULL) && (strncmp(fnm, "dd", 2) == 0))
353     {
354         p++;
355     }
356     else
357     {
358         p = (char *)fnm;
359     }
360     strcpy(myfile->ddname, "        ");
361     len = strlen(p);
362     if (len > 8)
363     {
364         len = 8;
365     }
366     memcpy(myfile->ddname, p, len);
367     p = myfile->ddname;
368     while (*p != '\0')
369     {
370         *p = toupper(*p);
371         p++;
372     }
373     myfile->hfile = 
374         __aopen(myfile->ddname, mode, &myfile->recfm, &myfile->lrecl);
375     if ((modeType == 4) || (modeType == 5))
376     {
377         myfile->style = 0; /* binary */
378     }
379     else
380     {
381         myfile->style = 2; /* text */
382     }
383     myfile->style += myfile->recfm;
384     if (myfile->style == VARIABLE_TEXT)
385     {
386         myfile->quickText = 1;
387     }
388     if (myfile->style == FIXED_BINARY)
389     {
390         myfile->quickBin = 1;
391     }
392     else
393     {
394         myfile->quickBin = 0;
395     }
396 #endif
397     return;
398 }
399 */