int init_device (void) {
  if (allocate_memory() != SUCCESS)
    goto out1;
  if (setup_interrupts() != SUCCESS)     goto out2;
  if (setup_registers() != SUCCESS)
    goto out3;
  return SUCCESS;
out3:
  teardown_interrupts();
out2:
  free_memory();
out1:
  return ERROR;
}




int init_device (void) {
  if (allocate_memory() == SUCCESS) {
    if (setup_interrupts() == SUCCESS) {
      if (setup_registers() == SUCCESS) {
        ... more logic ...
        return SUCCESS;
      }
      teardown_interrupts();
    }
    free_memory();
  }
  return ERROR;
}