4 int read_mailmap(struct path_list
*map
, const char *filename
, char **repo_abbrev
)
7 FILE *f
= fopen(filename
, "r");
11 while (fgets(buffer
, sizeof(buffer
), f
) != NULL
) {
12 char *end_of_name
, *left_bracket
, *right_bracket
;
15 if (buffer
[0] == '#') {
16 static const char abbrev
[] = "# repo-abbrev:";
17 int abblen
= sizeof(abbrev
) - 1;
18 int len
= strlen(buffer
);
23 if (len
&& buffer
[len
- 1] == '\n')
25 if (!strncmp(buffer
, abbrev
, abblen
)) {
30 *repo_abbrev
= xmalloc(len
);
32 for (cp
= buffer
+ abblen
; isspace(*cp
); cp
++)
34 strcpy(*repo_abbrev
, cp
);
38 if ((left_bracket
= strchr(buffer
, '<')) == NULL
)
40 if ((right_bracket
= strchr(left_bracket
+ 1, '>')) == NULL
)
42 if (right_bracket
== left_bracket
+ 1)
44 for (end_of_name
= left_bracket
; end_of_name
!= buffer
45 && isspace(end_of_name
[-1]); end_of_name
--)
47 if (end_of_name
== buffer
)
49 name
= xmalloc(end_of_name
- buffer
+ 1);
50 strlcpy(name
, buffer
, end_of_name
- buffer
+ 1);
51 email
= xmalloc(right_bracket
- left_bracket
);
52 for (i
= 0; i
< right_bracket
- left_bracket
- 1; i
++)
53 email
[i
] = tolower(left_bracket
[i
+ 1]);
54 email
[right_bracket
- left_bracket
- 1] = '\0';
55 path_list_insert(email
, map
)->util
= name
;
61 int map_email(struct path_list
*map
, const char *email
, char *name
, int maxlen
)
64 struct path_list_item
*item
;
65 char buf
[1024], *mailbuf
;
68 /* autocomplete common developers */
69 p
= strchr(email
, '>');
72 if (p
- email
+ 1 < sizeof(buf
))
75 mailbuf
= xmalloc(p
- email
+ 1);
77 /* downcase the email address */
78 for (i
= 0; i
< p
- email
; i
++)
79 mailbuf
[i
] = tolower(email
[i
]);
81 item
= path_list_lookup(mailbuf
, map
);
85 const char *realname
= (const char *)item
->util
;
86 strlcpy(name
, realname
, maxlen
);