Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge branch 'jk/more-comments-on-textconv'
The memory ownership rule of fill_textconv() API, which was a bit
tricky, has been documented a bit better.

* jk/more-comments-on-textconv:
  diff: clarify textconv interface
  • Loading branch information
Junio C Hamano committed Feb 26, 2016
2 parents 18b26b1 + a64e6a4 commit 3ed26a4
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
5 changes: 4 additions & 1 deletion diff.c
Expand Up @@ -5085,7 +5085,7 @@ size_t fill_textconv(struct userdiff_driver *driver,
{
size_t size;

if (!driver || !driver->textconv) {
if (!driver) {
if (!DIFF_FILE_VALID(df)) {
*outbuf = "";
return 0;
Expand All @@ -5096,6 +5096,9 @@ size_t fill_textconv(struct userdiff_driver *driver,
return df->size;
}

if (!driver->textconv)
die("BUG: fill_textconv called with non-textconv driver");

if (driver->textconv_cache && df->sha1_valid) {
*outbuf = notes_cache_get(driver->textconv_cache, df->sha1,
&size);
Expand Down
16 changes: 16 additions & 0 deletions diff.h
Expand Up @@ -349,10 +349,26 @@ extern void diff_no_index(struct rev_info *, int, const char **);

extern int index_differs_from(const char *def, int diff_flags);

/*
* Fill the contents of the filespec "df", respecting any textconv defined by
* its userdiff driver. The "driver" parameter must come from a
* previous call to get_textconv(), and therefore should either be NULL or have
* textconv enabled.
*
* Note that the memory ownership of the resulting buffer depends on whether
* the driver field is NULL. If it is, then the memory belongs to the filespec
* struct. If it is non-NULL, then "outbuf" points to a newly allocated buffer
* that should be freed by the caller.
*/
extern size_t fill_textconv(struct userdiff_driver *driver,
struct diff_filespec *df,
char **outbuf);

/*
* Look up the userdiff driver for the given filespec, and return it if
* and only if it has textconv enabled (otherwise return NULL). The result
* can be passed to fill_textconv().
*/
extern struct userdiff_driver *get_textconv(struct diff_filespec *one);

extern int parse_rename_score(const char **cp_p);
Expand Down
4 changes: 4 additions & 0 deletions userdiff.h
Expand Up @@ -23,6 +23,10 @@ int userdiff_config(const char *k, const char *v);
struct userdiff_driver *userdiff_find_by_name(const char *name);
struct userdiff_driver *userdiff_find_by_path(const char *path);

/*
* Initialize any textconv-related fields in the driver and return it, or NULL
* if it does not have textconv enabled at all.
*/
struct userdiff_driver *userdiff_get_textconv(struct userdiff_driver *driver);

#endif /* USERDIFF */

0 comments on commit 3ed26a4

Please sign in to comment.