FIO_createFilename_fromOutDir() : * Takes a source file name and specified output directory, and * allocates memory for and returns a pointer to final path. * This function never returns an error (it may abort() in case of pb) */
| 777 | * This function never returns an error (it may abort() in case of pb) |
| 778 | */ |
| 779 | static char* |
| 780 | FIO_createFilename_fromOutDir(const char* path, const char* outDirName, const size_t suffixLen) |
| 781 | { |
| 782 | const char* filenameStart; |
| 783 | char separator; |
| 784 | char* result; |
| 785 | |
| 786 | #if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */ |
| 787 | separator = '\\'; |
| 788 | #else |
| 789 | separator = '/'; |
| 790 | #endif |
| 791 | |
| 792 | filenameStart = extractFilename(path, separator); |
| 793 | #if defined(_MSC_VER) || defined(__MINGW32__) || defined (__MSVCRT__) /* windows support */ |
| 794 | filenameStart = extractFilename(filenameStart, '/'); /* sometimes, '/' separator is also used on Windows (mingw+msys2) */ |
| 795 | #endif |
| 796 | |
| 797 | result = (char*) calloc(1, strlen(outDirName) + 1 + strlen(filenameStart) + suffixLen + 1); |
| 798 | if (!result) { |
| 799 | EXM_THROW(30, "zstd: FIO_createFilename_fromOutDir: %s", strerror(errno)); |
| 800 | } |
| 801 | |
| 802 | memcpy(result, outDirName, strlen(outDirName)); |
| 803 | if (outDirName[strlen(outDirName)-1] == separator) { |
| 804 | memcpy(result + strlen(outDirName), filenameStart, strlen(filenameStart)); |
| 805 | } else { |
| 806 | memcpy(result + strlen(outDirName), &separator, 1); |
| 807 | memcpy(result + strlen(outDirName) + 1, filenameStart, strlen(filenameStart)); |
| 808 | } |
| 809 | |
| 810 | return result; |
| 811 | } |
| 812 | |
| 813 | /* FIO_highbit64() : |
| 814 | * gives position of highest bit. |
no test coverage detected