| 456 | } |
| 457 | |
| 458 | FileNamesTable* |
| 459 | UTIL_mergeFileNamesTable(FileNamesTable* table1, FileNamesTable* table2) |
| 460 | { |
| 461 | unsigned newTableIdx = 0; |
| 462 | size_t pos = 0; |
| 463 | size_t newTotalTableSize; |
| 464 | char* buf; |
| 465 | |
| 466 | FileNamesTable* const newTable = UTIL_assembleFileNamesTable(NULL, 0, NULL); |
| 467 | CONTROL( newTable != NULL ); |
| 468 | |
| 469 | newTotalTableSize = getTotalTableSize(table1) + getTotalTableSize(table2); |
| 470 | |
| 471 | buf = (char*) calloc(newTotalTableSize, sizeof(*buf)); |
| 472 | CONTROL ( buf != NULL ); |
| 473 | |
| 474 | newTable->buf = buf; |
| 475 | newTable->tableSize = table1->tableSize + table2->tableSize; |
| 476 | newTable->fileNames = (const char **) calloc(newTable->tableSize, sizeof(*(newTable->fileNames))); |
| 477 | CONTROL ( newTable->fileNames != NULL ); |
| 478 | |
| 479 | { unsigned idx1; |
| 480 | for( idx1=0 ; (idx1 < table1->tableSize) && table1->fileNames[idx1] && (pos < newTotalTableSize); ++idx1, ++newTableIdx) { |
| 481 | size_t const curLen = strlen(table1->fileNames[idx1]); |
| 482 | memcpy(buf+pos, table1->fileNames[idx1], curLen); |
| 483 | assert(newTableIdx <= newTable->tableSize); |
| 484 | newTable->fileNames[newTableIdx] = buf+pos; |
| 485 | pos += curLen+1; |
| 486 | } } |
| 487 | |
| 488 | { unsigned idx2; |
| 489 | for( idx2=0 ; (idx2 < table2->tableSize) && table2->fileNames[idx2] && (pos < newTotalTableSize) ; ++idx2, ++newTableIdx) { |
| 490 | size_t const curLen = strlen(table2->fileNames[idx2]); |
| 491 | memcpy(buf+pos, table2->fileNames[idx2], curLen); |
| 492 | assert(newTableIdx <= newTable->tableSize); |
| 493 | newTable->fileNames[newTableIdx] = buf+pos; |
| 494 | pos += curLen+1; |
| 495 | } } |
| 496 | assert(pos <= newTotalTableSize); |
| 497 | newTable->tableSize = newTableIdx; |
| 498 | |
| 499 | UTIL_freeFileNamesTable(table1); |
| 500 | UTIL_freeFileNamesTable(table2); |
| 501 | |
| 502 | return newTable; |
| 503 | } |
| 504 | |
| 505 | #ifdef _WIN32 |
| 506 | static int UTIL_prepareFileList(const char* dirName, |
no test coverage detected