1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CRAZY_LINKER_LINE_READER_H
6#define CRAZY_LINKER_LINE_READER_H
7
8#include <string.h>
9
10#include "crazy_linker_system.h"
11
12namespace crazy {
13
14// A class used to read text files line-by-line.
15// Usage:
16//    LineReader reader("/path/to/file");
17//    while (reader.GetNextLine()) {
18//       const char* line = reader.line();
19//       size_t line_len = reader.length();
20//       ... line is not necessarily zero-terminated.
21//    }
22
23class LineReader {
24 public:
25  LineReader();
26  explicit LineReader(const char* path);
27  ~LineReader();
28
29  // Open a new file for testing. Doesn't fail. If there was an error
30  // opening the file, GetNextLine() will simply return false.
31  void Open(const char* file_path);
32
33  // Grab next line. Returns true on success, or false otherwise.
34  bool GetNextLine();
35
36  // Return the start of the current line, this is _not_ zero-terminated
37  // and always contains a final newline (\n).
38  // Only call this after a successful GetNextLine().
39  const char* line() const;
40
41  // Return the line length, this includes the final \n.
42  // Only call this after a successful GetNextLine().
43  size_t length() const;
44
45 private:
46  void Reset();
47
48  FileDescriptor fd_;
49  bool eof_;
50  size_t line_start_;
51  size_t line_len_;
52  size_t buff_size_;
53  size_t buff_capacity_;
54  char* buff_;
55  char buff0_[128];
56};
57
58}  // namespace crazy
59
60#endif  // CRAZY_LINKER_LINE_READER_H
61