/** * Author......: See docs/credits.txt * License.....: MIT */ #include "common.h" #include "types.h" #include "memory.h" #include "shared.h" #include "filehandling.h" u64 count_lines (FILE *fd) { u64 cnt = 0; char *buf = (char *) hcmalloc (HCBUFSIZ_LARGE + 1); char prev = '\n'; while (!feof (fd)) { size_t nread = hc_fread (buf, sizeof (char), HCBUFSIZ_LARGE, fd); if (nread < 1) continue; size_t i; for (i = 0; i < nread; i++) { if (prev == '\n') cnt++; prev = buf[i]; } } hcfree (buf); return cnt; } size_t fgetl (FILE *fp, char *line_buf) { size_t line_len = 0; while (!feof (fp)) { const int c = fgetc (fp); if (c == EOF) break; line_buf[line_len] = (char) c; line_len++; if (line_len == HCBUFSIZ_LARGE) line_len--; if (c == '\n') break; } if (line_len == 0) return 0; while (line_len) { if (line_buf[line_len - 1] == '\n') { line_len--; continue; } if (line_buf[line_len - 1] == '\r') { line_len--; continue; } break; } line_buf[line_len] = 0; return (line_len); } size_t superchop_with_length (char *buf, const size_t len) { size_t new_len = len; while (new_len) { if (buf[new_len - 1] == '\n') { new_len--; buf[new_len] = 0; continue; } if (buf[new_len - 1] == '\r') { new_len--; buf[new_len] = 0; continue; } break; } return new_len; } size_t in_superchop (char *buf) { size_t len = strlen (buf); while (len) { if (buf[len - 1] == '\n') { len--; buf[len] = 0; continue; } if (buf[len - 1] == '\r') { len--; buf[len] = 0; continue; } break; } return len; }