28 FILE *fopen(const char *path, const char *mode)
32 unsigned int mflags = 0;
45 mflags |= MODE_WRITE | MODE_TRUNCATE;
47 mflags |= MODE_READ | MODE_CREATE;
52 mflags |= MODE_WRITE | MODE_APPEND;
54 mflags |= MODE_READ | MODE_CREATE;
66 if(!(node = fs_open(path, 0))) {
68 errno = ENOENT; /* TODO */
71 if(node->type != FSNODE_FILE) {
76 if(!(fp = malloc(sizeof *fp))) {
99 long filesize(FILE *fp)
101 return fs_filesize(fp->fsn);
104 int fseek(FILE *fp, long offset, int from)
110 if(from < 0 || from > 2) {
115 fs_seek(fp->fsn, offset, from);
116 fp->status &= ~STATUS_EOF;
120 void rewind(FILE *fp)
122 fseek(fp, 0, SEEK_SET);
131 return fs_tell(fp->fsn);
134 size_t fread(void *buf, size_t size, size_t count, FILE *fp)
138 if((res = fs_read(fp->fsn, buf, size * count)) == -1) {
139 fp->status |= STATUS_EOF;
145 size_t fwrite(const void *buf, size_t size, size_t count, FILE *fp)
149 if(!(fp->mode & MODE_WRITE)) {
150 fp->status |= STATUS_ERR;
153 if((res = fs_write(fp->fsn, (void*)buf, size * count)) == -1) {
162 if(fread(&c, 1, 1, fp) < 1) {
168 char *fgets(char *buf, int size, FILE *fp)
173 while(--size > 0 && (c = fgetc(fp)) >= 0) {
178 return s > buf ? buf : 0;
181 int fputc(int c, FILE *fp)
183 if(fp == stdout || fp == stderr) {
187 panic("fputc on anything other than stdout/stderr not implemented yet\n");
193 if(fp == stdout || fp == stderr) {
194 return 0; /* do nothing */
197 panic("fflush on anything other than stdout/stderr not implemented yet\n");
203 return (fp->status & STATUS_EOF) != 0;
208 return (fp->status & STATUS_ERR) != 0;
211 void clearerr(FILE *fp)