/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef INCIDENT_HELPER_UTIL_H #define INCIDENT_HELPER_UTIL_H #include #include #include typedef std::vector header_t; typedef std::vector record_t; typedef std::string (*trans_func) (const std::string&); const char DEFAULT_NEWLINE = '\n'; const std::string DEFAULT_WHITESPACE = " \t"; /** * When a text has a table format like this * line 1: HeadA HeadB HeadC * line 2: v1 v2 v3 * line 3: v11 v12 v13 * * We want to parse the line in structure given the delimiter. * parseHeader is used to parse the firse line of the table and returns a list of strings in lower case * parseRecord is used to parse other lines and returns a list of strings * empty strings are skipped */ header_t parseHeader(const std::string& line, const std::string& delimiters = DEFAULT_WHITESPACE); record_t parseRecord(const std::string& line, const std::string& delimiters = DEFAULT_WHITESPACE); /** * When the line starts with the given key, the function returns true * as well as the line argument is changed to the rest part of the original. * e.g. "ZRAM: 6828K physical used for 31076K in swap (524284K total swap)" becomes * "6828K physical used for 31076K in swap (524284K total swap)" when given key "ZRAM:", * otherwise the line is not changed. */ bool hasPrefix(std::string* line, const char* key); /** * Reader class reads data from given fd in streaming fashion. * The buffer size is controlled by capacity parameter. */ class Reader { public: Reader(const int fd); Reader(const int fd, const size_t capacity); ~Reader(); bool readLine(std::string* line, const char newline = DEFAULT_NEWLINE); bool ok(std::string* error); private: int mFd; // set mFd to -1 when read EOF() const size_t mMaxSize; size_t mBufSize; char* mBuf; // implements a circular buffer int mRead; int mFlushed; std::string mStatus; // end of read inline bool EOR() { return mFd == -1 && mBufSize == 0; }; }; #endif // INCIDENT_HELPER_UTIL_H