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 */