/* Unfold the value represented by the array */ static int value_unfold(struct ref_array *raw_lines, struct ref_array *raw_lengths, struct simplebuffer **unfolded) { int error; struct simplebuffer *oneline = NULL; uint32_t len = 0; char *ptr = NULL; uint32_t i = 0; char *part = NULL; TRACE_FLOW_ENTRY(); error = simplebuffer_alloc(&oneline); if (error) { TRACE_ERROR_NUMBER("Failed to allocate dynamic string.", error); return error; } for (;;) { /* Get line */ ptr = ref_array_get(raw_lines, i, NULL); if (ptr) { /* Get its length */ ref_array_get(raw_lengths, i, (void *)&len); part = *((char **)(ptr)); TRACE_INFO_STRING("Value:", part); TRACE_INFO_NUMBER("Lenght:", len); error = simplebuffer_add_raw(oneline, part, len, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add string", error); simplebuffer_free(oneline); return error; } i++; } else break; } *unfolded = oneline; TRACE_FLOW_EXIT(); 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; }
/* Serialize value */ int value_serialize(struct value_obj *vo, const char *key, struct simplebuffer *sbobj) { int error = EOK; uint32_t num = 0; uint32_t i = 0; uint32_t len = 0; char *commentline = NULL; char *ptr = NULL; char *part = NULL; int sec = 0; uint32_t vln = 0; TRACE_FLOW_ENTRY(); TRACE_INFO_STRING("Serializing key:", key); if (!vo) { TRACE_ERROR_NUMBER("Invalid input parameter", EINVAL); return EINVAL; } /* Put comment first */ if (vo->ic) { /* Get number of lines in the comment */ error = ini_comment_get_numlines(vo->ic, &num); if (error) { TRACE_ERROR_NUMBER("Failed to get number of lines", errno); return error; } for (i = 0; i < num; i++) { len = 0; commentline = NULL; error = ini_comment_get_line(vo->ic, i, &commentline, &len); if (error) { TRACE_ERROR_NUMBER("Failed to get number of lines", errno); return error; } error = simplebuffer_add_raw(sbobj, commentline, len, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add comment", error); return error; } error = simplebuffer_add_cr(sbobj); if (error) { TRACE_ERROR_NUMBER("Failed to add CR", error); return error; } } } if (strncmp(key, INI_SPECIAL_KEY, sizeof(INI_SPECIAL_KEY)) == 0) { /* Special key carries only a comment */ TRACE_FLOW_EXIT(); return EOK; } /* Handle the case it is a section key */ if (strncmp(key, INI_SECTION_KEY, sizeof(INI_SECTION_KEY)) == 0) sec = 1; if (sec) { error = simplebuffer_add_str(sbobj, INI_OPEN_BR, sizeof(INI_OPEN_BR) - 1, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add opening section bracket", error); return error; } } else { error = simplebuffer_add_str(sbobj, key, vo->keylen, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add key", error); return error; } error = simplebuffer_add_str(sbobj, INI_EQUAL_SIGN, sizeof(INI_EQUAL_SIGN) - 1, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add equal sign", error); return error; } } if (vo->raw_lines) { vln = ref_array_len(vo->raw_lines); TRACE_INFO_NUMBER("Number of lines:", vln); #ifdef HAVE_TRACE extern void ref_array_debug(struct ref_array *ra, int num); ref_array_debug(vo->raw_lines, 0); ref_array_debug(vo->raw_lengths, 1); #endif for (i = 0; i < vln; i++) { /* Get line */ ptr = ref_array_get(vo->raw_lines, i, NULL); if (ptr) { /* Get its length */ len = 0; ref_array_get(vo->raw_lengths, i, (void *)&len); part = *((char **)(ptr)); TRACE_INFO_STRING("Value:", part); TRACE_INFO_NUMBER("Lenght:", len); error = simplebuffer_add_raw(sbobj, part, len, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add value", error); return error; } } if (!sec) { error = simplebuffer_add_cr(sbobj); if (error) { TRACE_ERROR_NUMBER("Failed to add CR", error); return error; } } } if ((!vln) && (!sec)) { error = simplebuffer_add_cr(sbobj); if (error) { TRACE_ERROR_NUMBER("Failed to add CR", error); return error; } } } if (sec) { error = simplebuffer_add_str(sbobj, INI_CLOSE_BR, sizeof(INI_CLOSE_BR) - 1, INI_VALUE_BLOCK); if (error) { TRACE_ERROR_NUMBER("Failed to add closing bracket", error); return error; } error = simplebuffer_add_cr(sbobj); if (error) { TRACE_ERROR_NUMBER("Failed to add CR", error); return error; } } TRACE_INFO_STRING("Buffer:", (const char *)simplebuffer_get_buf(sbobj)); TRACE_FLOW_EXIT(); return error; }