1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #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 = xs_str_new(NULL);
- errno = 0;
-
- if (!feof(f)) {
- int c;
- 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
|