Here's my code for that, with error checking removed for clarity:

Code:
void codetable_generate(struct Codetable_entry *table, size_t len) {
   uint32_t next_code = 0;
   for(uint32_t pass_len = 1; pass_len < 16; pass_len++) {
      for(size_t i = 0; i < len; i++) {
         if(table[i].length == pass_len) {
            table[i].code = reverse(next_code,pass_len);
            next_code++;
         }
      }
      next_code <<= 1;
   } 
}
'reverse(x,y)' just flips the last 'y' bits around in 'x' - i.e. reverses the bit ordering in the lowest 'y' bits.