- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
char* xml_compose_simple_response(char* response, int code, char* description, char* additional_data)
{
size_t resp_length = 0;
char* buff = NULL;
resp_length += strlen(RESPONSE_HEADER_PREFIX);
resp_length += strlen(session_type);
resp_length += strlen(transaction_id);
resp_length += strlen(response) + strlen(EMPTY_TAG);
if(NULL != additional_data)
{
resp_length += strlen(additional_data);
}
resp_length += strlen(description) + strlen(RESULT_INT) + sizeof(int) * 8;
resp_length += strlen(RESPONSE_HEADER_SUFFIX);
resp_length += 1;
if(NULL != (buff = malloc(resp_length)))
{
buff[0] = '\0';
sprintf(buff, RESPONSE_HEADER_PREFIX""EMPTY_TAG, session_type, transaction_id, response);
if (additional_data != NULL)
{
char tmp_desc[_2K];
sprintf(tmp_desc, description, additional_data);
sprintf(&buff[strlen(buff)], RESULT_INT, code, tmp_desc);
}
else
{
sprintf(&buff[strlen(buff)], RESULT_INT, code, description);
}
strcat(buff, RESPONSE_HEADER_SUFFIX);
}
else
{
mng_report_memory_failure_location_and_exit();
}
return buff;
}
XML вручную собирай @ на кавычкай падай. Никакого АПИ, только хардкор.
Все числа из кода надо выносить в константы? :)
и даже если надо динамически, strlen()ы не нужны: валиш все в один snprintf() и проверяешь результат. если было переполнение, выделяшь буфер больше и пробуешь еще раз.
ну линухе, все это заменяется одним вызовом `asprintf`.
CONFORMING TO
These functions are GNU extensions, not in C or POSIX. They are also available under *BSD. The FreeBSD imlementation sets strp to NULL on error.
Ага.
Удачных ветвлений и циклов.
ёжику понятно что не универсально.
я просто пытался подчеркнуть насколько гротескно излишен ГК.
Да ну? А в строках 25-35 мы что видим? :)
по коду там может быть что description либо просто строка (когда additional_data == NULL) либо формат с "%s" (когда additional_data != NULL). что само по себе заслуживает мини-ГК.