1. Си / Говнокод #17270

    +139

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 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 вручную собирай @ на кавычкай падай. Никакого АПИ, только хардкор.

    Запостил: codemonkey, 07 Декабря 2014

    Комментарии (23) RSS

    • > _2K
      Все числа из кода надо выносить в константы? :)
      Ответить
    • P.S. Когда мне на сях надо было поклеить большую портянку (не XML), я запилил себе простенький StringBuilder. Полчаса работы, зато потом набивать в него текст - одно удовольствие.
      Ответить
      • man open_memstream - велосипед уже давно изобретен. (но вроде вижуал с его все еще не умеет.)
        Ответить
      • А GLib с GString - не айс?
        Ответить
    • плюсанул чисто на malloc() и пачки strlen()ов. по моему опыту излишне. всегда есть какой-то лимит на размер.

      и даже если надо динамически, strlen()ы не нужны: валиш все в один snprintf() и проверяешь результат. если было переполнение, выделяшь буфер больше и пробуешь еще раз.

      ну линухе, все это заменяется одним вызовом `asprintf`.
      Ответить
      • man 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.

        Ага.
        Ответить
        • Там в мане еще пишут, что snprintf из libc4 игнорил аргумент с длиной буфера, и работал тупо как sprintf. Вот это я понимаю решето.
          Ответить
      • > strlen()ы не нужны: валиш все в один snprintf()
        Удачных ветвлений и циклов.
        Ответить
        • в ГК нет ветвлений и циклов.

          ёжику понятно что не универсально.

          я просто пытался подчеркнуть насколько гротескно излишен ГК.
          Ответить
          • > в ГК нет ветвлений и циклов.
            Да ну? А в строках 25-35 мы что видим? :)
            Ответить
            • говно, которое скорее всего там не нужно. а если и нужно, то делается проще и лучше.

              по коду там может быть что description либо просто строка (когда additional_data == NULL) либо формат с "%s" (когда additional_data != NULL). что само по себе заслуживает мини-ГК.
              Ответить
          • Вы понятия не имеете насколько весь .с файл, из которого я поднял сей ГК, нагружен всякими говновелосипедами. Это просто GBPLTW.
            Ответить
    • Этот код явно подвержен проблеме 2K.
      Ответить
    • Зато без тяжёлых фрейммворрковв!!!
      Ответить

    Добавить комментарий