static int databuf_shift_data_to_beginning(DataBuf *db) { DATABUF_VALIDATE(db); if (db->flags & DATABUF_FLAG_PRESERVE_HEAD) return -1; if (databuf_beg(db) == NULL) return 1; if (db->offset) { memmove(db->alloc_ptr, databuf_beg(db), db->len); db->offset = 0; } DATABUF_VALIDATE(db); return 1; }
void databuf_print(DataBuf *db, int print_data, char *fmt, ...) { va_list ap; va_start(ap, fmt); if (fmt) { vprintf(fmt, ap); } printf("%salloc_size=%zu alloc_ptr=%p offset=%zu beg=%p len=%zu max_len=%zu flags=[", fmt?" ":"", db->alloc_size, db->alloc_ptr, db->offset, databuf_beg(db), db->len, db->max_len); if (db->flags & DATABUF_FLAG_PRESERVE_HEAD) printf("PRESERVE_HEAD "); if (db->flags & DATABUF_FLAG_STRING) printf("STRING "); printf("]"); if (print_data) { printf(" ["); fwrite(databuf_beg(db), 1, db->len, stdout); printf("]"); } printf("\n"); }
static int readline_buf(auparse_state_t *au) { char *p_newline=NULL; size_t line_len; if (au->cur_buf != NULL) { free(au->cur_buf); au->cur_buf = NULL; } //if (debug) databuf_print(&au->databuf, 1, "readline_buf"); if (au->databuf.len == 0) { // return EOF condition errno = 0; return -2; } if ((p_newline = strnchr(databuf_beg(&au->databuf), '\n', au->databuf.len)) != NULL) { line_len = p_newline - databuf_beg(&au->databuf); /* dup the line */ au->cur_buf = malloc(line_len+1); // +1 for null terminator if (au->cur_buf == NULL) return -1; // return error condition, errno set strncpy(au->cur_buf, databuf_beg(&au->databuf), line_len); au->cur_buf[line_len] = 0; if (databuf_advance(&au->databuf, line_len+1) < 0) return -1; // return success errno = 0; return 1; } else { // return no data available errno = 0; return 0; } }
int databuf_compress(DataBuf *db) { void *new_alloc; DATABUF_VALIDATE(db); if (databuf_beg(db) == NULL || db->len == 0) return 0; databuf_shift_data_to_beginning(db); if ((new_alloc = realloc(db->alloc_ptr, db->len))) { db->alloc_ptr = new_alloc; db->alloc_size = db->len; } else { return -1; /* realloc failed */ } DATABUF_VALIDATE(db); return 1; }