static char * relname(char const *from, char const *to) { size_t i, taillen, dotdotetcsize; size_t dir_len = 0, dotdots = 0, linksize = SIZE_MAX; char const *f = from; char *result = NULL; if (*to == '/') { size_t len = strlen(directory); bool needslash = len && directory[len - 1] != '/'; linksize = len + needslash + strlen(from) + 1; f = result = emalloc(linksize); strcpy(result, directory); result[len] = '/'; strcpy(result + len + needslash, from); } ... taillen = strlen(f + dir_len); dotdotetcsize = 3 * dotdots + taillen + 1; if (dotdotetcsize <= linksize) { if (!result) result = emalloc(dotdotetcsize); for (i = 0; i < dotdots; i++) memcpy(result + 3 * i, "../", 3); memmove(result + 3 * dotdots, f + dir_len, taillen + 1); } return result; }
bb771caa-aef5-4eef-abf3-7d712a5ce0d4
static char * relname(char const *from, char const *to) { size_t i, taillen, dotdotetcsize; size_t dir_len = 0, dotdots = 0, linksize = SIZE_MAX; char const *f = from; char *result = NULL; if (*to == '/') { size_t len = strlen(directory); bool needslash = len && directory[len - 1] != '/'; linksize = len + needslash + strlen(from) + 1; f = result = emalloc(linksize); strcpy(result, directory); result[len] = '/'; strcpy(result + len + needslash, from); } ... taillen = strlen(f + dir_len); dotdotetcsize = 3 * dotdots + taillen + 1; if (dotdotetcsize <= linksize) { if (!result) result = emalloc(dotdotetcsize); for (i = 0; i < dotdots; i++) memcpy(result + 3 * i, "../", 3); memmove(result + 3 * dotdots, f + dir_len, taillen + 1); } return result; }