> -- jackbauer писал(а):
> Интересно, как бы преобразовал следующий код (break-ов нет, но есть goto - идея похожая).  Заодно если кто хочет попытаться переложить его на вложенные if-ы, то это тоже приветствуется.Вот моя попытка. Предупреждаю сразу, на C я писал очень давно. : )## Код:
```
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)
    {
        fh = fopen(file_name, "r");
        if (fh)
        {
            success = true;
            // предполагается, что логические выражения вычисляются сокращённо
            while (success && (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];
                    success = new_cont != NULL;
                    if (success)
                    {
                        memcpy(new_cont, cont, read_size);
                        delete [] cont;
                        cont = new_cont;
                        cont_size = new_size;
                    }
                }
                if (success)
                {
                    memcpy(cont + read_size, buf, bytes_read);
                    read_size += bytes_read;
                }
            }

            success = success && (ferror(fh) == 0);
            if (success)
            {
                cont[read_size++] = '\0';
                *content = cont;
                *content_size = read_size;
            }
            else
            {
                delete [] cont;
            }
            fclose(fh);
        }
        delete [] buf;
    }
    return success;
}
```
В цикле появился дополнительный if, его можно убрать, продублировав код либо вынеся его в отдельную (инлайн-)функцию:## Код:
```
while (success && (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];
                    success = new_cont != NULL;
                    if (success)
                    {
                        memcpy(new_cont, cont, read_size);
                        delete [] cont;
                        cont = new_cont;
                        cont_size = new_size;
                        inlined_copy_buf_to_cont; // тут
                    }
                }
                else
                {
                    inlined_copy_buf_to_cont; // и тут
                }
            }
```
