source: trunk/dll/fsopen.c@ 1036

Last change on this file since 1036 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.2 KB
Line 
1
2/***********************************************************************
3
4 $Id: fsopen.c 907 2008-01-06 07:26:17Z stevenhl $
5
6 _fsopen for IBMC
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2007 Steven H. Levine
10
11 15 Oct 02 SHL Baseline
12 05 Jun 07 SHL Update for OpenWatcom
13
14***********************************************************************/
15
16#if defined(__IBMC__)
17
18#include <stdlib.h>
19#include <stdio.h>
20#include <string.h>
21#include <io.h>
22#include <fcntl.h>
23#include <share.h>
24
25#define INCL_WIN
26#define INCL_DOS
27#define INCL_LONGLONG
28
29#include "fm3dll.h"
30
31#pragma alloc_text(FSOPEN,_fsopen)
32
33FILE *_fsopen(CHAR * filename, CHAR * mode, INT sharemode, ...)
34{
35
36 ULONG openflag = OPEN_ACTION_OPEN_IF_EXISTS, openmode = 0;
37 ULONGLONG action = 0;
38 HFILE handle;
39 FILE *fp;
40 BOOL text = TRUE;
41
42 if (!stristr(mode, "b"))
43 text = FALSE;
44 if (stristr(mode, "r"))
45 openmode |= OPEN_ACCESS_READONLY;
46 else if (stristr(mode, "w")) {
47 openmode |= OPEN_ACCESS_WRITEONLY;
48 openflag |= (OPEN_ACTION_REPLACE_IF_EXISTS | OPEN_ACTION_CREATE_IF_NEW);
49 }
50 if (stristr(mode, "a"))
51 openmode |= OPEN_ACCESS_WRITEONLY;
52 if (stristr(mode, "+")) {
53 openmode &= (~(OPEN_ACCESS_READONLY | OPEN_ACCESS_WRITEONLY));
54 openmode |= OPEN_ACCESS_READWRITE;
55 openflag |= OPEN_ACTION_CREATE_IF_NEW;
56 }
57 if (sharemode == SH_DENYRW)
58 openmode |= OPEN_SHARE_DENYREADWRITE;
59 else if (sharemode == SH_DENYWR)
60 openmode |= OPEN_SHARE_DENYWRITE;
61 else if (sharemode == SH_DENYRD)
62 openmode |= OPEN_SHARE_DENYREAD;
63 else
64 openmode |= OPEN_SHARE_DENYNONE;
65 openmode |= OPEN_FLAGS_FAIL_ON_ERROR;
66 if (text)
67 openmode |= OPEN_FLAGS_SEQUENTIAL;
68 else
69 openmode |= OPEN_FLAGS_RANDOMSEQUENTIAL;
70 if (DosOpen(filename, &handle, &action, 0, FILE_NORMAL, openflag, openmode,
71 (PEAOP2) 0))
72 return NULL;
73 if (mode[strlen(mode) - 1] == 't')
74 mode[strlen(mode) - 1] = 0; /* bug bug bug */
75 fp = fdopen(handle, mode);
76 if (!fp) {
77 DosClose(handle);
78 fp = fopen(filename, mode); /* last ditch effort */
79 }
80 if (fp) {
81 if (text) /* line buffer text files */
82 setvbuf(fp, NULL, _IOLBF, BUFSIZ * 2);
83 else
84 setvbuf(fp, NULL, _IOFBF, BUFSIZ * 8);
85 if (stristr(mode, "a"))
86 fseek(fp, 0L, SEEK_END);
87 }
88 return fp;
89}
90
91#endif
Note: See TracBrowser for help on using the repository browser.