Changeset 3167 for trunk/src/kmk/kmkbuiltin/kDepObj.c
- Timestamp:
- Mar 20, 2018, 10:47:25 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/kmkbuiltin/kDepObj.c
r3141 r3167 165 165 /** @} */ 166 166 167 168 /******************************************************************************* 169 * Global Variables * 170 *******************************************************************************/ 171 /** the executable name. */ 172 static const char *argv0 = ""; 173 static const char *g_pszFile = NULL; 167 /** 168 * Globals. 169 */ 170 typedef struct KDEPOBJGLOBALS 171 { 172 /** Core instance. */ 173 DEPGLOBALS Core; 174 /** the executable name. */ 175 const char *argv0; 176 /** The file. */ 177 const char *pszFile; 178 } KDEPOBJGLOBALS; 179 /** Pointer to kDepObj globals. */ 180 typedef KDEPOBJGLOBALS *PKDEPOBJGLOBALS; 181 174 182 175 183 … … 178 186 * 179 187 * @returns rc. 188 * @param pThis kObjDep instance data. 180 189 * @param rc The return code, for making one line return statements. 181 190 * @param pszFormat The message format string. … … 183 192 * @todo Promote this to kDep.c. 184 193 */ 185 static int kDepErr( int rc, const char *pszFormat, ...)194 static int kDepErr(PKDEPOBJGLOBALS pThis, int rc, const char *pszFormat, ...) 186 195 { 187 196 va_list va; 188 197 const char *psz; 189 const char *pszName = argv0;198 const char *pszName = pThis->argv0; 190 199 191 200 fflush(stdout); … … 195 204 pszName = psz + 1; 196 205 197 if ( g_pszFile)198 fprintf(stderr, "%s: %s: error: ", pszName, g_pszFile);206 if (pThis->pszFile) 207 fprintf(stderr, "%s: %s: error: ", pszName, pThis->pszFile); 199 208 else 200 209 fprintf(stderr, "%s: error: ", pszName); … … 245 254 * 246 255 * @returns 0 on success, 1 on failure, 2 if no dependencies was found. 256 * @param pThis The kDepObj instance data. 247 257 * @param pbFile The start of the file. 248 258 * @param cbFile The file size. 249 259 */ 250 int kDepObjOMFParse( const KU8 *pbFile, KSIZE cbFile)260 int kDepObjOMFParse(PKDEPOBJGLOBALS pThis, const KU8 *pbFile, KSIZE cbFile) 251 261 { 252 262 PCKDEPOMFHDR pHdr = (PCKDEPOMFHDR)pbFile; … … 284 294 PCKDEPOMFTHEADR pTHeadr = (PCKDEPOMFTHEADR)pHdr; 285 295 if (1 + pTHeadr->Name.cch + 1 != pHdr->cbRec) 286 return kDepErr( 1, "%#07x - Bad %cHEADR record, length mismatch.\n",296 return kDepErr(pThis, 1, "%#07x - Bad %cHEADR record, length mismatch.\n", 287 297 (const KU8*)pHdr - pbFile, pHdr->bType == KDEPOMF_THEADR ? 'T' : 'L'); 288 298 if ( ( pTHeadr->Name.cch > 2 … … 303 313 { 304 314 dprintf(("%cHEADR: %.*s\n", pHdr->bType == KDEPOMF_THEADR ? 'T' : 'L', pTHeadr->Name.cch, pTHeadr->Name.ach)); 305 depAdd( pTHeadr->Name.ach, pTHeadr->Name.cch);315 depAdd(&pThis->Core, pTHeadr->Name.ach, pTHeadr->Name.cch); 306 316 iMaybeSrc++; 307 317 } … … 315 325 316 326 if (pHdr->cbRec < 2 + 1) 317 return kDepErr( 1, "%#07x - Bad COMMENT record, too small.\n", (const KU8*)pHdr - pbFile);327 return kDepErr(pThis, 1, "%#07x - Bad COMMENT record, too small.\n", (const KU8*)pHdr - pbFile); 318 328 if (uData.pb[0] & 0x3f) 319 return kDepErr( 1, "%#07x - Bad COMMENT record, reserved flags set.\n", (const KU8*)pHdr - pbFile);329 return kDepErr(pThis, 1, "%#07x - Bad COMMENT record, reserved flags set.\n", (const KU8*)pHdr - pbFile); 320 330 uClass = uData.pb[1]; 321 331 uData.pb += 2; … … 334 344 if (pHdr->cbRec == 2 + 1) 335 345 return 0; 336 return kDepErr( 1, "%#07lx - Bad DEPENDENCY FILE record, length mismatch. (%u/%u)\n",346 return kDepErr(pThis, 1, "%#07lx - Bad DEPENDENCY FILE record, length mismatch. (%u/%u)\n", 337 347 (long)((const KU8 *)pHdr - pbFile), 338 348 K_OFFSETOF(KDEPOMFDEPFILE, Name.ach[pDep->Name.cch]) + 1, 339 349 (unsigned)(pHdr->cbRec + sizeof(*pHdr))); 340 350 } 341 depAdd( pDep->Name.ach, pDep->Name.cch);351 depAdd(&pThis->Core, pDep->Name.ach, pDep->Name.cch); 342 352 iSrc++; 343 353 break; … … 388 398 KU16 uSeg = kDepObjOMFGetIndex(&uData, &cbRecLeft); 389 399 if (uSeg == KU16_MAX) 390 return kDepErr( 1, "%#07lx - Bad LINNUM32 record\n", (long)((const KU8 *)pHdr - pbFile));400 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record\n", (long)((const KU8 *)pHdr - pbFile)); 391 401 K_NOREF(uGrp); 392 402 … … 405 415 406 416 if (cbRecLeft < 2+1+1+2+2+4) 407 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, too short\n", (long)((const KU8 *)pHdr - pbFile));417 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, too short\n", (long)((const KU8 *)pHdr - pbFile)); 408 418 cbRecLeft -= 2+1+1+2+2+4; 409 419 uLine = *uData.pu16++; … … 421 431 422 432 if (uLine != 0) 423 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, line %#x (MBZ)\n", (long)((const KU8 *)pHdr - pbFile), uLine);433 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, line %#x (MBZ)\n", (long)((const KU8 *)pHdr - pbFile), uLine); 424 434 cLinFiles = iLinFile = KU32_MAX; 425 435 if ( uLinNumType == 3 /* file names table */ … … 427 437 cLinNums = 0; /* no line numbers */ 428 438 else if (uLinNumType > 4) 429 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, type %#x unknown\n", (long)((const KU8 *)pHdr - pbFile), uLinNumType);439 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, type %#x unknown\n", (long)((const KU8 *)pHdr - pbFile), uLinNumType); 430 440 } 431 441 else … … 442 452 { 443 453 if (cbRecLeft < cbEntry) 444 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, incomplete line entry\n", (long)((const KU8 *)pHdr - pbFile));454 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, incomplete line entry\n", (long)((const KU8 *)pHdr - pbFile)); 445 455 446 456 switch (uLinNumType) … … 482 492 483 493 if (cbRecLeft < 4+4+4) 484 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, incomplete file/path table header\n", (long)((const KU8 *)pHdr - pbFile));494 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, incomplete file/path table header\n", (long)((const KU8 *)pHdr - pbFile)); 485 495 cbRecLeft -= 4+4+4; 486 496 … … 491 501 uLinNumType == 3 ? "file names" : "path", cLinFiles, cLinFiles, iFirstCol, cCols)); 492 502 if (cLinFiles == KU32_MAX) 493 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, too many file/path table entries.\n", (long)((const KU8 *)pHdr - pbFile));503 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, too many file/path table entries.\n", (long)((const KU8 *)pHdr - pbFile)); 494 504 iLinFile = 0; 495 505 } … … 500 510 int cbName = *uData.pb++; 501 511 if (cbRecLeft < 1 + cbName) 502 return kDepErr( 1, "%#07lx - Bad LINNUM32 record, file/path table entry too long.\n", (long)((const KU8 *)pHdr - pbFile));512 return kDepErr(pThis, 1, "%#07lx - Bad LINNUM32 record, file/path table entry too long.\n", (long)((const KU8 *)pHdr - pbFile)); 503 513 iLinFile++; 504 514 dprintf(("#%" KU32_PRI": %.*s\n", iLinFile, cbName, uData.pch)); 505 515 if (uLinNumType == 3) 506 516 { 507 depAdd( uData.pch, cbName);517 depAdd(&pThis->Core, uData.pch, cbName); 508 518 iSrc++; 509 519 } … … 532 542 533 543 if (cbLeft) 534 return kDepErr( 1, "%#07x - Unexpected EOF. cbLeft=%#x\n", (const KU8*)pHdr - pbFile, cbLeft);544 return kDepErr(pThis, 1, "%#07x - Unexpected EOF. cbLeft=%#x\n", (const KU8*)pHdr - pbFile, cbLeft); 535 545 536 546 if (iSrc == 0 && iMaybeSrc <= 1) … … 574 584 * 575 585 * @returns 0 on success, 1 on failure, 2 if no dependencies was found. 586 * @param pThis The kDepObj instance data. 576 587 * @param pbSyms Pointer to the start of the symbol section. 577 588 * @param cbSyms Size of the symbol section. 578 589 */ 579 int kDepObjCOFFParseCV8SymbolSection( const KU8 *pbSyms, KU32 cbSyms)590 int kDepObjCOFFParseCV8SymbolSection(PKDEPOBJGLOBALS pThis, const KU8 *pbSyms, KU32 cbSyms) 580 591 { 581 592 char const * pchStrTab = NULL; … … 602 613 { 603 614 fprintf(stderr, "%s: CV symbol table entry at %08" KX32_PRI " is too long; cbSyms=%#" KX32_PRI "\n", 604 argv0, off, cbSyms);615 pThis->argv0, off, cbSyms); 605 616 return 1; /* FIXME */ 606 617 } … … 610 621 { 611 622 fprintf(stderr, "%s: CV symbol table entry at %08" KX32_PRI " is too long; cbData=%#" KX32_PRI " cbSyms=%#" KX32_PRI "\n", 612 argv0, off, cbData, cbSyms);623 pThis->argv0, off, cbData, cbSyms); 613 624 return 1; /* FIXME */ 614 625 } … … 634 645 dprintf(("%06" KX32_PRI " %06" KX32_PRI ": String table\n", off, cbData)); 635 646 if (pchStrTab) 636 fprintf(stderr, "%s: warning: Found yet another string table!\n", argv0);647 fprintf(stderr, "%s: warning: Found yet another string table!\n", pThis->argv0); 637 648 pchStrTab = uData.pch; 638 649 cbStrTab = cbData; … … 643 654 dprintf(("%06" KX32_PRI " %06" KX32_PRI ": Source files\n", off, cbData)); 644 655 if (uSrcFiles.pb) 645 fprintf(stderr, "%s: warning: Found yet another source files table!\n", argv0);656 fprintf(stderr, "%s: warning: Found yet another source files table!\n", pThis->argv0); 646 657 uSrcFiles = uData; 647 658 cbSrcFiles = cbData; … … 694 705 { 695 706 fprintf(stderr, "%s: CV source file entry at %08" KX32_PRI " is too long; cbSrcFiles=%#" KX32_PRI "\n", 696 argv0, off, cbSrcFiles);707 pThis->argv0, off, cbSrcFiles); 697 708 return 1; 698 709 } … … 703 714 { 704 715 fprintf(stderr, "%s: CV source file entry at %08" KX32_PRI " is too long; cbSrc=%#" KX32_PRI " cbSrcFiles=%#" KX32_PRI "\n", 705 argv0, off, cbSrc, cbSrcFiles);716 pThis->argv0, off, cbSrc, cbSrcFiles); 706 717 return 1; 707 718 } … … 711 722 { 712 723 fprintf(stderr, "%s: CV source file entry at %08" KX32_PRI " is out side the string table; offFile=%#" KX32_PRI " cbStrTab=%#" KX32_PRI "\n", 713 argv0, off, offFile, cbStrTab);724 pThis->argv0, off, offFile, cbStrTab); 714 725 return 1; 715 726 } … … 719 730 { 720 731 fprintf(stderr, "%s: CV source file entry at %08" KX32_PRI " has an empty file name; offFile=%#x" KX32_PRI "\n", 721 argv0, off, offFile);732 pThis->argv0, off, offFile); 722 733 return 1; 723 734 } … … 726 737 * Display the result and add it to the dependency database. 727 738 */ 728 depAdd( pszFile, cchFile);739 depAdd(&pThis->Core, pszFile, cchFile); 729 740 if (u16Type == 0x0110) 730 741 dprintf(("#%03" KU32_PRI ": {todo-md5-todo} '%s'\n", … … 753 764 * 754 765 * @returns 0 on success, 1 on failure, 2 if no dependencies was found. 766 * @param pThis The kDepObj instance data. 755 767 * @param pbFile The start of the file. 756 768 * @param cbFile The file size. 757 769 */ 758 int kDepObjCOFFParse( const KU8 *pbFile, KSIZE cbFile)770 int kDepObjCOFFParse(PKDEPOBJGLOBALS pThis, const KU8 *pbFile, KSIZE cbFile) 759 771 { 760 772 IMAGE_FILE_HEADER const *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile; … … 790 802 dprintf(("CV symbol table: version=%x\n", *u.pu32)); 791 803 if (*u.pu32 == 0x000000004) 792 rc = kDepObjCOFFParseCV8SymbolSection( u.pb, paSHdrs[iSHdr].SizeOfRawData);804 rc = kDepObjCOFFParseCV8SymbolSection(pThis, u.pb, paSHdrs[iSHdr].SizeOfRawData); 793 805 else 794 806 rc = 2; … … 946 958 * Read the file into memory and parse it. 947 959 */ 948 static int kDepObjProcessFile( FILE *pInput)960 static int kDepObjProcessFile(PKDEPOBJGLOBALS pThis, FILE *pInput) 949 961 { 950 962 size_t cbFile; … … 964 976 */ 965 977 if (kDepObjOMFTest(pbFile, cbFile)) 966 rc = kDepObjOMFParse(p bFile, cbFile);978 rc = kDepObjOMFParse(pThis, pbFile, cbFile); 967 979 else if (kDepObjCOFFTest(pbFile, cbFile)) 968 rc = kDepObjCOFFParse(p bFile, cbFile);980 rc = kDepObjCOFFParse(pThis, pbFile, cbFile); 969 981 else 970 982 { 971 fprintf(stderr, "%s: error: Doesn't recognize the header of the OMF/COFF file.\n", argv0);983 fprintf(stderr, "%s: error: Doesn't recognize the header of the OMF/COFF file.\n", pThis->argv0); 972 984 rc = 1; 973 985 } … … 978 990 979 991 980 static void usage(const char *a_argv0)992 static void kDebObjUsage(const char *a_argv0) 981 993 { 982 994 printf("usage: %s -o <output> -t <target> [-fqs] [-e <ignore-ext>] <OMF or COFF file>\n" … … 989 1001 int kmk_builtin_kDepObj(int argc, char *argv[], char **envp) 990 1002 { 991 int i; 1003 int i; 1004 KDEPOBJGLOBALS This; 992 1005 993 1006 /* Arguments. */ … … 1003 1016 int fQuiet = 0; 1004 1017 1005 argv0 = argv[0]; 1018 /* Init instance data. */ 1019 This.argv0 = argv[0]; 1020 This.pszFile = NULL; 1006 1021 1007 1022 /* … … 1010 1025 if (argc <= 1) 1011 1026 { 1012 usage(argv[0]);1027 kDebObjUsage(argv[0]); 1013 1028 return 1; 1014 1029 } … … 1033 1048 { 1034 1049 fprintf(stderr, "%s: syntax error: Invalid argument '%s'.\n", argv[0], argv[i]); 1035 usage(argv[0]);1050 kDebObjUsage(argv[0]); 1036 1051 return 2; 1037 1052 } … … 1148 1163 */ 1149 1164 case '?': 1150 usage(argv[0]);1165 kDebObjUsage(argv[0]); 1151 1166 return 0; 1152 1167 case 'V': … … 1159 1174 default: 1160 1175 fprintf(stderr, "%s: syntax error: Invalid argument '%s'.\n", argv[0], argv[i]); 1161 usage(argv[0]);1176 kDebObjUsage(argv[0]); 1162 1177 return 2; 1163 1178 } … … 1210 1225 * Do the parsing. 1211 1226 */ 1212 i = kDepObjProcessFile(pInput); 1227 depInit(&This.Core); 1228 i = kDepObjProcessFile(&This, pInput); 1213 1229 fclose(pInput); 1214 1230 … … 1218 1234 if (!i) 1219 1235 { 1220 depOptimize( fFixCase, fQuiet, pszIgnoreExt);1236 depOptimize(&This.Core, fFixCase, fQuiet, pszIgnoreExt); 1221 1237 fprintf(pOutput, "%s:", pszTarget); 1222 depPrint( pOutput);1238 depPrint(&This.Core, pOutput); 1223 1239 if (fStubs) 1224 depPrintStubs( pOutput);1240 depPrintStubs(&This.Core, pOutput); 1225 1241 } 1226 1242 … … 1240 1256 } 1241 1257 1242 depCleanup( );1258 depCleanup(&This.Core); 1243 1259 return i; 1244 1260 }
Note:
See TracChangeset
for help on using the changeset viewer.