Changeset 398 in kBuild for trunk/src/kDepIDB
- Timestamp:
- Jan 13, 2006 4:00:35 AM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kDepIDB/kDepIDB.c
r393 r398 45 45 #define OFFSETOF(type, member) ( (int)(void *)&( ((type *)(void *)0)->member) ) 46 46 47 /*#define DEBUG*/ 48 #ifdef DEBUG 49 #define dprintf(a) printf a 50 #define dump(pb, cb, offBase) hexdump(pb,cb,offBase) 51 #else 52 #define dprintf(a) do {} while (0) 53 #define dump(pb, cb, offBase) do {} while (0) 54 #endif 47 55 48 56 … … 53 61 static const char *argv0 = ""; 54 62 63 #ifdef DEBUG 64 /** 65 * Performs a hexdump. 66 */ 67 static void hexdump(const uint8_t *pb, size_t cb, size_t offBase) 68 { 69 static const char szHex[16] = "0123456789abcdef"; 70 71 const unsigned cchWidth = 16; 72 size_t off = 0; 73 while (off < cb) 74 { 75 unsigned i; 76 printf("%s%0*x %04x:", off ? "\n" : "", sizeof(pb) * 2, offBase + off, off); 77 for (i = 0; i < cchWidth && off + i < cb ; i++) 78 printf(off + i < cb ? !(i & 7) && i ? "-%02x" : " %02x" : " ", pb[i]); 79 80 while (i++ < cchWidth) 81 printf(" "); 82 printf(" "); 83 84 for (i = 0; i < cchWidth && off + i < cb; i++) 85 { 86 const uint8_t u8 = pb[i]; 87 printf("%c", u8 < 127 && u8 >= 32 ? u8 : '.', 1); 88 } 89 off += cchWidth; 90 pb += cchWidth; 91 } 92 printf("\n"); 93 } 94 #endif 55 95 56 96 /** … … 66 106 static int ScanStream(uint8_t *pbStream, size_t cbStream, const char *pszPrefix, size_t cchPrefix) 67 107 { 68 register char chFirst = *pszPrefix; 69 while (cbStream > cchPrefix + 2) 70 { 71 if ( *pbStream != chFirst 72 || memcmp(pbStream, pszPrefix, cchPrefix)) 73 { 74 pbStream++; 75 cbStream--; 108 const uint8_t *pbCur = pbStream; 109 size_t cbLeft = cbStream; 110 register char chFirst = *pszPrefix; 111 while (cbLeft > cchPrefix + 2) 112 { 113 if ( *pbCur != chFirst 114 || memcmp(pbCur, pszPrefix, cchPrefix)) 115 { 116 pbCur++; 117 cbLeft--; 76 118 } 77 119 else 78 120 { 79 121 size_t cchDep; 80 pbStream += cchPrefix; 81 cchDep = strlen(pbStream); 82 depAdd(pbStream, cchDep); 83 84 pbStream += cchDep; 85 cbStream -= cchDep + cchPrefix; 122 pbCur += cchPrefix; 123 cchDep = strlen(pbCur); 124 depAdd(pbCur, cchDep); 125 dprintf(("%05x: '%s'\n", pbCur - pbStream, pbCur)); 126 127 pbCur += cchDep; 128 cbLeft -= cchDep + cchPrefix; 86 129 } 87 130 } … … 206 249 if (pHdr->iStartPage >= pHdr->cPages && pHdr->iStartPage <= 0) 207 250 { 208 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", argv0); 251 fprintf(stderr, "%s: error: Bad PDB 2.0 header - iStartPage=%u cPages=%u.\n", argv0, 252 pHdr->iStartPage, pHdr->cPages); 253 return 1; 254 } 255 if (pHdr->iRootPages >= pHdr->cPages && pHdr->iRootPages <= 0) 256 { 257 fprintf(stderr, "%s: error: Bad PDB 2.0 header - iRootPages=%u cPage=%u.\n", argv0, 258 pHdr->iStartPage, pHdr->cPages); 209 259 return 1; 210 260 } 211 261 return 0; 262 } 263 264 static size_t Pdb70Align(PPDB70HDR pHdr, size_t cb) 265 { 266 if (cb == ~(uint32_t)0 || !cb) 267 return 0; 268 return ((cb + pHdr->cbPage - 1) / pHdr->cbPage) * pHdr->cbPage; 212 269 } 213 270 … … 221 278 static void *Pdb70AllocAndRead(PPDB70HDR pHdr, size_t cb, PPDB70PAGE paiPageMap) 222 279 { 223 size_t cPages = Pdb70Pages(pHdr, cb); 224 uint8_t *pbBuf = malloc(cPages * pHdr->cbPage + 1); 280 const size_t cbPage = pHdr->cbPage; 281 size_t cPages = Pdb70Pages(pHdr, cb); 282 uint8_t *pbBuf = malloc(cPages * cbPage + 1); 225 283 if (pbBuf) 226 284 { … … 229 287 { 230 288 size_t off = paiPageMap[iPage]; 231 off *= pHdr->cbPage; 232 memcpy(pbBuf + iPage * pHdr->cbPage, (uint8_t *)pHdr + off, pHdr->cbPage); 289 if (off < pHdr->cPages) 290 { 291 off *= cbPage; 292 memcpy(pbBuf + iPage * cbPage, (uint8_t *)pHdr + off, cbPage); 293 dump(pbBuf + iPage * cbPage, cbPage, off); 294 } 295 else 296 { 297 fprintf(stderr, "%s: warning: Invalid page index %u (max %u)!\n", argv0, 298 (unsigned)off, pHdr->cPages); 299 memset(pbBuf + iPage * cbPage, 0, cbPage); 300 } 301 233 302 iPage++; 234 303 } 235 pbBuf[cPages * pHdr->cbPage] = '\0';304 pbBuf[cPages * cbPage] = '\0'; 236 305 } 237 306 else 238 fprintf(stderr, "%s: error: failed to allocate % d bytes\n", argv0, cPages * pHdr->cbPage + 1);307 fprintf(stderr, "%s: error: failed to allocate %u bytes\n", argv0, cPages * cbPage + 1); 239 308 return pbBuf; 240 309 } … … 288 357 while (iStream-- > 0) 289 358 if (pRoot->aStreams[iStream].cbStream != ~(uint32_t)0) 290 paiPageMap += Pdb70Pages(pHdr, pRoot->aStreams[iStream].cbStream) / pHdr->cbPage;359 paiPageMap += Pdb70Pages(pHdr, pRoot->aStreams[iStream].cbStream); 291 360 292 361 if (pcbStream) … … 301 370 unsigned iStream; 302 371 int rc = 0; 372 dprintf(("pdb70\n")); 303 373 304 374 /* … … 318 388 for (iStream = 0; iStream < pRoot->cStreams && !rc; iStream++) 319 389 { 320 uint8_t *pbStream; 390 const size_t cbStream = Pdb70Align(pHdr, pRoot->aStreams[iStream].cbStream); 391 uint8_t *pbStream; 321 392 if ( pRoot->aStreams[iStream].cbStream == ~(uint32_t)0 322 393 || !pRoot->aStreams[iStream].cbStream) 323 394 continue; 395 dprintf(("Stream #%d: %#x bytes (%#x aligned)\n", iStream, pRoot->aStreams[iStream].cbStream, cbStream)); 324 396 pbStream = (uint8_t *)Pdb70AllocAndReadStream(pHdr, pRoot, iStream, NULL); 325 397 if (pbStream) 326 398 { 327 rc = ScanStream(pbStream, pRoot->aStreams[iStream].cbStream, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1);399 rc = ScanStream(pbStream, cbStream, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1); 328 400 free(pbStream); 329 401 }
Note:
See TracChangeset
for help on using the changeset viewer.