From: karthik nayak Date: Sun, 08 Mar 2015 08:48:14 GMT Subject: Re: [PATCH v3 2/3] sha1_file: implement changes for "cat-file --literally -t" Message-ID: <54FC0CCE.70009@gmail.com> In-Reply-To: On 03/08/2015 01:39 PM, Junio C Hamano wrote: > karthik nayak writes: > >> On 03/07/2015 12:58 AM, Junio C Hamano wrote: >> >> case 't': >> oi.typep = &type; >> oi.typename = &sb; >> sha1_object_info_extended(sha1, &oi, flags); >> if (sb.len) { >> printf("%s\n", sb.buf); >> strbuf_release(&sb); >> return 0; >> } else if (type) { >> printf("%s\n", typename(type)); >> return 0; >> } >> break; >> >> This works but I need an else statement to check the type if not >> getting the type literally, which is because if not called literally >> the oi.typename is not set,... > > Hmph, when I outlined that change to object-info-extended, I meant > to do it in such a way that when the optional oi->typename is set, > it is always filled whether "literally" is asked for andr whether > the object is a kosher one or a bogus one. > > Without parsing the header, we wouldn't know how long the object > would be, so I do not know if not doing some variant of parse_header > is an option. > > Thanks. > What parse_sha1_header() does to get the type is just find the first occurrence of a " " manually and store everything before it as the type. Then it finds the size of the object if needed. And finally returns the type by calling type_from_string(). This is where we get the undefined type error. When getting the type "literally" we could just find the first occurrence of a " " using strcspn() copy the type to oi->typename and avoid calling parse_sha1_header(). Even your code went along these lines. If "literally" is not set we could call parse_sha1_header() like we regularly would. Thanks Karthik