@@ -73,6 +73,119 @@ struct survey_report_object_size_summary {
73
73
size_t num_missing ;
74
74
};
75
75
76
+ typedef int (* survey_top_cmp )(void * v1 , void * v2 );
77
+
78
+ MAYBE_UNUSED
79
+ static int cmp_by_nr (void * v1 , void * v2 )
80
+ {
81
+ struct survey_report_object_size_summary * s1 = v1 ;
82
+ struct survey_report_object_size_summary * s2 = v2 ;
83
+
84
+ if (s1 -> nr < s2 -> nr )
85
+ return -1 ;
86
+ if (s1 -> nr > s2 -> nr )
87
+ return 1 ;
88
+ return 0 ;
89
+ }
90
+
91
+ MAYBE_UNUSED
92
+ static int cmp_by_disk_size (void * v1 , void * v2 )
93
+ {
94
+ struct survey_report_object_size_summary * s1 = v1 ;
95
+ struct survey_report_object_size_summary * s2 = v2 ;
96
+
97
+ if (s1 -> disk_size < s2 -> disk_size )
98
+ return -1 ;
99
+ if (s1 -> disk_size > s2 -> disk_size )
100
+ return 1 ;
101
+ return 0 ;
102
+ }
103
+
104
+ MAYBE_UNUSED
105
+ static int cmp_by_inflated_size (void * v1 , void * v2 )
106
+ {
107
+ struct survey_report_object_size_summary * s1 = v1 ;
108
+ struct survey_report_object_size_summary * s2 = v2 ;
109
+
110
+ if (s1 -> inflated_size < s2 -> inflated_size )
111
+ return -1 ;
112
+ if (s1 -> inflated_size > s2 -> inflated_size )
113
+ return 1 ;
114
+ return 0 ;
115
+ }
116
+
117
+ /**
118
+ * Store a list of "top" categories by some sorting function. When
119
+ * inserting a new category, reorder the list and free the one that
120
+ * got ejected (if any).
121
+ */
122
+ struct survey_report_top_table {
123
+ const char * name ;
124
+ survey_top_cmp cmp_fn ;
125
+ size_t nr ;
126
+ size_t alloc ;
127
+
128
+ /**
129
+ * 'data' stores an array of structs and must be cast into
130
+ * the proper array type before evaluating an index.
131
+ */
132
+ void * data ;
133
+ };
134
+
135
+ MAYBE_UNUSED
136
+ static void init_top_sizes (struct survey_report_top_table * top ,
137
+ size_t limit , const char * name ,
138
+ survey_top_cmp cmp )
139
+ {
140
+ struct survey_report_object_size_summary * sz_array ;
141
+
142
+ top -> name = name ;
143
+ top -> cmp_fn = cmp ;
144
+ top -> alloc = limit ;
145
+ top -> nr = 0 ;
146
+
147
+ CALLOC_ARRAY (sz_array , limit );
148
+ top -> data = sz_array ;
149
+ }
150
+
151
+ MAYBE_UNUSED
152
+ static void clear_top_sizes (struct survey_report_top_table * top )
153
+ {
154
+ struct survey_report_object_size_summary * sz_array = top -> data ;
155
+
156
+ for (size_t i = 0 ; i < top -> nr ; i ++ )
157
+ free (sz_array [i ].label );
158
+ free (sz_array );
159
+ }
160
+
161
+ MAYBE_UNUSED
162
+ static void maybe_insert_into_top_size (struct survey_report_top_table * top ,
163
+ struct survey_report_object_size_summary * summary )
164
+ {
165
+ struct survey_report_object_size_summary * sz_array = top -> data ;
166
+ size_t pos = top -> nr ;
167
+
168
+ /* Compare against list from the bottom. */
169
+ while (pos > 0 && top -> cmp_fn (& sz_array [pos - 1 ], summary ) < 0 )
170
+ pos -- ;
171
+
172
+ /* Not big enough! */
173
+ if (pos >= top -> alloc )
174
+ return ;
175
+
176
+ /* We need to shift the data. */
177
+ if (top -> nr == top -> alloc )
178
+ free (sz_array [top -> nr - 1 ].label );
179
+ else
180
+ top -> nr ++ ;
181
+
182
+ for (size_t i = top -> nr - 1 ; i > pos ; i -- )
183
+ memcpy (& sz_array [i ], & sz_array [i - 1 ], sizeof (* sz_array ));
184
+
185
+ memcpy (& sz_array [pos ], summary , sizeof (* summary ));
186
+ sz_array [pos ].label = xstrdup (summary -> label );
187
+ }
188
+
76
189
/**
77
190
* This struct contains all of the information that needs to be printed
78
191
* at the end of the exploration of the repository and its references.
0 commit comments