uriheader uri_new(uriheader cuh, ctchar* uri)
{
   if(uri)
   {
      uriheader uh=memalloc(sizeof(*uh)));
      if(uh)
      {
         uriheader_init(uh);
         uh->uri=str_dup(uri);
         if(uh->uri)
         {
            中処理略
            return uh;
         }
      }
      uri_delete(uh);
   }
   return NULL;
}

自分はいっつもこう書いてる。メリットは
・正常なフローが前半に、異常なフロー・エラーリカバリが後半にきれいに分かれている。
これは例外処理と構造が類似していて理にかなっている。
・ifの条件式が肯定的で分かりやすい。
・ローカル変数のスコープがさらに限定されている。
・エラー処理が簡単に追加できる。
例えばuh->uri==NULLの場合のみ行われる処理をどこに書くかすぐに分かる。
#ところでmemalloc失敗してもuri_delete呼ぶのか?
・各処理がブロック内で完結しているので規模が大きくなったときに分割が容易。
・総じて平坦なコードと比べて試行錯誤することが少なくなる。
・何よりインデントが美しい(藁