bool getline(u::file &fp, u::string &line) { line.clear(); for (;;) { char buf[256]; if (!fgets(buf, sizeof buf, fp.get())) { if (feof(fp.get())) return !line.empty(); abort(); } size_t n = strlen(buf); if (n && buf[n - 1] == '\n') --n; if (n && buf[n - 1] == '\r') --n; line.append(buf, n); if (n < sizeof buf - 1) return true; } return false; }
u::optional<u::string> getline(u::file &fp) { u::string s; for (;;) { char buf[256]; if (!fgets(buf, sizeof(buf), fp.get())) { if (feof(fp.get())) { if (s.empty()) return u::none; else return u::move(s); } abort(); } size_t n = strlen(buf); if (n && buf[n - 1] == '\n') --n; s.append(buf, n); if (n < sizeof(buf) - 1) return u::move(s); } }