|  | #ifndef PACK_OBJECTS_H | 
|  | #define PACK_OBJECTS_H | 
|  |  | 
|  | struct object_entry { | 
|  | struct pack_idx_entry idx; | 
|  | unsigned long size;	/* uncompressed size */ | 
|  | struct packed_git *in_pack;	/* already in pack */ | 
|  | off_t in_pack_offset; | 
|  | struct object_entry *delta;	/* delta base object */ | 
|  | struct object_entry *delta_child; /* deltified objects who bases me */ | 
|  | struct object_entry *delta_sibling; /* other deltified objects who | 
|  | * uses the same base as me | 
|  | */ | 
|  | void *delta_data;	/* cached delta (uncompressed) */ | 
|  | unsigned long delta_size;	/* delta data size (uncompressed) */ | 
|  | unsigned long z_delta_size;	/* delta data size (compressed) */ | 
|  | enum object_type type; | 
|  | enum object_type in_pack_type;	/* could be delta */ | 
|  | uint32_t hash;			/* name hint hash */ | 
|  | unsigned int in_pack_pos; | 
|  | unsigned char in_pack_header_size; | 
|  | unsigned preferred_base:1; /* | 
|  | * we do not pack this, but is available | 
|  | * to be used as the base object to delta | 
|  | * objects against. | 
|  | */ | 
|  | unsigned no_try_delta:1; | 
|  | unsigned tagged:1; /* near the very tip of refs */ | 
|  | unsigned filled:1; /* assigned write-order */ | 
|  |  | 
|  | /* | 
|  | * State flags for depth-first search used for analyzing delta cycles. | 
|  | * | 
|  | * The depth is measured in delta-links to the base (so if A is a delta | 
|  | * against B, then A has a depth of 1, and B a depth of 0). | 
|  | */ | 
|  | enum { | 
|  | DFS_NONE = 0, | 
|  | DFS_ACTIVE, | 
|  | DFS_DONE | 
|  | } dfs_state; | 
|  | int depth; | 
|  | }; | 
|  |  | 
|  | struct packing_data { | 
|  | struct object_entry *objects; | 
|  | uint32_t nr_objects, nr_alloc; | 
|  |  | 
|  | int32_t *index; | 
|  | uint32_t index_size; | 
|  | }; | 
|  |  | 
|  | struct object_entry *packlist_alloc(struct packing_data *pdata, | 
|  | const unsigned char *sha1, | 
|  | uint32_t index_pos); | 
|  |  | 
|  | struct object_entry *packlist_find(struct packing_data *pdata, | 
|  | const unsigned char *sha1, | 
|  | uint32_t *index_pos); | 
|  |  | 
|  | static inline uint32_t pack_name_hash(const char *name) | 
|  | { | 
|  | uint32_t c, hash = 0; | 
|  |  | 
|  | if (!name) | 
|  | return 0; | 
|  |  | 
|  | /* | 
|  | * This effectively just creates a sortable number from the | 
|  | * last sixteen non-whitespace characters. Last characters | 
|  | * count "most", so things that end in ".c" sort together. | 
|  | */ | 
|  | while ((c = *name++) != 0) { | 
|  | if (isspace(c)) | 
|  | continue; | 
|  | hash = (hash >> 2) + (c << 24); | 
|  | } | 
|  | return hash; | 
|  | } | 
|  |  | 
|  | #endif |