Codemod: use #include angle brackets in folly and thrift
[folly.git] / folly / experimental / symbolizer / LineReader.h
1 /*
2  * Copyright 2014 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef FOLLY_SYMBOLIZER_LINEREADER_H_
18 #define FOLLY_SYMBOLIZER_LINEREADER_H_
19
20 #include <cstddef>
21
22 #include <boost/noncopyable.hpp>
23
24 #include <folly/Range.h>
25
26 namespace folly { namespace symbolizer {
27
28 /**
29  * Async-signal-safe line reader.
30  */
31 class LineReader : private boost::noncopyable {
32  public:
33   /**
34    * Create a line reader that reads into a user-provided buffer (of size
35    * bufSize).
36    */
37   LineReader(int fd, char* buf, size_t bufSize);
38
39   enum State {
40     kReading,
41     kEof,
42     kError
43   };
44   /**
45    * Read the next line from the file.
46    *
47    * If the line is at most bufSize characters long, including the trailing
48    * newline, it will be returned (including the trailing newline).
49    *
50    * If the line is longer than bufSize, we return the first bufSize bytes
51    * (which won't include a trailing newline) and then continue from that
52    * point onwards.
53    *
54    * The lines returned are not null-terminated.
55    *
56    * Returns kReading with a valid line, kEof if at end of file, or kError
57    * if a read error was encountered.
58    *
59    * Example:
60    *   bufSize = 10
61    *   input has "hello world\n"
62    *   The first call returns "hello worl"
63    *   The second call returns "d\n"
64    */
65   State readLine(StringPiece& line);
66
67  private:
68   int const fd_;
69   char* const buf_;
70   char* const bufEnd_;
71
72   // buf_ <= bol_ <= eol_ <= end_ <= bufEnd_
73   //
74   // [buf_, end_): current buffer contents (read from file)
75   //
76   // [buf_, bol_): free (already processed, can be discarded)
77   // [bol_, eol_): current line, including \n if it exists, eol_ points
78   //               1 character past the \n
79   // [eol_, end_): read, unprocessed
80   // [end_, bufEnd_): free
81
82   char* bol_;
83   char* eol_;
84   char* end_;
85   State state_;
86 };
87
88 }}  // namespaces
89
90 #endif /* FOLLY_SYMBOLIZER_LINEREADER_H_ */
91