Changeset 3167 for trunk/src/kmk/kmkbuiltin/kDepIDB.c
- Timestamp:
- Mar 20, 2018, 10:47:25 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/kDepIDB.c
r3159 r3167 24 24 */ 25 25 26 /******************************************************************************* 27 * Header Files * 28 *******************************************************************************/ 26 27 /********************************************************************************************************************************* 28 * Header Files * 29 *********************************************************************************************************************************/ 29 30 #include "config.h" 30 31 #include <stdio.h> … … 48 49 49 50 50 /******************************************************************************* 51 * Defined Constants And Macros *52 ******************************************************************************* /51 /********************************************************************************************************************************* 52 * Defined Constants And Macros * 53 *********************************************************************************************************************************/ 53 54 /*#define DEBUG*/ 54 55 #ifdef DEBUG … … 60 61 #endif 61 62 62 63 /******************************************************************************* 64 * Global Variables * 65 *******************************************************************************/ 66 /** the executable name. */ 67 static const char *argv0 = ""; 63 /********************************************************************************************************************************* 64 * Structures and Typedefs * 65 *********************************************************************************************************************************/ 66 typedef struct KDEPIDBGLOBALS 67 { 68 DEPGLOBALS Core; 69 const char *argv0; 70 } KDEPIDBGLOBALS; 71 typedef KDEPIDBGLOBALS *PKDEPIDBGLOBALS; 68 72 69 73 … … 73 77 * @returns 0 on success. 74 78 * @returns !0 on failure. 79 * @param pThis The kDepIDB instance. 75 80 * @param pbStream The stream bits. 76 81 * @param cbStream The size of the stream. … … 78 83 * @param cchPrefix The size of the prefix. 79 84 */ 80 static int ScanStream( KU8 *pbStream, size_t cbStream, const char *pszPrefix, size_t cchPrefix)85 static int ScanStream(PKDEPIDBGLOBALS pThis, KU8 *pbStream, size_t cbStream, const char *pszPrefix, size_t cchPrefix) 81 86 { 82 87 const KU8 *pbCur = pbStream; … … 96 101 pbCur += cchPrefix; 97 102 cchDep = strlen((const char *)pbCur); 98 depAdd( (const char *)pbCur, cchDep);103 depAdd(&pThis->Core, (const char *) pbCur, cchDep); 99 104 dprintf(("%05x: '%s'\n", pbCur - pbStream, pbCur)); 100 105 … … 189 194 190 195 191 static int Pdb70ValidateHeader(P PDB70HDR pHdr, size_t cbFile)196 static int Pdb70ValidateHeader(PKDEPIDBGLOBALS pThis, PPDB70HDR pHdr, size_t cbFile) 192 197 { 193 198 if (pHdr->cbPage * pHdr->cPages != cbFile) 194 199 { 195 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", argv0);200 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", pThis->argv0); 196 201 return 1; 197 202 } 198 203 if (pHdr->iStartPage >= pHdr->cPages && pHdr->iStartPage <= 0) 199 204 { 200 fprintf(stderr, "%s: error: Bad PDB 2.0 header - iStartPage=%u cPages=%u.\n", argv0,205 fprintf(stderr, "%s: error: Bad PDB 2.0 header - iStartPage=%u cPages=%u.\n", pThis->argv0, 201 206 pHdr->iStartPage, pHdr->cPages); 202 207 return 1; … … 204 209 if (pHdr->iRootPages >= pHdr->cPages && pHdr->iRootPages <= 0) 205 210 { 206 fprintf(stderr, "%s: error: Bad PDB 2.0 header - iRootPages=%u cPage=%u.\n", argv0,211 fprintf(stderr, "%s: error: Bad PDB 2.0 header - iRootPages=%u cPage=%u.\n", pThis->argv0, 207 212 pHdr->iStartPage, pHdr->cPages); 208 213 return 1; … … 227 232 } 228 233 229 static void *Pdb70AllocAndRead(P PDB70HDR pHdr, size_t cb, PPDB70PAGE paiPageMap)234 static void *Pdb70AllocAndRead(PKDEPIDBGLOBALS pThis, PPDB70HDR pHdr, size_t cb, PPDB70PAGE paiPageMap) 230 235 { 231 236 const size_t cbPage = pHdr->cbPage; … … 246 251 else 247 252 { 248 fprintf(stderr, "%s: warning: Invalid page index %u (max %u)!\n", argv0,253 fprintf(stderr, "%s: warning: Invalid page index %u (max %u)!\n", pThis->argv0, 249 254 (unsigned)off, pHdr->cPages); 250 255 memset(pbBuf + iPage * cbPage, 0, cbPage); … … 256 261 } 257 262 else 258 fprintf(stderr, "%s: error: failed to allocate %lu bytes\n", argv0, (unsigned long)(cPages * cbPage + 1));263 fprintf(stderr, "%s: error: failed to allocate %lu bytes\n", pThis->argv0, (unsigned long)(cPages * cbPage + 1)); 259 264 return pbBuf; 260 265 } 261 266 262 static PPDB70ROOT Pdb70AllocAndReadRoot(P PDB70HDR pHdr)267 static PPDB70ROOT Pdb70AllocAndReadRoot(PKDEPIDBGLOBALS pThis, PPDB70HDR pHdr) 263 268 { 264 269 /* … … 267 272 */ 268 273 PPDB70PAGE piPageMap = (KU32 *)((KU8 *)pHdr + pHdr->iRootPages * pHdr->cbPage); 269 PPDB70ROOT pRoot = Pdb70AllocAndRead(p Hdr, pHdr->cbRoot, piPageMap);274 PPDB70ROOT pRoot = Pdb70AllocAndRead(pThis, pHdr, pHdr->cbRoot, piPageMap); 270 275 if (pRoot) 271 276 { … … 275 280 size_t cb = K_OFFSETOF(PDB70ROOT, aStreams[pRoot->cStreams]); 276 281 free(pRoot); 277 pRoot = Pdb70AllocAndRead(p Hdr, cb, piPageMap);282 pRoot = Pdb70AllocAndRead(pThis, pHdr, cb, piPageMap); 278 283 if (pRoot) 279 284 { … … 284 289 cb += Pdb70Pages(pHdr, pRoot->aStreams[iStream].cbStream) * sizeof(PDB70PAGE); 285 290 free(pRoot); 286 pRoot = Pdb70AllocAndRead(p Hdr, cb, piPageMap);291 pRoot = Pdb70AllocAndRead(pThis, pHdr, cb, piPageMap); 287 292 if (pRoot) 288 293 { … … 299 304 } 300 305 301 static void *Pdb70AllocAndReadStream(P PDB70HDR pHdr, PPDB70ROOT pRoot, unsigned iStream, size_t *pcbStream)306 static void *Pdb70AllocAndReadStream(PKDEPIDBGLOBALS pThis, PPDB70HDR pHdr, PPDB70ROOT pRoot, unsigned iStream, size_t *pcbStream) 302 307 { 303 308 const size_t cbStream = pRoot->aStreams[iStream].cbStream; … … 306 311 || cbStream == ~(KU32)0) 307 312 { 308 fprintf(stderr, "%s: error: Invalid stream %d\n", argv0, iStream);313 fprintf(stderr, "%s: error: Invalid stream %d\n", pThis->argv0, iStream); 309 314 return NULL; 310 315 } … … 317 322 if (pcbStream) 318 323 *pcbStream = cbStream; 319 return Pdb70AllocAndRead(p Hdr, cbStream, paiPageMap);320 } 321 322 static int Pdb70Process( KU8 *pbFile, size_t cbFile)324 return Pdb70AllocAndRead(pThis, pHdr, cbStream, paiPageMap); 325 } 326 327 static int Pdb70Process(PKDEPIDBGLOBALS pThis, KU8 *pbFile, size_t cbFile) 323 328 { 324 329 PPDB70HDR pHdr = (PPDB70HDR)pbFile; … … 334 339 * Validate the header and read the root stream. 335 340 */ 336 if (Pdb70ValidateHeader(p Hdr, cbFile))337 return 1; 338 pRoot = Pdb70AllocAndReadRoot(p Hdr);341 if (Pdb70ValidateHeader(pThis, pHdr, cbFile)) 342 return 1; 343 pRoot = Pdb70AllocAndReadRoot(pThis, pHdr); 339 344 if (!pRoot) 340 345 return 1; … … 344 349 */ 345 350 dprintf(("Reading the names stream....\n")); 346 pNames = Pdb70AllocAndReadStream(p Hdr, pRoot, 1, &cbStream);351 pNames = Pdb70AllocAndReadStream(pThis, pHdr, pRoot, 1, &cbStream); 347 352 if (pNames) 348 353 { … … 366 371 && !memcmp(psz, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1)) 367 372 { 368 depAdd( psz + sizeof("/mr/inversedeps/") - 1, cch - (sizeof("/mr/inversedeps/") - 1));373 depAdd(&pThis->Core, psz + sizeof("/mr/inversedeps/") - 1, cch - (sizeof("/mr/inversedeps/") - 1)); 369 374 fAdded = 1; 370 375 } … … 408 413 dprintf(("Stream #%d: %#x bytes (%#x aligned)\n", iStream, pRoot->aStreams[iStream].cbStream, 409 414 Pdb70Align(pHdr, pRoot->aStreams[iStream].cbStream))); 410 pbStream = (KU8 *)Pdb70AllocAndReadStream(p Hdr, pRoot, iStream, &cbStream);415 pbStream = (KU8 *)Pdb70AllocAndReadStream(pThis, pHdr, pRoot, iStream, &cbStream); 411 416 if (pbStream) 412 417 { 413 rc = ScanStream(p bStream, cbStream, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1);418 rc = ScanStream(pThis, pbStream, cbStream, "/mr/inversedeps/", sizeof("/mr/inversedeps/") - 1); 414 419 free(pbStream); 415 420 } … … 485 490 486 491 487 static int Pdb20ValidateHeader(P PDB20HDR pHdr, size_t cbFile)492 static int Pdb20ValidateHeader(PKDEPIDBGLOBALS pThis, PPDB20HDR pHdr, size_t cbFile) 488 493 { 489 494 if (pHdr->cbPage * pHdr->cPages != cbFile) 490 495 { 491 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", argv0);496 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", pThis->argv0); 492 497 return 1; 493 498 } 494 499 if (pHdr->iStartPage >= pHdr->cPages && pHdr->iStartPage <= 0) 495 500 { 496 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", argv0);501 fprintf(stderr, "%s: error: Bad PDB 2.0 header - cbPage * cPages != cbFile.\n", pThis->argv0); 497 502 return 1; 498 503 } … … 507 512 } 508 513 509 static void *Pdb20AllocAndRead(P PDB20HDR pHdr, size_t cb, PPDB20PAGE paiPageMap)514 static void *Pdb20AllocAndRead(PKDEPIDBGLOBALS pThis, PPDB20HDR pHdr, size_t cb, PPDB20PAGE paiPageMap) 510 515 { 511 516 size_t cPages = Pdb20Pages(pHdr, cb); … … 524 529 } 525 530 else 526 fprintf(stderr, "%s: error: failed to allocate %lu bytes\n", argv0, (unsigned long)(cPages * pHdr->cbPage + 1));531 fprintf(stderr, "%s: error: failed to allocate %lu bytes\n", pThis->argv0, (unsigned long)(cPages * pHdr->cbPage + 1)); 527 532 return pbBuf; 528 533 } 529 534 530 static PPDB20ROOT Pdb20AllocAndReadRoot(P PDB20HDR pHdr)535 static PPDB20ROOT Pdb20AllocAndReadRoot(PKDEPIDBGLOBALS pThis, PPDB20HDR pHdr) 531 536 { 532 537 /* … … 534 539 * (Todo: Check if we can just use the stream size..) 535 540 */ 536 PPDB20ROOT pRoot = Pdb20AllocAndRead(p Hdr, sizeof(*pRoot), &pHdr->aiRootPageMap[0]);541 PPDB20ROOT pRoot = Pdb20AllocAndRead(pThis, pHdr, sizeof(*pRoot), &pHdr->aiRootPageMap[0]); 537 542 if (pRoot) 538 543 { … … 540 545 size_t cb = K_OFFSETOF(PDB20ROOT, aStreams[pRoot->cStreams]); 541 546 free(pRoot); 542 pRoot = Pdb20AllocAndRead(p Hdr, cb, &pHdr->aiRootPageMap[0]);547 pRoot = Pdb20AllocAndRead(pThis, pHdr, cb, &pHdr->aiRootPageMap[0]); 543 548 if (pRoot) 544 549 { … … 549 554 cb += Pdb20Pages(pHdr, pRoot->aStreams[iStream].cbStream) * sizeof(PDB20PAGE); 550 555 free(pRoot); 551 pRoot = Pdb20AllocAndRead(p Hdr, cb, &pHdr->aiRootPageMap[0]);556 pRoot = Pdb20AllocAndRead(pThis, pHdr, cb, &pHdr->aiRootPageMap[0]); 552 557 if (pRoot) 553 558 { … … 561 566 } 562 567 563 static void *Pdb20AllocAndReadStream(P PDB20HDR pHdr, PPDB20ROOT pRoot, unsigned iStream, size_t *pcbStream)568 static void *Pdb20AllocAndReadStream(PKDEPIDBGLOBALS pThis, PPDB20HDR pHdr, PPDB20ROOT pRoot, unsigned iStream, size_t *pcbStream) 564 569 { 565 570 size_t cbStream = pRoot->aStreams[iStream].cbStream; … … 568 573 || cbStream == ~(KU32)0) 569 574 { 570 fprintf(stderr, "%s: error: Invalid stream %d\n", argv0, iStream);575 fprintf(stderr, "%s: error: Invalid stream %d\n", pThis->argv0, iStream); 571 576 return NULL; 572 577 } … … 579 584 if (pcbStream) 580 585 *pcbStream = cbStream; 581 return Pdb20AllocAndRead(p Hdr, cbStream, paiPageMap);582 } 583 584 static int Pdb20Process( KU8 *pbFile, size_t cbFile)586 return Pdb20AllocAndRead(pThis, pHdr, cbStream, paiPageMap); 587 } 588 589 static int Pdb20Process(PKDEPIDBGLOBALS pThis, KU8 *pbFile, size_t cbFile) 585 590 { 586 591 PPDB20HDR pHdr = (PPDB20HDR)pbFile; … … 592 597 * Validate the header and read the root stream. 593 598 */ 594 if (Pdb20ValidateHeader(p Hdr, cbFile))595 return 1; 596 pRoot = Pdb20AllocAndReadRoot(p Hdr);599 if (Pdb20ValidateHeader(pThis, pHdr, cbFile)) 600 return 1; 601 pRoot = Pdb20AllocAndReadRoot(pThis, pHdr); 597 602 if (!pRoot) 598 603 return 1; … … 608 613 if (pRoot->aStreams[iStream].cbStream == ~(KU32)0) 609 614 continue; 610 pbStream = (KU8 *)Pdb20AllocAndReadStream(p Hdr, pRoot, iStream, NULL);615 pbStream = (KU8 *)Pdb20AllocAndReadStream(pThis, pHdr, pRoot, iStream, NULL); 611 616 if (pbStream) 612 617 { 613 rc = ScanStream(p bStream, pRoot->aStreams[iStream].cbStream, "/ipm/header/", sizeof("/ipm/header/") - 1);618 rc = ScanStream(pThis, pbStream, pRoot->aStreams[iStream].cbStream, "/ipm/header/", sizeof("/ipm/header/") - 1); 614 619 free(pbStream); 615 620 } … … 626 631 * Make an attempt at parsing a Visual C++ IDB file. 627 632 */ 628 static int ProcessIDB( FILE *pInput)633 static int ProcessIDB(PKDEPIDBGLOBALS pThis, FILE *pInput) 629 634 { 630 635 size_t cbFile; … … 644 649 */ 645 650 if (!memcmp(pbFile, PDB_SIGNATURE_700, sizeof(PDB_SIGNATURE_700))) 646 rc = Pdb70Process(p bFile, cbFile);651 rc = Pdb70Process(pThis, pbFile, cbFile); 647 652 else if (!memcmp(pbFile, PDB_SIGNATURE_200, sizeof(PDB_SIGNATURE_200))) 648 rc = Pdb20Process(p bFile, cbFile);653 rc = Pdb20Process(pThis, pbFile, cbFile); 649 654 else 650 655 { 651 fprintf(stderr, "%s: error: Doesn't recognize the header of the Visual C++ IDB file.\n", argv0);656 fprintf(stderr, "%s: error: Doesn't recognize the header of the Visual C++ IDB file.\n", pThis->argv0); 652 657 rc = 1; 653 658 } … … 658 663 659 664 660 static void usage(const char *a_argv0)665 static void kDepIDBUsage(const char *a_argv0) 661 666 { 662 667 printf("usage: %s -o <output> -t <target> [-fqs] <vc idb-file>\n" … … 669 674 int kmk_builtin_kDepIDB(int argc, char *argv[], char **envp) 670 675 { 671 int i; 676 int i; 677 KDEPIDBGLOBALS This; 672 678 673 679 /* Arguments. */ … … 682 688 int fQuiet = 0; 683 689 684 argv0 = argv[0]; 690 /* Init the instance data. */ 691 This.argv0 = argv[0]; 685 692 686 693 /* … … 689 696 if (argc <= 1) 690 697 { 691 usage(argv[0]);698 kDepIDBUsage(This.argv0); 692 699 return 1; 693 700 } … … 717 724 if (pOutput) 718 725 { 719 fprintf(stderr, "%s: syntax error: only one output file!\n", argv[0]);726 fprintf(stderr, "%s: syntax error: only one output file!\n", This.argv0); 720 727 return 1; 721 728 } … … 724 731 if (++i >= argc) 725 732 { 726 fprintf(stderr, "%s: syntax error: The '-o' argument is missing the filename.\n", argv[0]);733 fprintf(stderr, "%s: syntax error: The '-o' argument is missing the filename.\n", This.argv0); 727 734 return 1; 728 735 } … … 735 742 if (!pOutput) 736 743 { 737 fprintf(stderr, "%s: error: Failed to create output file '%s'.\n", argv[0], pszOutput);744 fprintf(stderr, "%s: error: Failed to create output file '%s'.\n", This.argv0, pszOutput); 738 745 return 1; 739 746 } … … 748 755 if (pszTarget) 749 756 { 750 fprintf(stderr, "%s: syntax error: only one target!\n", argv[0]);757 fprintf(stderr, "%s: syntax error: only one target!\n", This.argv0); 751 758 return 1; 752 759 } … … 756 763 if (++i >= argc) 757 764 { 758 fprintf(stderr, "%s: syntax error: The '-t' argument is missing the target name.\n", argv[0]);765 fprintf(stderr, "%s: syntax error: The '-t' argument is missing the target name.\n", This.argv0); 759 766 return 1; 760 767 } … … 795 802 */ 796 803 case '?': 797 usage(argv[0]);804 kDepIDBUsage(This.argv0); 798 805 return 0; 799 806 case 'V': 800 807 case 'v': 801 return kbuild_version( argv[0]);808 return kbuild_version(This.argv0); 802 809 803 810 /* … … 805 812 */ 806 813 default: 807 fprintf(stderr, "%s: syntax error: Invalid argument '%s'.\n", argv[0], argv[i]);808 usage(argv[0]);814 fprintf(stderr, "%s: syntax error: Invalid argument '%s'.\n", This.argv0, argv[i]); 815 kDepIDBUsage(This.argv0); 809 816 return 1; 810 817 } … … 815 822 if (!pInput) 816 823 { 817 fprintf(stderr, "%s: error: Failed to open input file '%s'.\n", argv[0], argv[i]);824 fprintf(stderr, "%s: error: Failed to open input file '%s'.\n", This.argv0, argv[i]); 818 825 return 1; 819 826 } … … 828 835 if (++i < argc) 829 836 { 830 fprintf(stderr, "%s: syntax error: No arguments shall follow the input spec.\n", argv[0]);837 fprintf(stderr, "%s: syntax error: No arguments shall follow the input spec.\n", This.argv0); 831 838 return 1; 832 839 } … … 840 847 if (!pInput) 841 848 { 842 fprintf(stderr, "%s: syntax error: No input!\n", argv[0]);849 fprintf(stderr, "%s: syntax error: No input!\n", This.argv0); 843 850 return 1; 844 851 } 845 852 if (!pOutput) 846 853 { 847 fprintf(stderr, "%s: syntax error: No output!\n", argv[0]);854 fprintf(stderr, "%s: syntax error: No output!\n", This.argv0); 848 855 return 1; 849 856 } 850 857 if (!pszTarget) 851 858 { 852 fprintf(stderr, "%s: syntax error: No target!\n", argv[0]);859 fprintf(stderr, "%s: syntax error: No target!\n", This.argv0); 853 860 return 1; 854 861 } … … 857 864 * Do the parsing. 858 865 */ 859 i = ProcessIDB(pInput); 866 depInit(&This.Core); 867 i = ProcessIDB(&This, pInput); 860 868 fclose(pInput); 861 869 … … 865 873 if (!i) 866 874 { 867 depOptimize( fFixCase, fQuiet, NULL /*pszIgnoredExt*/);875 depOptimize(&This.Core, fFixCase, fQuiet, NULL /*pszIgnoredExt*/); 868 876 fprintf(pOutput, "%s:", pszTarget); 869 depPrint( pOutput);877 depPrint(&This.Core, pOutput); 870 878 if (fStubs) 871 depPrintStubs( pOutput);879 depPrintStubs(&This.Core, pOutput); 872 880 } 873 881 … … 878 886 { 879 887 i = 1; 880 fprintf(stderr, "%s: error: Error writing to '%s'.\n", argv[0], pszOutput);888 fprintf(stderr, "%s: error: Error writing to '%s'.\n", This.argv0, pszOutput); 881 889 } 882 890 fclose(pOutput); … … 884 892 { 885 893 if (unlink(pszOutput)) 886 fprintf(stderr, "%s: warning: failed to remove output file '%s' on failure.\n", argv[0], pszOutput);887 } 888 889 depCleanup( );894 fprintf(stderr, "%s: warning: failed to remove output file '%s' on failure.\n", This.argv0, pszOutput); 895 } 896 897 depCleanup(&This.Core); 890 898 return i; 891 899 }
Note:
See TracChangeset
for help on using the changeset viewer.