xs_io.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* copyright (c) 2022 grunfink - MIT license */
  2. #ifndef _XS_IO_H
  3. #define _XS_IO_H
  4. d_char *xs_readall(FILE *f);
  5. d_char *xs_readline(FILE *f);
  6. d_char *xs_read(FILE *f, int *size);
  7. #ifdef XS_IMPLEMENTATION
  8. d_char *xs_readall(FILE *f)
  9. /* reads the rest of the file into a string */
  10. {
  11. d_char *s;
  12. char tmp[1024];
  13. errno = 0;
  14. /* create the new string */
  15. s = xs_str_new(NULL);
  16. while (fgets(tmp, sizeof(tmp), f))
  17. s = xs_str_cat(s, tmp);
  18. return s;
  19. }
  20. d_char *xs_readline(FILE *f)
  21. /* reads a line from a file */
  22. {
  23. d_char *s = NULL;
  24. errno = 0;
  25. /* don't even try on eof */
  26. if (!feof(f)) {
  27. int c;
  28. s = xs_str_new(NULL);
  29. while ((c = fgetc(f)) != EOF) {
  30. unsigned char rc = c;
  31. s = xs_append_m(s, (char *)&rc, 1);
  32. if (c == '\n')
  33. break;
  34. }
  35. }
  36. return s;
  37. }
  38. d_char *xs_read(FILE *f, int *sz)
  39. /* reads up to size bytes from f */
  40. {
  41. d_char *s;
  42. int size = *sz;
  43. int rdsz = 0;
  44. errno = 0;
  45. s = xs_str_new(NULL);
  46. while (size > 0 && !feof(f)) {
  47. char tmp[2048];
  48. int n, r;
  49. if ((n = sizeof(tmp)) > size)
  50. n = size;
  51. r = fread(tmp, 1, n, f);
  52. s = xs_append_m(s, tmp, r);
  53. size -= r;
  54. rdsz += r;
  55. }
  56. *sz = rdsz;
  57. return s;
  58. }
  59. #endif /* XS_IMPLEMENTATION */
  60. #endif /* _XS_IO_H */