Subversion Repositories Kolibri OS

Rev

Rev 4872 | Rev 4921 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4349 Serge 1
/*
2
 * Copyright (c) 1990 Regents of the University of California.
3
 * All rights reserved.
4
 *
5
 * Redistribution and use in source and binary forms are permitted
6
 * provided that the above copyright notice and this paragraph are
7
 * duplicated in all such forms and that any documentation,
8
 * advertising materials, and other materials related to such
9
 * distribution and use acknowledge that the software was developed
10
 * by the University of California, Berkeley.  The name of the
11
 * University may not be used to endorse or promote products derived
12
 * from this software without specific prior written permission.
13
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16
 */
17
/* No user fns here. Pesch 15apr92 */
18
 
19
#include <_ansi.h>
20
#include 
21
#include 
22
#include 
23
#include 
24
#include 
25
 
26
/*
27
 * Return the (stdio) flags for a given mode.  Store the flags
28
 * to be passed to an open() syscall through *optr.
29
 * Return 0 on error.
30
 */
31
 
32
int
33
_DEFUN(__sflags, (ptr, mode, optr),
34
       struct _reent *ptr  _AND
35
       register char *mode _AND
36
       int *optr)
37
{
38
  register int ret, m, o;
39
 
40
  switch (mode[0])
41
    {
42
    case 'r':			/* open for reading */
43
      ret = __SRD;
44
      m = O_RDONLY;
45
      o = 0;
46
      break;
47
 
48
    case 'w':			/* open for writing */
49
      ret = __SWR;
50
      m = O_WRONLY;
51
      o = O_CREAT | O_TRUNC;
52
      break;
53
 
54
    case 'a':			/* open for appending */
55
      ret = __SWR | __SAPP;
56
      m = O_WRONLY;
57
      o = O_CREAT | O_APPEND;
58
      break;
59
    default:			/* illegal mode */
60
      ptr->_errno = EINVAL;
61
      return (0);
62
    }
63
  if (mode[1] && (mode[1] == '+' || mode[2] == '+'))
64
    {
65
      ret = (ret & ~(__SRD | __SWR)) | __SRW;
66
      m = O_RDWR;
67
    }
68
  if (mode[1] && (mode[1] == 'b' || mode[2] == 'b'))
69
    {
70
#ifdef O_BINARY
71
      m |= O_BINARY;
72
#endif
73
    }
74
#ifdef __CYGWIN__
75
  else if (mode[1] && (mode[1] == 't' || mode[2] == 't'))
76
#else
77
  else
78
#endif
79
    {
80
#ifdef O_TEXT
81
      m |= O_TEXT;
82
#endif
83
    }
84
  *optr = m | o;
85
  return ret;
86
}