- /* The first pass counts how large an area to allocate to
- * hold the entire alt_odb structure, including array of
- * structs and path buffers for them. The second pass fills
- * the structure and prepares the path buffers for use by
- * fill_sha1_path().
- */
- for (totlen = pass = 0; pass < 2; pass++) {
- last = alt;
- i = 0;
- do {
- cp = strchr(last, ':') ? : last + strlen(last);
- if (last != cp) {
- /* 43 = 40-byte + 2 '/' + terminating NUL */
- int pfxlen = cp - last;
- int entlen = pfxlen + 43;
- if (pass == 0)
- totlen += entlen;
- else {
- alt_odb[i].base = op;
- alt_odb[i].name = op + pfxlen + 1;
- memcpy(op, last, pfxlen);
- op[pfxlen] = op[pfxlen + 3] = '/';
- op[entlen-1] = 0;
- op += entlen;
- }
- i++;
- }
- while (*cp && *cp == ':')
- cp++;
- last = cp;
- } while (*cp);
- if (pass)
- break;
- alt_odb = xmalloc(sizeof(*alt_odb) * (i + 1) + totlen);
- alt_odb[i].base = alt_odb[i].name = NULL;
- op = (char*)(&alt_odb[i+1]);