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