1/*
2 * Copyright 2013-present 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#pragma once
18
19#include <cstddef>
20
21#include <boost/noncopyable.hpp>
22
23#include <folly/Range.h>
24
25namespace folly {
26namespace symbolizer {
27
28/**
29 * Async-signal-safe line reader.
30 */
31class 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} // namespace symbolizer
88} // namespace folly
89