123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #ifndef _XS_IO_H
- #define _XS_IO_H
- xs_str *xs_readline(FILE *f);
- xs_val *xs_read(FILE *f, int *size);
- xs_val *xs_readall(FILE *f);
- #ifdef XS_IMPLEMENTATION
- xs_str *xs_readline(FILE *f)
- {
- xs_str *s = NULL;
- errno = 0;
-
- if (!feof(f)) {
- int c;
- s = xs_str_new(NULL);
- while ((c = fgetc(f)) != EOF) {
- unsigned char rc = c;
- s = xs_append_m(s, (char *)&rc, 1);
- if (c == '\n')
- break;
- }
- }
- return s;
- }
- xs_val *xs_read(FILE *f, int *sz)
- {
- xs_val *s = NULL;
- int size = *sz;
- int rdsz = 0;
- errno = 0;
- while (size > 0 && !feof(f)) {
- char tmp[4096];
- int n, r;
- if ((n = sizeof(tmp)) > size)
- n = size;
- r = fread(tmp, 1, n, f);
-
- s = xs_realloc(s, rdsz + r);
-
- memcpy(s + rdsz, tmp, r);
- rdsz += r;
- size -= r;
- }
-
- s = xs_realloc(s, _xs_blk_size(rdsz + 1));
- s[rdsz] = '\0';
- *sz = rdsz;
- return s;
- }
- xs_val *xs_readall(FILE *f)
- {
- int size = XS_ALL;
- return xs_read(f, &size);
- }
- #endif
- #endif
|