blob: fa7103fd02fd0809ab6acd130ed9e34362109a62 [file] [log] [blame]
/*
* stdio.h
*/
#ifndef _STDIO_H
#define _STDIO_H
#include <klibc/extern.h>
#include <klibc/inline.h>
#include <stdarg.h>
#include <stddef.h>
#include <string.h>
#ifdef __cplusplus
extern "C" {
#endif
/* The File structure is designed to be compatible with ChibiOS/RT type
* BaseSequentialStream.
*/
struct File;
typedef struct File FILE;
struct File_methods
{
size_t (*write)(FILE* instance, const char *bp, size_t n);
size_t (*read)(FILE* instance, char *bp, size_t n);
};
struct File
{
const struct File_methods *vmt;
};
#ifndef EOF
# define EOF (-1)
#endif
#ifndef BUFSIZ
# define BUFSIZ 1
#endif
/* Standard file descriptors - implement these globals yourself. */
extern FILE* const stdin;
extern FILE* const stdout;
extern FILE* const stderr;
/* Wrappers around stream write and read */
__extern_inline size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream)
{
if (stream->vmt->read == NULL) return 0;
return stream->vmt->read(stream, (char*)buf, size*nmemb) / size;
}
__extern_inline size_t fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream)
{
if (stream->vmt->write == NULL) return 0;
return stream->vmt->write(stream, (char*)buf, size*nmemb) / size;
}
__extern_inline int fputs(const char *s, FILE *f)
{
return fwrite(s, 1, strlen(s), f);
}
__extern_inline int puts(const char *s)
{
return fwrite(s, 1, strlen(s), stdout) + fwrite("\n", 1, 1, stdout);
}
__extern_inline int fputc(int c, FILE *f)
{
unsigned char ch = c;
return fwrite(&ch, 1, 1, f) == 1 ? ch : EOF;
}
__extern char *fgets(char *, int, FILE *);
__extern_inline int fgetc(FILE *f)
{
unsigned char ch;
return fread(&ch, 1, 1, f) == 1 ? ch : EOF;
}
__extern int errno;
__extern_inline char *strerror(int errnum)
{
return (char*)"error_str";
}
#define putc(c,f) fputc((c),(f))
#define putchar(c) fputc((c),stdout)
#define getc(f) fgetc(f)
#define getchar() fgetc(stdin)
__extern_inline int fflush(FILE *stream)
{
return 0;
}
__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);
__extern int sscanf(const char *, const char *, ...);
__extern int vsscanf(const char *, const char *, va_list);
/* Open a memory buffer for writing.
Note: Does not write null terminator.*/
struct MemFile
{
struct File file;
char *buffer;
size_t bytes_written;
size_t size;
};
FILE *fmemopen_w(struct MemFile* storage, char *buffer, size_t size);
#ifdef __cplusplus
}
#endif
#endif /* _STDIO_H */