12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #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;
- if (xs_is_string((char *)&rc))
- 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
|