MIPS/resources/soft/perf_func/lib/stdio.c
Paul Pan 7b33e4213a a big update
1. add test soft
2. modify verilator (TODO: crossbar need to replace)
3. fix CP0: now CU0 is always 1
4. Controller: cacheop
5. Controller: fix TEN
6. mycpu_top fix CP0_i
7. fix AXI.sv
8. fix AXIReader.sv
9. fix AXIWriter.sv: getting the correct data and length
10. MU: fix cache writeback, fix mem data mux, fix writer address, fix read request
2022-07-29 18:25:58 +08:00

98 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
FILE files[SIZE] = {0};
/*
FILE* fopen(char* str){
FILE* file = &dummy;
while(file->next != NULL){
file = file->next;
}
file->next = malloc(sizeof(*file));
file->next->str = str;
file->next->pos = 0;
file->next->next = NULL;
return file->next;
}
*/
FILE* fopen(char* str){
int i;
for(i=0;i<SIZE;i++){
if(files[i].str == NULL){
break;
}
}
files[i].str = str;
files[i].pos = 0;
return &files[i];
}
size_t fread(void* ptr, size_t size, size_t nmemb, FILE* stream){
char* out = (char*)ptr;
char* str = stream->str;
size_t total = strlen(str);
if(stream->pos == total){
return 0;
}
size_t c = 0;
for(c=0;c<size*nmemb; ){
out[c++] = str[stream->pos++];
if(stream->pos == total){
break;
}
}
return c;
}
/*
void fclose(FILE* stream){
FILE* file = &dummy;
while(file->next != stream){
file = file->next;
}
FILE* tmp = file->next;
file->next = tmp->next;
free(tmp);
}
*/
void fclose(FILE* stream){
int i;
for(i=0;i<SIZE;i++){
if(&files[i] == stream){
break;
}
}
stream->str = NULL;
stream->pos = 0;
}
char *fgets(char *s, int size, FILE *stream){
char* str = stream->str;
size_t total = strlen(str);
size_t c = 0;
char* r = NULL;
while(stream->pos != total){
if(str[stream->pos] == '\n'){
s[c++] = str[stream->pos++];
break;
}else{
s[c++] = str[stream->pos++];
}
}
return r;
}
int getc(FILE* stream){
char* str = stream->str;
size_t total = strlen(str);
if(stream->pos == total){
return EOF;
}else{
return (unsigned char)str[stream->pos++];
}
}