chiark / gitweb /
[PATCH] klibc: version 1.0.3
[elogind.git] / klibc / include / stdio.h
1 /*
2  * stdio.h
3  */
4
5 #ifndef _STDIO_H
6 #define _STDIO_H
7
8 #include <klibc/extern.h>
9 #include <stdarg.h>
10 #include <stddef.h>
11 #include <unistd.h>
12
13 /* This structure doesn't really exist, but it gives us something
14    to define FILE * with */
15 struct _IO_file;
16 typedef struct _IO_file FILE;
17
18 #ifndef EOF
19 # define EOF (-1)
20 #endif
21
22 #ifndef BUFSIZ
23 # define BUFSIZ 4096
24 #endif
25
26 #define SEEK_SET 0
27 #define SEEK_CUR 1
28 #define SEEK_END 2
29
30 /*
31  * Convert between a FILE * and a file descriptor.  We don't actually
32  * have any in-memory data, so we just abuse the pointer itself to
33  * hold the data.  Note, however, that for file descriptors, -1 is
34  * error and 0 is a valid value; for FILE *, NULL (0) is error and
35  * non-NULL are valid.
36  */
37 static __inline__ int fileno(FILE *__f)
38 {
39   /* This should really be intptr_t, but size_t should be the same size */
40   return (int)(size_t)__f - 1;
41 }
42
43 /* This is a macro so it can be used as initializer */
44 #define __create_file(__fd) ((FILE *)(size_t)((__fd) + 1))
45
46 #define stdin  __create_file(0)
47 #define stdout __create_file(1)
48 #define stderr __create_file(2)
49
50 __extern FILE *fopen(const char *, const char *);
51
52 static __inline__ FILE *fdopen(int __fd, const char *__m)
53 {
54   (void)__m; return __create_file(__fd);
55 }
56 static __inline__ int fclose(FILE *__f)
57 {
58   extern int close(int);
59   return close(fileno(__f));
60 }
61 static __inline__ int fseek(FILE *__f, off_t __o, int __w)
62 {
63   extern off_t lseek(int, off_t, int);
64   return (lseek(fileno(__f), __o, __w) == (off_t)-1) ? -1 : 0;
65 }
66 static __inline__ off_t ftell(FILE *__f)
67 {
68   extern off_t lseek(int, off_t, int);
69   return lseek(fileno(__f), 0, SEEK_CUR);
70 }
71
72 __extern int fputs(const char *, FILE *);
73 __extern int puts(const char *);
74 __extern int fputc(int, FILE *);
75 #define putc(c,f)  fputc((c),(f))
76 #define putchar(c) fputc((c),stdout)
77
78 __extern int    fgetc(FILE *);
79 __extern char * fgets(char *, int, FILE *);
80 #define getc(f) fgetc(f)
81
82 __extern size_t _fread(void *, size_t, FILE *);
83 __extern size_t _fwrite(const void *, size_t, FILE *);
84
85 #ifndef __NO_FREAD_FWRITE_INLINES
86 extern __inline__ size_t
87 fread(void *__p, size_t __s, size_t __n, FILE *__f)
88 {
89   return _fread(__p, __s*__n, __f)/__s;
90 }
91
92 extern __inline__ size_t
93 fwrite(const void *__p, size_t __s, size_t __n, FILE *__f)
94 {
95   return _fwrite(__p, __s*__n, __f)/__s;
96 }
97 #endif
98
99 __extern int printf(const char *, ...);
100 __extern int vprintf(const char *, va_list);
101 __extern int fprintf(FILE *, const char *, ...);
102 __extern int vfprintf(FILE *, const char *, va_list);
103 __extern int sprintf(char *, const char *, ...);
104 __extern int vsprintf(char *, const char *, va_list);
105 __extern int snprintf(char *, size_t n, const char *, ...);
106 __extern int vsnprintf(char *, size_t n, const char *, va_list);
107 __extern int asprintf(char **, const char *, ...);
108 __extern int vasprintf(char **, const char *, va_list);
109
110 /* No buffering, so no flushing needed */
111 extern __inline__ int
112 fflush(FILE *__f)
113 {
114   (void)__f;
115   return 0;
116 }
117
118 __extern int sscanf(const char *, const char *, ...);
119 __extern int vsscanf(const char *, const char *, va_list);
120
121 __extern void perror(const char *);
122
123 __extern int rename(const char *, const char *);
124
125 #endif /* _STDIO_H */