void TCPSocket::Getline(char *buffer, size_t bufferSize, bool stripCRLF) { if (!bufferSize) return; size_t bufferLen = 0; char ch; do { ch = GetcharBuffered(); if (!stripCRLF || (ch != '\r' && ch != '\n')) { *buffer = ch; ++buffer; ++bufferLen; } } while (ch != '\n' && bufferLen < bufferSize - 1); *buffer = '\0'; if (ch != '\n') throw BufferSizeExceeded(); }
bool WebAppInputLine::InputLine(C4P_text& f, C4P_boolean bypassEndOfLine) const { f.AssertValid(); if (AmI("xetex")) { MIKTEX_UNEXPECTED(); } #if defined(PASCAL_TEXT_IO) MIKTEX_UNEXPECTED(); #endif if (feof(f) != 0) { return false; } IInputOutput* inputOutput = GetInputOutput(); const C4P_signed32 first = inputOutput->first(); C4P_signed32& last = inputOutput->last(); const C4P_signed32 bufsize = inputOutput->bufsize(); const char* xord = nullptr; #if defined(WITH_OMEGA) if (!AmI("omega")) #endif { xord = GetCharacterConverter()->xord(); } char *buffer = nullptr; #if defined(WITH_OMEGA) char16_t* buffer16 = nullptr; if (AmI("omega")) { buffer16 = inputOutput->buffer16(); } else #endif { buffer = inputOutput->buffer(); } last = first; int ch = GetCharacter(f); if (ch == EOF) { return false; } if (ch == '\r') { ch = GetCharacter(f); if (ch == EOF) { return false; } if (ch != '\n') { ungetc(ch, f); ch = '\n'; } } if (ch == '\n') { return true; } #if defined(WITH_OMEGA) if (AmI("omega")) { buffer16[last] = ch; } else #endif { buffer[last] = xord[ch & 0xff]; } last += 1; while ((ch = GetCharacter(f)) != EOF && last < bufsize) { if (ch == '\r') { ch = GetCharacter(f); if (ch == EOF) { break; } if (ch != '\n') { ungetc(ch, f); ch = '\n'; } } if (ch == '\n') { break; } #if defined(WITH_OMEGA) if (AmI("omega")) { buffer16[last] = ch; } else #endif { buffer[last] = xord[ch & 0xff]; } last += 1; } if (ch != '\n' && ch != EOF) { BufferSizeExceeded(); } if (!AmI("bibtex") && last >= inputOutput->maxbufstack()) { inputOutput->maxbufstack() = last + 1; if (inputOutput->maxbufstack() >= bufsize) { BufferSizeExceeded(); } } #if defined(WITH_OMEGA) if (AmI("omega")) { while (last > first && (buffer16[last - 1] == u' ' || buffer16[last - 1] == u'\r')) { last -= 1; } } else #endif { while (last > first && (buffer[last - 1] == ' ' || buffer[last - 1] == '\r')) { last -= 1; } } return true; }