2.86
xs_io.h
1/* copyright (c) 2022 - 2026 grunfink et al. / MIT license */
2
3#ifndef _XS_IO_H
4
5#define _XS_IO_H
6
7xs_str *xs_readline(FILE *f);
8xs_val *xs_read(FILE *f, int *size);
9xs_val *xs_readall(FILE *f);
10
11
12#ifdef XS_IMPLEMENTATION
13
14xs_str *xs_readline(FILE *f)
15/* reads a line from a file */
16{
17 xs_str *s = xs_str_new(NULL);
18
19 errno = 0;
20
21 /* don't even try on eof */
22 if (!feof(f)) {
23 int c;
24
25 while ((c = fgetc(f)) != EOF) {
26 unsigned char rc = c;
27
28 if (xs_is_string((char *)&rc))
29 s = xs_append_m(s, (char *)&rc, 1);
30
31 if (c == '\n')
32 break;
33 }
34 }
35
36 return s;
37}
38
39
40xs_val *xs_read(FILE *f, int *sz)
41/* reads up to size bytes from f */
42{
43 xs_val *s = NULL;
44 int size = *sz;
45 int rdsz = 0;
46
47 errno = 0;
48
49 while (size > 0 && !feof(f)) {
50 char tmp[4096];
51 int n, r;
52
53 if ((n = sizeof(tmp)) > size)
54 n = size;
55
56 r = fread(tmp, 1, n, f);
57
58 /* open room */
59 s = xs_realloc(s, rdsz + r);
60
61 /* copy read data */
62 memcpy(s + rdsz, tmp, r);
63
64 rdsz += r;
65 size -= r;
66 }
67
68 /* null terminate, just in case it's treated as a string */
69 s = xs_realloc(s, _xs_blk_size(rdsz + 1));
70 s[rdsz] = '\0';
71
72 *sz = rdsz;
73
74 return s;
75}
76
77
78xs_val *xs_readall(FILE *f)
79/* reads the rest of the file into a string */
80{
81 int size = XS_ALL;
82
83 return xs_read(f, &size);
84}
85
86
87#endif /* XS_IMPLEMENTATION */
88
89#endif /* _XS_IO_H */