/* * __wt_getline -- * Get a line from a stream. * * Implementation of the POSIX getline or BSD fgetln functions (finding the * function in a portable way is hard, it's simple enough to write it instead). * * Note: Unlike the standard getline calls, this function doesn't include the * trailing newline character in the returned buffer and discards empty lines * (so the caller's EOF marker is a returned line length of 0). */ int __wt_getline(WT_SESSION_IMPL *session, WT_ITEM *buf, FILE *fp) { int c; /* * We always NUL-terminate the returned string (even if it's empty), * make sure there's buffer space for a trailing NUL in all cases. */ WT_RET(__wt_buf_init(session, buf, 100)); while ((c = fgetc(fp)) != EOF) { /* Leave space for a trailing NUL. */ WT_RET(__wt_buf_extend(session, buf, buf->size + 2)); if (c == '\n') { if (buf->size == 0) continue; break; } ((char *)buf->mem)[buf->size++] = (char)c; } if (c == EOF && ferror(fp)) WT_RET_MSG(session, __wt_errno(), "file read"); ((char *)buf->mem)[buf->size] = '\0'; return (0); }
/* * __fstream_printf -- * ANSI C vfprintf. */ static int __fstream_printf( WT_SESSION_IMPL *session, WT_FSTREAM *fstr, const char *fmt, va_list ap) { WT_ITEM *buf; va_list ap_copy; size_t len, space; char *p; buf = &fstr->buf; for (;;) { va_copy(ap_copy, ap); p = (char *)((uint8_t *)buf->mem + buf->size); WT_ASSERT(session, buf->memsize >= buf->size); space = buf->memsize - buf->size; len = (size_t)vsnprintf(p, space, fmt, ap_copy); va_end(ap_copy); if (len < space) { buf->size += len; return (buf->size >= WT_STREAM_BUFSIZE ? __wt_fflush(session, fstr) : 0); } WT_RET(__wt_buf_extend(session, buf, buf->size + len + 1)); } }
/* * __fstream_getline -- * Get a line from a stream. * * Implementation of the POSIX getline or BSD fgetln functions (finding the * function in a portable way is hard, it's simple enough to write it instead). * * Note: Unlike the standard getline calls, this function doesn't include the * trailing newline character in the returned buffer and discards empty lines * (so the caller's EOF marker is a returned line length of 0). */ static int __fstream_getline(WT_SESSION_IMPL *session, WT_FSTREAM *fstr, WT_ITEM *buf) { const char *p; size_t len; char c; /* * We always NUL-terminate the returned string (even if it's empty), * make sure there's buffer space for a trailing NUL in all cases. */ WT_RET(__wt_buf_init(session, buf, 100)); for (;;) { /* Check if we need to refill the buffer. */ if (WT_PTRDIFF(fstr->buf.data, fstr->buf.mem) >= fstr->buf.size) { len = WT_MIN(WT_STREAM_BUFSIZE, (size_t)(fstr->size - fstr->off)); if (len == 0) break; /* EOF */ WT_RET(__wt_buf_initsize(session, &fstr->buf, len)); WT_RET(__wt_read( session, fstr->fh, fstr->off, len, fstr->buf.mem)); fstr->off += (wt_off_t)len; } c = *(p = fstr->buf.data); fstr->buf.data = ++p; /* Leave space for a trailing NUL. */ WT_RET(__wt_buf_extend(session, buf, buf->size + 2)); if (c == '\n') { if (buf->size == 0) continue; break; } ((char *)buf->mem)[buf->size++] = c; } ((char *)buf->mem)[buf->size] = '\0'; return (0); }
int __wt_logop_col_put_pack( WT_SESSION_IMPL *session, WT_ITEM *logrec, uint32_t fileid, uint64_t recno, WT_ITEM *value) { const char *fmt = WT_UNCHECKED_STRING(IIIru); size_t size; uint32_t optype, recsize; optype = WT_LOGOP_COL_PUT; WT_RET(__wt_struct_size(session, &size, fmt, optype, 0, fileid, recno, value)); __wt_struct_size_adjust(session, &size); WT_RET(__wt_buf_extend(session, logrec, logrec->size + size)); recsize = (uint32_t)size; WT_RET(__wt_struct_pack(session, (uint8_t *)logrec->data + logrec->size, size, fmt, optype, recsize, fileid, recno, value)); logrec->size += (uint32_t)size; return (0); }
int __wt_logop_row_truncate_pack( WT_SESSION_IMPL *session, WT_ITEM *logrec, uint32_t fileid, WT_ITEM *start, WT_ITEM *stop, uint32_t mode) { const char *fmt = WT_UNCHECKED_STRING(IIIuuI); size_t size; uint32_t optype, recsize; optype = WT_LOGOP_ROW_TRUNCATE; WT_RET(__wt_struct_size(session, &size, fmt, optype, 0, fileid, start, stop, mode)); __wt_struct_size_adjust(session, &size); WT_RET(__wt_buf_extend(session, logrec, logrec->size + size)); recsize = (uint32_t)size; WT_RET(__wt_struct_pack(session, (uint8_t *)logrec->data + logrec->size, size, fmt, optype, recsize, fileid, start, stop, mode)); logrec->size += (uint32_t)size; return (0); }