Выделено:viewtopic.php?p=32457#p32457
> -- Сергей Губанов писал(а):
> Return из середины процедуры, кстати, тоже всегда может (и должен) быть преобразован в цепочку ЕСЛИ-ИНАЧЕ-ЕСЛИ.Сегодня на работе отрефакторил две процедуры говнокода (каждая была по несколько сотен строк и насыщенна под завязку return-ами из середины)....

Интересно, как бы преобразовал следующий код (break-ов нет, но есть goto - идея похожая).  Заодно если кто хочет попытаться переложить его на вложенные if-ы, то это тоже приветствуется.

Условие: фунция не должна использовать исключения, ну и высокоуровневые C++ конструкции тоже, а то уж очень просто получится.  Функция read_file делает простую вещь: считывает весь файл в content, content_size - размер считанных данных.
## Код:
```
bool read_file(const char * file_name, char ** content, size_t * content_size)
{
    size_t cont_size = 0;
    char * cont = NULL;
    const size_t buf_size = 1024;
    char * buf = NULL;
    FILE * fh = NULL;
    size_t read_size = 0;
    bool success = false;

    buf = new (nothrow) char[buf_size];
    if (!buf)  goto error;

    fh = fopen(file_name, "r");
    if (!fh)  goto error;

    while (size_t bytes_read = fread(buf, 1, buf_size, fh))
    {
        if (read_size + bytes_read + 1 > cont_size)
        {
            size_t new_size = 2 * cont_size > cont_size + bytes_read + 1
                              ? 2 * cont_size
                              : cont_size + bytes_read + 1;
            char * new_cont = new (nothrow) char[new_size];
            if (!new_cont)  goto error;

            memcpy(new_cont, cont, read_size);
            delete [] cont;
            cont = new_cont;
            cont_size = new_size;
        }

        memcpy(cont + read_size, buf, bytes_read);
        read_size += bytes_read;
    }

    if (ferror(fh) != 0)  goto error;

    cont[read_size++] = '\0';
    *content = cont;
    *content_size = read_size;
    cont = NULL;
    success = true;

error:
    if (fh)
        fclose(fh);

    delete [] cont;
    delete [] buf;

    return success;
}
```
