android
doc
m4
scripts
src
AudioCompress
android
archive
client
command
config
db
decoder
encoder
event
filter
fs
input
plugins
AsyncInputStream.cxx
AsyncInputStream.hxx
IcyInputStream.cxx
IcyInputStream.hxx
Init.cxx
Init.hxx
InputPlugin.hxx
InputStream.cxx
InputStream.hxx
Open.cxx
ProxyInputStream.cxx
ProxyInputStream.hxx
Registry.cxx
Registry.hxx
TextInputStream.cxx
TextInputStream.hxx
ThreadInputStream.cxx
ThreadInputStream.hxx
java
lib
mixer
neighbor
output
pcm
playlist
protocol
queue
sticker
storage
system
tag
thread
unix
util
win32
zeroconf
AudioConfig.cxx
AudioConfig.hxx
AudioFormat.cxx
AudioFormat.hxx
AudioParser.cxx
AudioParser.hxx
BulkEdit.hxx
CheckAudioFormat.cxx
CheckAudioFormat.hxx
CommandLine.cxx
CommandLine.hxx
Compiler.h
CrossFade.cxx
CrossFade.hxx
DetachedSong.cxx
DetachedSong.hxx
GlobalEvents.cxx
GlobalEvents.hxx
IOThread.cxx
IOThread.hxx
IcyMetaDataParser.cxx
IcyMetaDataParser.hxx
Idle.cxx
Idle.hxx
Instance.cxx
Instance.hxx
Listen.cxx
Listen.hxx
Log.cxx
Log.hxx
LogBackend.cxx
LogBackend.hxx
LogInit.cxx
LogInit.hxx
LogLevel.hxx
LogV.hxx
Main.cxx
Main.hxx
Mapper.cxx
Mapper.hxx
MixRampInfo.hxx
MusicBuffer.cxx
MusicBuffer.hxx
MusicChunk.cxx
MusicChunk.hxx
MusicPipe.cxx
MusicPipe.hxx
Partition.cxx
Partition.hxx
Permission.cxx
Permission.hxx
PlayerControl.cxx
PlayerControl.hxx
PlayerListener.hxx
PlayerThread.cxx
PlayerThread.hxx
PlaylistDatabase.cxx
PlaylistDatabase.hxx
PlaylistError.cxx
PlaylistError.hxx
PlaylistFile.cxx
PlaylistFile.hxx
PlaylistGlobal.cxx
PlaylistGlobal.hxx
PlaylistPrint.cxx
PlaylistPrint.hxx
PlaylistSave.cxx
PlaylistSave.hxx
ReplayGainConfig.cxx
ReplayGainConfig.hxx
ReplayGainInfo.cxx
ReplayGainInfo.hxx
SongFilter.cxx
SongFilter.hxx
SongLoader.cxx
SongLoader.hxx
SongPrint.cxx
SongPrint.hxx
SongSave.cxx
SongSave.hxx
SongUpdate.cxx
StateFile.cxx
StateFile.hxx
Stats.cxx
Stats.hxx
TagFile.cxx
TagFile.hxx
TagPrint.cxx
TagPrint.hxx
TagSave.cxx
TagSave.hxx
TagStream.cxx
TagStream.hxx
TimePrint.cxx
TimePrint.hxx
check.h
ls.cxx
ls.hxx
notify.cxx
notify.hxx
open.h
poison.h
systemd
test
.gitignore
AUTHORS
COPYING
INSTALL
Makefile.am
NEWS
README
autogen.sh
configure.ac
mpd.svg
valgrind.suppressions
87 lines
2.1 KiB
C++
87 lines
2.1 KiB
C++
/*
|
|
* Copyright (C) 2003-2014 The Music Player Daemon Project
|
|
* http://www.musicpd.org
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "TextInputStream.hxx"
|
|
#include "InputStream.hxx"
|
|
#include "util/Error.hxx"
|
|
#include "Log.hxx"
|
|
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
char *
|
|
TextInputStream::ReadBufferedLine()
|
|
{
|
|
auto r = buffer.Read();
|
|
char *newline = reinterpret_cast<char*>(memchr(r.data, '\n', r.size));
|
|
if (newline == nullptr)
|
|
return nullptr;
|
|
|
|
buffer.Consume(newline + 1 - r.data);
|
|
|
|
if (newline > r.data && newline[-1] == '\r')
|
|
--newline;
|
|
*newline = 0;
|
|
return r.data;
|
|
}
|
|
|
|
char *
|
|
TextInputStream::ReadLine()
|
|
{
|
|
char *line = ReadBufferedLine();
|
|
if (line != nullptr)
|
|
return line;
|
|
|
|
while (true) {
|
|
auto dest = buffer.Write();
|
|
if (dest.size < 2) {
|
|
/* end of file (or line too long): terminate
|
|
the current line */
|
|
|
|
assert(!dest.IsEmpty());
|
|
dest[0] = 0;
|
|
line = buffer.Read().data;
|
|
buffer.Clear();
|
|
return line;
|
|
}
|
|
|
|
/* reserve one byte for the null terminator if the
|
|
last line is not terminated by a newline
|
|
character */
|
|
--dest.size;
|
|
|
|
Error error;
|
|
size_t nbytes = is.LockRead(dest.data, dest.size, error);
|
|
if (nbytes > 0)
|
|
buffer.Append(nbytes);
|
|
else if (error.IsDefined()) {
|
|
LogError(error);
|
|
return nullptr;
|
|
}
|
|
|
|
line = ReadBufferedLine();
|
|
if (line != nullptr)
|
|
return line;
|
|
|
|
if (nbytes == 0)
|
|
return nullptr;
|
|
}
|
|
}
|