int func(int x)
{
char * c1 = malloc(SOMESIZE);
char * c2 = malloc(EVENMORE);
if ((!c1) || (!c2))
{
if (c1) free(c1);
if (c2) free(c2);
return E_CANTMALLOC;
}
int boolerr = 0;
int retcode = 0;
switch (x)
{
case 0:
...
if (somebadnews)
{
boolerr = 1;
retcode = E_CODE_GREEN;
}
break;
case 1:
...
if (somebadnews)
{
boolerr = 1;
retcode = E_CODE_YELLOW;
}
break;
case 2:
...
if (somebadnews)
{
boolerr = 1;
retcode = E_CODE_RED;
}
break;
case 3:
...
if (somebadnews)
{
boolerr = 1;
retcode = E_CODE_BLACK;
}
break;
default:
boolerr = 1;
retcode = E_CODE_BROWN;
}
if (boolerr)
{
free(c1);
free(c2);
return retcode;
}
...
return 0;
}
А как по канону нужно обрабатывать ситуацию, когда одна из подпрограмм вернула ошибку и нужно освободить ресурсы и передать наверх тот же код?