size_t RDRingBuffer::write(char *src,size_t cnt) { size_t free_cnt; size_t cnt2; size_t to_write; size_t n1, n2; if ((free_cnt = writeSpace()) == 0) { return 0; } to_write = cnt > free_cnt ? free_cnt : cnt; cnt2 = rb->write_ptr + to_write; if (cnt2 > rb->size) { n1 = rb->size - rb->write_ptr; n2 = cnt2 & rb->size_mask; } else { n1 = to_write; n2 = 0; } memcpy (&(rb->buf[rb->write_ptr]), src, n1); rb->write_ptr += n1; rb->write_ptr &= rb->size_mask; if (n2) { memcpy (&(rb->buf[rb->write_ptr]), src + n1, n2); rb->write_ptr += n2; rb->write_ptr &= rb->size_mask; } return to_write; }
void TextWriter::writeNodeKids(const Node* Nd, bool EmbeddedInParent) { // Write out with number of kids specified to be on same line, // with remaining kids on separate (indented) lines. int Type = int(Nd->getType()); int Count = 0; int KidsSameLine = KidCountSameLine[int(Type)]; int NumKids = Nd->getNumKids(); if (NumKids <= MaxKidCountSameLine[int(Type)]) KidsSameLine = MaxKidCountSameLine[int(Type)]; Node* LastKid = Nd->getLastKid(); int HasHiddenSeq = HasHiddenSeqSet.count(Type); bool ForceNewline = false; for (auto* Kid : *Nd) { if (HasHiddenSeq && Kid == LastKid && isa<SequenceNode>(LastKid)) { writeNewline(); writeNode(Kid, true, HasHiddenSeq); return; } ++Count; if (ForceNewline) { writeNode(Kid, true); continue; } if (NeverSameLine.count(Kid->getType())) { if (!(Count == 1 && EmbeddedInParent)) writeNewline(); ForceNewline = true; writeNode(Kid, true); continue; } if (Count < KidsSameLine) { writeSpace(); writeNode(Kid, false); continue; } if (Count == KidsSameLine) { writeSpace(); ForceNewline = Count < NumKids; writeNode(Kid, ForceNewline); continue; } ForceNewline = true; writeNode(Kid, true); } }
void TextWriter::writeNodeKidsAbbrev(const Node* Nd, bool EmbeddedInParent) { // Write out with number of kids specified to be on same line, // with remaining kids on separate (indented) lines. int Type = int(Nd->getType()); int Count = 0; int KidsSameLine = KidCountSameLine[int(Type)]; int NumKids = Nd->getNumKids(); if (NumKids <= MaxKidCountSameLine[int(Type)]) KidsSameLine = MaxKidCountSameLine[int(Type)]; Node* LastKid = Nd->getLastKid(); int HasHiddenSeq = HasHiddenSeqSet.count(Type); for (auto* Kid : *Nd) { if (HasHiddenSeq && Kid == LastKid && isa<SequenceNode>(Kid)) { fprintf(File, " ...[%d]", Kid->getNumKids()); return; } if (NeverSameLine.count(Kid->getType())) { fprintf(File, " ...[%d]", NumKids - Count); return; } ++Count; if (Count < KidsSameLine) { writeSpace(); writeNodeAbbrev(Kid, false); continue; } if (Count == KidsSameLine) { writeSpace(); writeNode(Kid, false); if (Kid != LastKid) fprintf(File, " ...[%d]", NumKids - Count); return; } if (Count == 1 && EmbeddedInParent) { fprintf(File, " ...[%d]", NumKids); return; } writeSpace(); writeNode(Kid, false); if (Kid != LastKid) fprintf(File, " ...[%d]", NumKids - Count); return; } }
static void _hReceiverTest() { static const char* const info[6][2] PROGMEM = { { strLeft, strRight }, { strForward, strBack }, { strRight, strLeft }, { strIdle, strFull }, { strOff, strOn }, { strOff, strOn }, }; for (uint8_t i = 0; i < 6; i++) { if (RX_good & _BV(i)) { writeValue(i, 66, RX[i], 4, -1); lcdSetPos(i, 96); if (i == THR) { if (State.ThrottleOff) writePadded_P(strIdle, 5); else if (RX[THR] >= RX_THRESHOLD) writePadded_P(strFull, 5); else writeSpace(5); } else { if (abs(RX[i]) > (RX_THRESHOLD / 2)) writePadded_P((PGM_P)pgm_read_word(&info[i][RX[i] > 0]), 5); else writeSpace(5); } } else { lcdSetPos(i, 66); lcdWriteString_P(strNoSignal); } } }
inline size_t SingleRWRingBuffer :: write(const char * src, size_t sz) { size_t space = writeSpace(); sz = sz > space ? space : sz; if (sz == 0) return 0; size_t w = mWrite; size_t end = w + sz; if (end < mSize) { memcpy(mData+w, src, sz); } else { size_t split = mSize-w; end &= mWrap; memcpy(mData+w, src, split); memcpy(mData, src+split, end); } mWrite = end; return sz; }
static void writePadded_P(const char *s, uint8_t len) { lcdWriteString_P(s); writeSpace(len - strlen_P(s)); }
static void writePadded(char *s, uint8_t len) { lcdWriteString(s); writeSpace(len - strlen(s)); }