summaryrefslogtreecommitdiff
path: root/com32/include/stdio.h
blob: 813a0edcf5d1dcf52eae4aaacf78633f371801ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
 * stdio.h
 */

#ifndef _STDIO_H
#define _STDIO_H

#include <klibc/extern.h>
#include <stdarg.h>
#include <stddef.h>

/* This structure doesn't really exist, but it gives us something
   to define FILE * with */
struct _IO_file;
typedef struct _IO_file FILE;

#ifndef EOF
# define EOF (-1)
#endif

#ifndef BUFSIZ
# define BUFSIZ 4096
#endif

#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2

/*
 * Convert between a FILE * and a file descriptor.  We don't actually
 * have any in-memory data, so we just abuse the pointer itself to
 * hold the data.  Note, however, that for file descriptors, -1 is
 * error and 0 is a valid value; for FILE *, NULL (0) is error and
 * non-NULL are valid.
 */
static __inline__ int fileno(FILE * __f)
{
    /* This should really be intptr_t, but size_t should be the same size */
    return (int)(size_t) __f - 1;
}

/* This is a macro so it can be used as initializer */
#define __create_file(__fd) ((FILE *)(size_t)((__fd) + 1))

#define stdin  __create_file(0)
#define stdout __create_file(1)
#define stderr __create_file(2)

__extern FILE *fopen(const char *, const char *);
struct dev_info;
__extern FILE *fopendev(const struct dev_info *, const char *);

static __inline__ FILE *fdopen(int __fd, const char *__m)
{
    (void)__m;
    return __create_file(__fd);
}

__extern int fclose(FILE * __f);
__extern int fputs(const char *, FILE *);
__extern int puts(const char *);
__extern int fputc(int, FILE *);
#define putc(c,f)  fputc((c),(f))
#define putchar(c) fputc((c),stdout)

__extern int fgetc(FILE *);
__extern char *fgets(char *, int, FILE *);
#define getc(f) fgetc(f)

__extern size_t _fread(void *, size_t, FILE *);
__extern size_t _fwrite(const void *, size_t, FILE *);

__extern size_t fread(void *, size_t, size_t, FILE *);
__extern size_t fwrite(const void *, size_t, size_t, FILE *);

#ifndef __NO_FREAD_FWRITE_INLINES
#define fread(__p, __s, __n, __f)					\
  ( (__builtin_constant_p(__s) && __s == 1)				\
    ? _fread(__p, __n, __f)						\
    : fread(__p,__s,__n,__f) )

#define fwrite(__p, __s, __n, __f)					\
  ( (__builtin_constant_p(__s) && __s == 1)				\
    ? _fwrite(__p, __n, __f)						\
    : fwrite(__p,__s,__n,__f) )
#endif

/* No seek, but we can tell */
__extern long ftell(FILE *);

__extern int printf(const char *, ...);
__extern int vprintf(const char *, va_list);
__extern int fprintf(FILE *, const char *, ...);
__extern int vfprintf(FILE *, const char *, va_list);
__extern int sprintf(char *, const char *, ...);
__extern int vsprintf(char *, const char *, va_list);
__extern int snprintf(char *, size_t n, const char *, ...);
__extern int vsnprintf(char *, size_t n, const char *, va_list);

__extern int asprintf(char **, const char *, ...);
__extern int vasprintf(char **, const char *, va_list);

#define mp(f, x...) \
        printf("[%s()]: " f "\n", __func__,##x)
#define mpi()	mp("enter")
#define mpo()	mp("exit")

/* No buffering, so no flushing needed */
static __inline__ int fflush(FILE * __f)
{
    (void)__f;
    return 0;
}

__extern int sscanf(const char *, const char *, ...);
__extern int vsscanf(const char *, const char *, va_list);

__extern void perror(const char *);

__extern int rename(const char *, const char *);

/*
 * unhexchar: Convert a hexadecimal digit to the equivalent number
 *
 * Returns 0 if 'data' was converted succesfully, -1 otherwise.
 */
static inline int unhexchar(unsigned char *data)
{
	unsigned char num = *data;

	if (num >= '0' && num <= '9') {
		*data = num - '0';
		return 0;
	} else {
		num |= 0x20;	/* upper case -> lower case */
		if (num >= 'a' && num <= 'f') {
			*data = num - 'a' + 10;
			return 0;
		}
	}

	return -1;
}

#endif /* _STDIO_H */