5 int read_mailmap(struct path_list
*map
, const char *filename
, char **repo_abbrev
)
8 FILE *f
= fopen(filename
, "r");
12 while (fgets(buffer
, sizeof(buffer
), f
) != NULL
) {
13 char *end_of_name
, *left_bracket
, *right_bracket
;
16 if (buffer
[0] == '#') {
17 static const char abbrev
[] = "# repo-abbrev:";
18 int abblen
= sizeof(abbrev
) - 1;
19 int len
= strlen(buffer
);
24 if (len
&& buffer
[len
- 1] == '\n')
26 if (!strncmp(buffer
, abbrev
, abblen
)) {
31 *repo_abbrev
= xmalloc(len
);
33 for (cp
= buffer
+ abblen
; isspace(*cp
); cp
++)
35 strcpy(*repo_abbrev
, cp
);
39 if ((left_bracket
= strchr(buffer
, '<')) == NULL
)
41 if ((right_bracket
= strchr(left_bracket
+ 1, '>')) == NULL
)
43 if (right_bracket
== left_bracket
+ 1)
45 for (end_of_name
= left_bracket
; end_of_name
!= buffer
46 && isspace(end_of_name
[-1]); end_of_name
--)
48 if (end_of_name
== buffer
)
50 name
= xmalloc(end_of_name
- buffer
+ 1);
51 strlcpy(name
, buffer
, end_of_name
- buffer
+ 1);
52 email
= xmalloc(right_bracket
- left_bracket
);
53 for (i
= 0; i
< right_bracket
- left_bracket
- 1; i
++)
54 email
[i
] = tolower(left_bracket
[i
+ 1]);
55 email
[right_bracket
- left_bracket
- 1] = '\0';
56 path_list_insert(email
, map
)->util
= name
;
62 int map_email(struct path_list
*map
, const char *email
, char *name
, int maxlen
)
65 struct path_list_item
*item
;
66 char buf
[1024], *mailbuf
;
69 /* autocomplete common developers */
70 p
= strchr(email
, '>');
73 if (p
- email
+ 1 < sizeof(buf
))
76 mailbuf
= xmalloc(p
- email
+ 1);
78 /* downcase the email address */
79 for (i
= 0; i
< p
- email
; i
++)
80 mailbuf
[i
] = tolower(email
[i
]);
82 item
= path_list_lookup(mailbuf
, map
);
86 const char *realname
= (const char *)item
->util
;
87 strlcpy(name
, realname
, maxlen
);