| 1866 | }; |
| 1867 | |
| 1868 | class BufferedFileInputStreamReader : public InputStreamReader { |
| 1869 | private: |
| 1870 | static const size_t BUFFER_SIZE; |
| 1871 | static const size_t MAX_UNREAD_COUNT; |
| 1872 | |
| 1873 | std::FILE *file; |
| 1874 | std::string name; |
| 1875 | int line; |
| 1876 | |
| 1877 | char *buffer; |
| 1878 | bool *isEof; |
| 1879 | int bufferPos; |
| 1880 | size_t bufferSize; |
| 1881 | |
| 1882 | bool refill() { |
| 1883 | if (NULL == file) |
| 1884 | __testlib_fail("BufferedFileInputStreamReader: file == NULL (" + getName() + ")"); |
| 1885 | |
| 1886 | if (bufferPos >= int(bufferSize)) { |
| 1887 | size_t readSize = fread( |
| 1888 | buffer + MAX_UNREAD_COUNT, |
| 1889 | 1, |
| 1890 | BUFFER_SIZE - MAX_UNREAD_COUNT, |
| 1891 | file |
| 1892 | ); |
| 1893 | |
| 1894 | if (readSize < BUFFER_SIZE - MAX_UNREAD_COUNT |
| 1895 | && ferror(file)) |
| 1896 | __testlib_fail("BufferedFileInputStreamReader: unable to read (" + getName() + ")"); |
| 1897 | |
| 1898 | bufferSize = MAX_UNREAD_COUNT + readSize; |
| 1899 | bufferPos = int(MAX_UNREAD_COUNT); |
| 1900 | std::memset(isEof + MAX_UNREAD_COUNT, 0, sizeof(isEof[0]) * readSize); |
| 1901 | |
| 1902 | return readSize > 0; |
| 1903 | } else |
| 1904 | return true; |
| 1905 | } |
| 1906 | |
| 1907 | char increment() { |
| 1908 | char c; |
| 1909 | if ((c = buffer[bufferPos++]) == LF) |
| 1910 | line++; |
| 1911 | return c; |
| 1912 | } |
| 1913 | |
| 1914 | public: |
| 1915 | BufferedFileInputStreamReader(std::FILE *file, const std::string &name) : file(file), name(name), line(1) { |
| 1916 | buffer = new char[BUFFER_SIZE]; |
| 1917 | isEof = new bool[BUFFER_SIZE]; |
| 1918 | bufferSize = MAX_UNREAD_COUNT; |
| 1919 | bufferPos = int(MAX_UNREAD_COUNT); |
| 1920 | } |
| 1921 | |
| 1922 | ~BufferedFileInputStreamReader() { |
| 1923 | if (NULL != buffer) { |
| 1924 | delete[] buffer; |
| 1925 | buffer = NULL; |
nothing calls this directly
no outgoing calls
no test coverage detected