summaryrefslogtreecommitdiff
path: root/newlib/libc/stdio/flags.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-12-15 09:38:53 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2017-12-15 09:39:34 -0500
commitf95a4a932476be2ba99e2fd081e8d2bc6ea12813 (patch)
tree75f67192cb2d7b7b575c94edda318e475239b63c /newlib/libc/stdio/flags.c
parentf60aca96985e68c7d8a52eb7bc955fb80e132f73 (diff)
Import newlib and create makefile
Diffstat (limited to 'newlib/libc/stdio/flags.c')
-rw-r--r--newlib/libc/stdio/flags.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/newlib/libc/stdio/flags.c b/newlib/libc/stdio/flags.c
new file mode 100644
index 0000000..82e9f29
--- /dev/null
+++ b/newlib/libc/stdio/flags.c
@@ -0,0 +1,83 @@
+/* No user fns here. Pesch 15apr92 */
+
+/*
+ * Copyright (c) 1990 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley. The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+#include <stdio.h>
+#include <time.h>
+#include <fcntl.h>
+
+#include <errno.h>
+#include <sys/types.h>
+
+/*
+ * Return the (stdio) flags for a given mode. Store the flags
+ * to be passed to an open() syscall through *optr.
+ * Return 0 on error.
+ */
+
+int
+__sflags (ptr, mode, optr)
+ struct _reent *ptr;
+ register char *mode;
+ int *optr;
+{
+ register int ret, m, o;
+
+ switch (mode[0])
+ {
+ case 'r': /* open for reading */
+ ret = __SRD;
+ m = O_RDONLY;
+ o = 0;
+ break;
+
+ case 'w': /* open for writing */
+ ret = __SWR;
+ m = O_WRONLY;
+ o = O_CREAT | O_TRUNC;
+ break;
+
+ case 'a': /* open for appending */
+ ret = __SWR | __SAPP;
+ m = O_WRONLY;
+ o = O_CREAT | O_APPEND;
+ break;
+ default: /* illegal mode */
+ ptr->_errno = EINVAL;
+ return (0);
+ }
+ if (mode[1] == '+' || mode[2] == '+')
+ {
+ ret = __SRW;
+ m = O_RDWR;
+ }
+ if (mode[1] == 'b' || mode[2] == 'b')
+ {
+#ifdef O_BINARY
+ m |= O_BINARY;
+#endif
+ }
+ else if (mode[1] == 't' || mode[2] == 't')
+ {
+#ifdef O_TEXT
+ m |= O_TEXT;
+#endif
+ }
+ *optr = m | o;
+ return ret;
+}