Кто-то, вероятно, скажет что-то об исключениях... но в C, каковы другие способы сделать следующее чисто/ясно и без повторения такого большого количества кода?
if (Do1()) { printf("Failed 1"); return 1; }
if (Do2()) { Undo1(); printf("Failed 2"); return 2; }
if (Do3()) { Undo2(); Undo1(); printf("Failed 3"); return 3; }
if (Do4()) { Undo3(); Undo2(); Undo1(); printf("Failed 4"); return 4; }
if (Do5()) { Undo4(); Undo3(); Undo2(); Undo1(); printf("Failed 5"); return 5; }
Etc...
Это может быть одним из случаев использования gotos. Или, может быть, несколько внутренних функций...