int attribute_hidden R_TextBufferInit(TextBuffer *txtb, SEXP text) { int i, k, l, n; if (isString(text)) { n = length(text); l = 0; for (i = 0; i < n; i++) { if (STRING_ELT(text, i) != R_NilValue) { k = (int) strlen(translateChar(STRING_ELT(text, i))); if (k > l) l = k; } } txtb->vmax = vmaxget(); txtb->buf = (unsigned char *)R_alloc(l+2, sizeof(char)); /* '\n' and '\0' */ txtb->bufp = txtb->buf; txtb->text = text; txtb->ntext = n; txtb->offset = 0; transferChars(txtb->buf, translateChar(STRING_ELT(txtb->text, txtb->offset))); txtb->offset++; return 1; } else { txtb->vmax = vmaxget(); txtb->buf = NULL; txtb->bufp = NULL; txtb->text = R_NilValue; txtb->ntext = 0; txtb->offset = 1; return 0; } }
int attribute_hidden R_TextBufferGetc(TextBuffer *txtb) { if (txtb->buf == NULL) return EOF; if (*(txtb->bufp) == '\0') { if (txtb->offset == txtb->ntext) { txtb->buf = NULL; return EOF; } else { transferChars(txtb->buf, translateChar(STRING_ELT(txtb->text, txtb->offset))); txtb->bufp = txtb->buf; txtb->offset++; } } return *txtb->bufp++; }
int attribute_hidden R_TextBufferGetc(TextBuffer *txtb) { if (txtb->buf == nullptr) return EOF; if (*(txtb->bufp) == '\0') { if (txtb->offset == txtb->ntext) { txtb->buf = nullptr; return EOF; } else { const void *vmax = vmaxget(); transferChars(txtb->buf, translateChar(STRING_ELT(txtb->text, txtb->offset))); txtb->bufp = txtb->buf; txtb->offset++; vmaxset(vmax); } } return *txtb->bufp++; }
int attribute_hidden R_TextBufferInit(TextBuffer *txtb, SEXP text) { int i, k, l, n; if (isString(text)) { // translateChar might allocate void *vmax = vmaxget(); n = length(text); l = 0; for (i = 0; i < n; i++) { if (STRING_ELT(text, i) != R_NilValue) { k = int( strlen(translateChar(STRING_ELT(text, i)))); if (k > l) l = k; } } vmaxset(vmax); txtb->vmax = vmax; txtb->buf = static_cast<unsigned char *>(RHO_alloc(l+2, sizeof(char))); /* '\n' and '\0' */ txtb->bufp = txtb->buf; txtb->text = text; txtb->ntext = n; txtb->offset = 0; transferChars(txtb->buf, translateChar(STRING_ELT(txtb->text, txtb->offset))); txtb->offset++; return 1; } else { txtb->vmax = vmaxget(); txtb->buf = nullptr; txtb->bufp = nullptr; txtb->text = R_NilValue; txtb->ntext = 0; txtb->offset = 1; return 0; } }