aboutsummaryrefslogblamecommitdiff
path: root/src/lib/libc/stdio.c
blob: c8496830a597c0c6cba1d120052c58be3d81894d (plain) (tree)
1
2
3
4
5
6
7
8
                   

                  

                         


                           


                 
 
                                                          
 






















                                                                 
         


 



                            
                    
                                

 
                         
                                

 
                                  
                   

                          
                                            

                   
                   

 




                     
                                                 


                 
                                                                 


                 












































                                                                         








                                 











                                                                         
                                

                                        

                                        
                                               

                               
                                

 







                                                 
 




                                                            

 



                                                            
 
                                                      
               
 



                                                             


                 

                     



                 


                        
 
                             
               
 
                        


                 
                          


                 
                          



                 
 


                     





















                                                  



                        



















                                              
                                   
#include <string.h>
#include <stdio.h>

#include <proto/launch.h>

#include <kogata/syscall.h>
#include <kogata/printf.h>

FILE *stdin = 0;
FILE *stdout = 0;
FILE *stderr = 0;

FILE libc_tty_stdio, libc_stdin, libc_stdout, libc_stderr;

void setup_libc_stdio() {
	if (sc_stat_open(STD_FD_TTY_STDIO, &libc_tty_stdio.st)) {
		libc_tty_stdio.fd = STD_FD_TTY_STDIO;
		sc_fctl(libc_tty_stdio.fd, FC_SET_BLOCKING, 0);
		// TODO: initialize libc_tty_stdio as a TTY
		stdin = &libc_tty_stdio;
		stdout = &libc_tty_stdio;
		stderr = &libc_tty_stdio;
	}
	if (sc_stat_open(STD_FD_STDIN, &libc_stdin.st)) {
		libc_stdin.fd = STD_FD_STDIN;
		// TODO: initialize
		stdin = &libc_stdin;
	}
	if (sc_stat_open(STD_FD_STDOUT, &libc_stdout.st)) {
		libc_stdout.fd = STD_FD_STDOUT;
		// TODO: initialize
		stdout = &libc_stdout;
	}
	if (sc_stat_open(STD_FD_STDERR, &libc_stderr.st)) {
		libc_stderr.fd = STD_FD_STDERR;
		// TODO: initialize
		stderr = &libc_stderr;
	}
}


int getchar() {
	return fgetc(stdin);
}

int putchar(int c) {
	return fputc(c, stdout);
}

int puts(const char* s) {
	return fputs(s, stdout);
}

int printf(const char* fmt, ...) {
	va_list ap;

	va_start(ap, fmt);
	int ret = vfprintf(stdout, fmt, ap);
	va_end(ap);

	return ret;
}

// ==================
// BELOW IS TODO
// ==================


FILE *fopen(const char *path, const char *mode) {
	// TODO
	return 0;
}
FILE *freopen(const char *path, const char *mode, FILE *stream) {
	// TODO
	return 0;
}
int fclose(FILE* f) {
	// TODO
	return 0;
}


// ---------------
// INPUT FUNCTIONS
// ---------------

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) {
	if (stream == NULL || stream->fd == 0) return 0;

	// TODO buffering
	// TODO position
	return sc_read(stream->fd, 0, size * nmemb, ptr);
}

int fgetc(FILE *stream) {
	// TODO buffering && ungetc
	char x;
	if (fread(&x, 1, 1, stream)) {
		return x;
	} else {
		return EOF;
	}
}
char *fgets(char *s, int size, FILE *stream) {
	int l = 0;
	while (l < size - 1) {
		int c = fgetc(stream);
		if (c == EOF) {
			break;
		} else if (c == '\b') {
			if (l > 0) l--;
			// TODO if terminal write back space or something
		} else {
			s[l] = c;
			l++;
			if (c == '\n') break;
		}
	}
	s[l] = 0;
	return s;
}
int getc(FILE *stream) {
	// TODO
	return 0;
}
int ungetc(int c, FILE *stream) {
	// TODO
	return 0;
}

// ----------------
// OUTPUT FUNCTIONS
// ----------------

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) {
	if (stream == NULL || stream->fd == 0) return 0;

	// TODO buffering
	// TODO position
	return sc_write(stream->fd, 0, size * nmemb, ptr);
}

int fputc(int c, FILE *stream) {
	unsigned char x = c;
	return fwrite(&x, 1, 1, stream);
}
int fputs(const char *s, FILE *stream) {
	return fwrite(s, strlen(s), 1, stream);
}
int putc(int c, FILE *stream) {
	return fputc(c, stream);
}

int fprintf(FILE *stream, const char *fmt, ...) {
	va_list ap;

	va_start(ap, fmt);
	int ret = vfprintf(stream, fmt, ap);
	va_end(ap);

	return ret;
}
int vfprintf(FILE *stream, const char *format, va_list ap) {
	char buf[1024];
	vsnprintf(buf, 1024, format, ap);

	return fputs(buf, stream);
}

// buffering

void setbuf(FILE *stream, char *buf) {
	setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
}
void setbuffer(FILE *stream, char *buf, size_t size) {
	// TODO
}
void setlinebuf(FILE *stream) {
	setvbuf(stream, NULL, _IOLBF, 0);
}
int setvbuf(FILE *stream, char *buf, int mode, size_t size) {
	// TODO
	return 0;
}

int fflush(FILE* f) {
	// TODO
	return 0;
}

// ---------------------
// COMPLICATED FUNCTIONS
// ---------------------

void clearerr(FILE *stream) {
	// TODO
}
int feof(FILE *stream) {
	// TODO
	return 0;
}
int ferror(FILE *stream) {
	// TODO
	return 0;
}
int fileno(FILE *stream) {
	// TODO
	return 0;
}


// ------------------
// POSITION FUNCTIONS
// ------------------


int fseek(FILE *stream, long offset, int whence) {
	// TODO
	return 0;
}
long ftell(FILE *stream) {
	// TODO
	return 0;
}
void rewind(FILE *stream) {
	// TODO
}
int fgetpos(FILE *stream, fpos_t *pos) {
	// TODO
	return 0;
}
int fsetpos(FILE *stream, const fpos_t *pos) {
	// TODO
	return 0;
}

// ---------------------
// PATH & FILE FUNCTIONS
// ---------------------

FILE *tmpfile(void) {
	// TODO
	return 0;
}
char *tmpnam(char *s) {
	// TODO
	return 0;
}

int rename(const char *old, const char *new) {
	// TODO
	return 0;
}
int remove(const char *pathname) {
	// TODO
	return 0;
}



/* vim: set ts=4 sw=4 tw=0 noet :*/