size_t RDRingBuffer::read(char *dest,size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_read; size_t n1, n2; if ((free_cnt = readSpace()) == 0) { return 0; } to_read = cnt > free_cnt ? free_cnt : cnt; cnt2 = rb->read_ptr + to_read; if (cnt2 > rb->size) { n1 = rb->size - rb->read_ptr; n2 = cnt2 & rb->size_mask; } else { n1 = to_read; n2 = 0; } memcpy (dest, &(rb->buf[rb->read_ptr]), n1); rb->read_ptr += n1; rb->read_ptr &= rb->size_mask; if (n2) { memcpy (dest + n1, &(rb->buf[rb->read_ptr]), n2); rb->read_ptr += n2; rb->read_ptr &= rb->size_mask; } return to_read; }
void BaseHTMLParser::readUntilEndTag(const std::string& tag_name) { // [42] ETag ::= '</' Name S? '>' bool found = false; std::string tmp; std::string lower_tagname = tag_name; to_lower(lower_tagname); while (not found ) { readUntilDelimiterMark("</"); tmp = std::string(text.current, tag_name.size()); if (to_lower(tmp) != lower_tagname) { // This is not the tag we are looking for... // Keep looking... continue; } text += tag_name.size(); readSpace(); if (*text != '>'){ std::string msg = "While looking for the EndTag for " +\ tag_name; throw ParserEOFError(msg); } consumeToken(std::string(">")); // Yeah! The EndTag was found. We are done found = true; } }
inline size_t SingleRWRingBuffer :: peek(char * dst, size_t sz) { size_t space = readSpace(); sz = sz > space ? space : sz; if (sz == 0) return 0; size_t r = mRead; size_t end = r + sz; if (end < mSize) { memcpy(dst, mData+r, sz); } else { size_t split = mSize-r; end &= mWrap; memcpy(dst, mData+r, split); memcpy(dst+split, mData, end); } return sz; }
void* CDVRPTRV3Controller::Entry() { wxLogMessage(wxT("Starting DV-RPTR3 Modem Controller thread")); // Clock every 5ms-ish CTimer pollTimer(200U, 0U, 250U); pollTimer.start(); unsigned int space = 0U; while (!m_stopped) { // Poll the modem status every 250ms if (pollTimer.hasExpired()) { bool ret = readSpace(); if (!ret) { ret = findModem(); if (!ret) { wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); return NULL; } } pollTimer.start(); } unsigned int length; RESP_TYPE_V3 type = getResponse(m_buffer, length); switch (type) { case RT3_TIMEOUT: break; case RT3_ERROR: { bool ret = findModem(); if (!ret) { wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); return NULL; } } break; case RT3_HEADER: { // CUtils::dump(wxT("RT3_HEADER"), m_buffer, length); wxMutexLocker locker(m_mutex); unsigned char data[2U]; data[0U] = DSMTT_HEADER; data[1U] = RADIO_HEADER_LENGTH_BYTES; m_rxData.addData(data, 2U); m_rxData.addData(m_buffer + 9U, RADIO_HEADER_LENGTH_BYTES - 2U); // Dummy checksum data[0U] = 0xFFU; data[1U] = 0xFFU; m_rxData.addData(data, 2U); data[0U] = DSMTT_DATA; data[1U] = DV_FRAME_LENGTH_BYTES; m_rxData.addData(data, 2U); m_rxData.addData(m_buffer + 51U, DV_FRAME_LENGTH_BYTES); m_rx = true; } break; case RT3_DATA: { // CUtils::dump(wxT("RT3_DATA"), m_buffer, length); wxMutexLocker locker(m_mutex); unsigned char data[2U]; data[0U] = DSMTT_DATA; data[1U] = DV_FRAME_LENGTH_BYTES; m_rxData.addData(data, 2U); m_rxData.addData(m_buffer + 5U, DV_FRAME_LENGTH_BYTES); m_rx = true; // End of transmission? bool end = (m_buffer[19U] & 0x40U) == 0x40U; if (end) { data[0U] = DSMTT_EOT; data[1U] = 0U; m_rxData.addData(data, 2U); m_rx = false; } } break; case RT3_SPACE: space = m_buffer[9U]; // CUtils::dump(wxT("RT3_SPACE"), m_buffer, length); break; // These should not be received in this loop, but don't complain if we do case RT3_QUERY: case RT3_CONFIG: break; default: wxLogMessage(wxT("Unknown DV-RPTR3 message, type")); CUtils::dump(wxT("Buffer dump"), m_buffer, length); break; } if (space > 0U) { if (m_txData.hasData()) { unsigned char len = 0U; unsigned char data[200U]; { wxMutexLocker locker(m_mutex); m_txData.getData(&len, 1U); m_txData.getData(data, len); } // CUtils::dump(wxT("Write"), data, len); bool ret = writeModem(data, len); if (!ret) { bool ret = findModem(); if (!ret) { wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); return NULL; } } else { space--; } } } Sleep(5UL); pollTimer.clock(); } wxLogMessage(wxT("Stopping DV-RPTR3 Modem Controller thread")); closeModem(); return NULL; }