/* Grow buffer */ int simplebuffer_grow(struct simplebuffer *data, uint32_t len, uint32_t block) { int error = EOK; unsigned char *newbuf = NULL; TRACE_FLOW_ENTRY(); TRACE_INFO_NUMBER("Current length: ", data->length); TRACE_INFO_NUMBER("Current size: ", data->size); TRACE_INFO_NUMBER("Length to have: ", len); TRACE_INFO_NUMBER("Increment length: ", block); /* Grow buffer if needed */ while (data->length + len >= data->size) { newbuf = realloc(data->buffer, data->size + block); if (newbuf == NULL) { TRACE_ERROR_NUMBER("Error. Failed to allocate memory.", ENOMEM); return ENOMEM; } data->buffer = newbuf; data->size += block; TRACE_INFO_NUMBER("New size: ", data->size); } TRACE_INFO_NUMBER("Final size: ", data->size); TRACE_FLOW_RETURN(error); return error; }
static int ref_array_grow(struct ref_array *ra) { int error = EOK; void *newbuf = NULL; TRACE_FLOW_ENTRY(); TRACE_INFO_NUMBER("Current length: ", ra->len); TRACE_INFO_NUMBER("Current size: ", ra->size); /* Grow buffer if needed */ newbuf = realloc(ra->storage, (ra->size + ra->grow_by) * ra->elsize); if (newbuf == NULL) { TRACE_ERROR_NUMBER("Failed to allocate memory.", ENOMEM); return ENOMEM; } ra->storage = newbuf; ra->size += ra->grow_by; TRACE_INFO_NUMBER("Final size: ", ra->size); TRACE_FLOW_RETURN(error); return error; }
/* Finction to add CR to the buffer */ int simplebuffer_add_cr(struct simplebuffer *data) { int error = EOK; char cr[] = ENDLNSTR; TRACE_FLOW_ENTRY(); error = simplebuffer_add_raw(data, (void *)cr, sizeof(ENDLNSTR) - 1, sizeof(ENDLNSTR)); TRACE_FLOW_RETURN(error); return error; }
static int save_error(struct collection_item *el, unsigned line, int inerr, const char *err_txt) { int error = EOK; struct ini_parse_error pe; TRACE_FLOW_ENTRY(); /* Clear the warning bit */ pe.error = inerr; pe.line = line; error = col_add_binary_property(el, NULL, err_txt, &pe, sizeof(pe)); TRACE_FLOW_RETURN(error); return error; }
/* Allocate buffer structure */ int simplebuffer_alloc(struct simplebuffer **data) { int error = EOK; TRACE_FLOW_ENTRY(); if (!data) { TRACE_ERROR_STRING("Invalid argument", ""); error = EINVAL; } else { *data = (struct simplebuffer *)calloc(1, sizeof(struct simplebuffer)); if (*data == NULL) { TRACE_ERROR_STRING("Failed to allocate memory", ""); error = ENOMEM; } else error = EOK; } TRACE_FLOW_RETURN(error); return error; }
/* Function to read next line from the file */ static int parser_save_section(struct parser_obj *po) { int error = EOK; uint32_t mergemode; int merge = 0; TRACE_FLOW_ENTRY(); if (po->sec) { TRACE_INFO_STRING("Section exists.", ""); /* First detect if we have collision */ error = check_section_collision(po); if (error) { TRACE_ERROR_NUMBER("Failed to check for collision", error); return error; } if (po->merge_sec) { TRACE_INFO_STRING("Merge collision detected", ""); mergemode = po->collision_flags & INI_MS_MASK; switch (mergemode) { case INI_MS_ERROR: /* Report error and return */ TRACE_INFO_STRING("Reporting error", "duplicate section"); error = save_error(po->el, po->seclinenum, ERR_DUPSECTION, ERROR_TXT); if (error) { TRACE_ERROR_NUMBER("Failed to " "save error", error); return error; } /* Return error */ TRACE_FLOW_RETURN(EEXIST); return EEXIST; case INI_MS_PRESERVE: /* Delete new section */ TRACE_INFO_STRING("Preserve mode", ""); col_destroy_collection_with_cb( po->sec, ini_cleanup_cb, NULL); po->sec = NULL; break; case INI_MS_OVERWRITE: /* Empty existing section */ TRACE_INFO_STRING("Ovewrite mode", ""); error = empty_section(po->merge_sec); if (error) { TRACE_ERROR_NUMBER("Failed to " "empty section", error); return error; } merge = 1; break; case INI_MS_DETECT: /* Detect mode */ TRACE_INFO_STRING("Detect mode", ""); po->merge_error = EEXIST; error = save_error(po->el, po->seclinenum, ERR_DUPSECTION, ERROR_TXT); if (error) { TRACE_ERROR_NUMBER("Failed to " "save error", error); return error; } merge = 1; break; case INI_MS_MERGE: /* Merge */ default: TRACE_INFO_STRING("Merge mode", ""); merge = 1; break; } if (merge) { error = merge_section(po); if (error) { TRACE_ERROR_NUMBER("Failed to merge section", error); return error; } } po->merge_sec = NULL; } else { /* Add section to configuration */ TRACE_INFO_STRING("Now adding collection", ""); error = col_add_collection_to_collection(po->top, NULL, NULL, po->sec, COL_ADD_MODE_EMBED); if (error) { TRACE_ERROR_NUMBER("Failed to embed section", error); return error; } po->sec = NULL; } } TRACE_FLOW_EXIT(); return EOK; }