CS350 COS
COS
Loading...
Searching...
No Matches
file.c
Go to the documentation of this file.
1
2#include <stdint.h>
3#include <stdio.h>
4#include <string.h>
5
6#include <unistd.h>
7#include <errno.h>
8
9#include <syscall.h>
10
11static FILE __stdin = { 1, STDIN_FILENO, 0 };
12static FILE __stdout = { 1, STDOUT_FILENO, 0 };
13static FILE __stderr = { 1, STDERR_FILENO, 0 };
14
18
19static FILE fds[FOPEN_MAX] = {
20 { 0, 0, 0 },
21 { 0, 0, 0 },
22 { 0, 0, 0 },
23 { 0, 0, 0 },
24 { 0, 0, 0 },
25 { 0, 0, 0 },
26 { 0, 0, 0 },
27 { 0, 0, 0 },
28 { 0, 0, 0 },
29 { 0, 0, 0 },
30 { 0, 0, 0 },
31 { 0, 0, 0 },
32 { 0, 0, 0 },
33 { 0, 0, 0 },
34 { 0, 0, 0 },
35 { 0, 0, 0 },
36};
37
38FILE *
40{
41 int i;
42
43 for (i = 0; i < FOPEN_MAX; i++) {
44 if (fds[i].in_use == 0) {
45 fds[i].in_use = 1;
46 return &fds[i];
47 }
48 }
49
50 // XXX: malloc
51
52 return NULL;
53}
54
55void
57{
58 fh->fd = 0;
59 fh->offset = 0;
60 fh->in_use = 0;
61
62 // XXX: free
63}
64
65FILE *
66fopen(const char *path, const char *mode)
67{
68 uint64_t fd;
69 FILE *fh;
70 // XXX: handle mode
71
72 fd = OSOpen(path, 0);
73 if (fd == 0)
74 return NULL;
75
76 fh = _alloc_file();
77 fh->fd = fd;
78 fh->offset = 0;
79
80 // XXX: handle append
81
82 return fh;
83}
84
85int
87{
88 int status = OSClose(fh->fd);
89
90 _free_file(fh);
91
92 return status;
93}
94
95int
97{
98 errno = ENOSYS;
99 return -1;
100}
101
102int
104{
105 errno = ENOSYS;
106 return -1;
107}
108
109size_t
110fread(void *buf, size_t size, size_t nmemb, FILE *fh)
111{
112 return OSRead(fh->fd, buf, 0, size * nmemb);
113 // set errno
114}
115
116size_t
117fwrite(const void *buf, size_t size, size_t nmemb, FILE *fh)
118{
119 return OSWrite(fh->fd, buf, 0, size * nmemb);
120 // set errno
121}
122
123int
124fputc(int ch, FILE *fh)
125{
126 if (fwrite(&ch, 1, 1, fh) == 1)
127 return ch;
128 return EOF;
129}
130
131int
132fputs(const char *str, FILE *fh)
133{
134 int status = fwrite(str, strlen(str), 1, fh);
135 if (status > 0)
136 return status;
137 // XXX: error handling
138 return EOF;
139}
140
141int
142puts(const char *str)
143{
144 int status, status2;
145 status = fputs(str, stdout);
146 if (status < 0)
147 return EOF;
148
149 status2 = fputc('\n', stdout);
150 if (status2 < 0)
151 return EOF;
152
153 return status;
154}
155
156int
158{
159 char ch;
160 if (fread(&ch, 1, 1, fh) == 1)
161 return ch;
162 return EOF;
163}
164
165char *
166fgets(char *str, int size, FILE *fh)
167{
168 int i;
169
170 for (i = 0; i < (size - 1); i++) {
171 int ch = fgetc(fh);
172 if (ch == EOF)
173 return NULL;
174 if (ch == '\b') {
175 if (i > 0)
176 i -= 1;
177 i -= 1;
178 continue;
179 }
180 str[i] = (char)ch;
181 if (ch == '\n') {
182 str[i + 1] = '\0';
183 return str;
184 }
185 }
186
187 str[size - 1] = '\0';
188 return str;
189}
190
#define ENOSYS
Definition: errno.h:18
#define errno
Definition: errno.h:7
static char buf[4096]
Definition: ethdump.c:10
static FILE fds[FOPEN_MAX]
Definition: file.c:19
size_t fwrite(const void *buf, size_t size, size_t nmemb, FILE *fh)
Definition: file.c:117
int puts(const char *str)
Definition: file.c:142
FILE * fopen(const char *path, const char *mode)
Definition: file.c:66
char * fgets(char *str, int size, FILE *fh)
Definition: file.c:166
size_t fread(void *buf, size_t size, size_t nmemb, FILE *fh)
Definition: file.c:110
int fclose(FILE *fh)
Definition: file.c:86
int feof(FILE *fh)
Definition: file.c:96
static FILE __stderr
Definition: file.c:13
int fputs(const char *str, FILE *fh)
Definition: file.c:132
static FILE __stdin
Definition: file.c:11
FILE * _alloc_file()
Definition: file.c:39
static FILE __stdout
Definition: file.c:12
FILE * stdout
Definition: file.c:16
int fflush(FILE *fh)
Definition: file.c:103
FILE * stderr
Definition: file.c:17
FILE * stdin
Definition: file.c:15
void _free_file(FILE *fh)
Definition: file.c:56
int fputc(int ch, FILE *fh)
Definition: file.c:124
int fgetc(FILE *fh)
Definition: file.c:157
int OSRead(uint64_t fd, void *addr, uint64_t off, uint64_t length)
Definition: syscall.c:59
uint64_t OSOpen(const char *path, uint64_t flags)
Definition: syscall.c:77
int OSClose(uint64_t fd)
Definition: syscall.c:83
int OSWrite(uint64_t fd, const void *addr, uint64_t off, uint64_t length)
Definition: syscall.c:65
uint32_t size
Definition: multiboot.h:0
#define NULL
Definition: stddef.h:6
#define EOF
Definition: stdio.h:18
fpos_t offset
Definition: stdio.h:11
#define FOPEN_MAX
Definition: stdio.h:24
uint64_t fd
Definition: stdio.h:10
int in_use
Definition: stdio.h:9
Definition: stdio.h:8
size_t strlen(const char *str)
Definition: string.c:112
unsigned long uint64_t
Definition: types.h:13
#define STDOUT_FILENO
Definition: unistd.h:6
#define STDERR_FILENO
Definition: unistd.h:7
#define STDIN_FILENO
Definition: unistd.h:5