streaming.c: avoid forward declarations

Change code added in 46bf043807c (streaming: a new API to read from the object store, 2011-05-11) to avoid forward declarations of the functions it uses. We can instead move this code to the bottom of the file, and thus avoid the open_method_decl() calls. Aside from the addition of the "static helpers[...]" comment being added here, and the removal of the forward declarations this is a move-only change. The style of the added "static helpers[...]" comment isn't in line with our usual coding style, but is consistent with several other comments used in this file, so let's use that style consistently here. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Ævar Arnfjörð Bjarmason committed May 5, 2021 at 14:33 UTC b65528360f1153c2f912d272cce18abe56e25562
1 file changed +83 -88
streaming.c
+83 -88
@@ -42,20 +42,6 @@ struct stream_vtbl {
42 ssize_t read_istream_ ##name \
43 (struct git_istream *st, char *buf, size_t sz)
44
45 -/* forward declaration */
46 -static open_method_decl(incore);
47 -static open_method_decl(loose);
48 -static open_method_decl(pack_non_delta);
49 -static struct git_istream *attach_stream_filter(struct git_istream *st,
50 - struct stream_filter *filter);
51 -
52 -
53 -static open_istream_fn open_istream_tbl[] = {
54 - open_istream_incore,
55 - open_istream_loose,
56 - open_istream_pack_non_delta,
57 -};
58 -
45 #define FILTER_BUFFER (1024*16)
46
47 struct filtered_istream {
@@ -97,80 +83,6 @@ struct git_istream {
83 } u;
84 };
85
100 -int close_istream(struct git_istream *st)
101 -{
102 - int r = st->vtbl->close(st);
103 - free(st);
104 - return r;
105 -}
106 -
107 -ssize_t read_istream(struct git_istream *st, void *buf, size_t sz)
108 -{
109 - return st->vtbl->read(st, buf, sz);
110 -}
111 -
112 -static enum input_source istream_source(struct repository *r,
113 - const struct object_id *oid,
114 - enum object_type *type,
115 - struct object_info *oi)
116 -{
117 - unsigned long size;
118 - int status;
119 -
120 - oi->typep = type;
121 - oi->sizep = &size;
122 - status = oid_object_info_extended(r, oid, oi, 0);
123 - if (status < 0)
124 - return stream_error;
125 -
126 - switch (oi->whence) {
127 - case OI_LOOSE:
128 - return loose;
129 - case OI_PACKED:
130 - if (!oi->u.packed.is_delta && big_file_threshold < size)
131 - return pack_non_delta;
132 - /* fallthru */
133 - default:
134 - return incore;
135 - }
136 -}
137 -
138 -struct git_istream *open_istream(struct repository *r,
139 - const struct object_id *oid,
140 - enum object_type *type,
141 - unsigned long *size,
142 - struct stream_filter *filter)
143 -{
144 - struct git_istream *st;
145 - struct object_info oi = OBJECT_INFO_INIT;
146 - const struct object_id *real = lookup_replace_object(r, oid);
147 - enum input_source src = istream_source(r, real, type, &oi);
148 -
149 - if (src < 0)
150 - return NULL;
151 -
152 - st = xmalloc(sizeof(*st));
153 - if (open_istream_tbl[src](st, r, &oi, real, type)) {
154 - if (open_istream_incore(st, r, &oi, real, type)) {
155 - free(st);
156 - return NULL;
157 - }
158 - }
159 - if (filter) {
160 - /* Add "&& !is_null_stream_filter(filter)" for performance */
161 - struct git_istream *nst = attach_stream_filter(st, filter);
162 - if (!nst) {
163 - close_istream(st);
164 - return NULL;
165 - }
166 - st = nst;
167 - }
168 -
169 - *size = st->size;
170 - return st;
171 -}
172 -
173 -
86 /*****************************************************************
87 *
88 * Common helpers
@@ -508,11 +420,94 @@ static open_method_decl(incore)
420 return st->u.incore.buf ? 0 : -1;
421 }
422
423 +/*****************************************************************************
424 + * static helpers variables and functions for users of streaming interface
425 + *****************************************************************************/
426 +
427 +static open_istream_fn open_istream_tbl[] = {
428 + open_istream_incore,
429 + open_istream_loose,
430 + open_istream_pack_non_delta,
431 +};
432 +
433 +static enum input_source istream_source(struct repository *r,
434 + const struct object_id *oid,
435 + enum object_type *type,
436 + struct object_info *oi)
437 +{
438 + unsigned long size;
439 + int status;
440 +
441 + oi->typep = type;
442 + oi->sizep = &size;
443 + status = oid_object_info_extended(r, oid, oi, 0);
444 + if (status < 0)
445 + return stream_error;
446 +
447 + switch (oi->whence) {
448 + case OI_LOOSE:
449 + return loose;
450 + case OI_PACKED:
451 + if (!oi->u.packed.is_delta && big_file_threshold < size)
452 + return pack_non_delta;
453 + /* fallthru */
454 + default:
455 + return incore;
456 + }
457 +}
458 +
459
460 /****************************************************************
461 * Users of streaming interface
462 ****************************************************************/
463
464 +int close_istream(struct git_istream *st)
465 +{
466 + int r = st->vtbl->close(st);
467 + free(st);
468 + return r;
469 +}
470 +
471 +ssize_t read_istream(struct git_istream *st, void *buf, size_t sz)
472 +{
473 + return st->vtbl->read(st, buf, sz);
474 +}
475 +
476 +struct git_istream *open_istream(struct repository *r,
477 + const struct object_id *oid,
478 + enum object_type *type,
479 + unsigned long *size,
480 + struct stream_filter *filter)
481 +{
482 + struct git_istream *st;
483 + struct object_info oi = OBJECT_INFO_INIT;
484 + const struct object_id *real = lookup_replace_object(r, oid);
485 + enum input_source src = istream_source(r, real, type, &oi);
486 +
487 + if (src < 0)
488 + return NULL;
489 +
490 + st = xmalloc(sizeof(*st));
491 + if (open_istream_tbl[src](st, r, &oi, real, type)) {
492 + if (open_istream_incore(st, r, &oi, real, type)) {
493 + free(st);
494 + return NULL;
495 + }
496 + }
497 + if (filter) {
498 + /* Add "&& !is_null_stream_filter(filter)" for performance */
499 + struct git_istream *nst = attach_stream_filter(st, filter);
500 + if (!nst) {
501 + close_istream(st);
502 + return NULL;
503 + }
504 + st = nst;
505 + }
506 +
507 + *size = st->size;
508 + return st;
509 +}
510 +
511 int stream_blob_to_fd(int fd, const struct object_id *oid, struct stream_filter *filter,
512 int can_seek)
513 {