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