18b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski/* 28b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski util.h - utility functions 38b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski Copyright (C) 2016-present, Przemyslaw Skibinski, Yann Collet 4e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 58b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski This program is free software; you can redistribute it and/or modify 68b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski it under the terms of the GNU General Public License as published by 78b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski the Free Software Foundation; either version 2 of the License, or 88b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski (at your option) any later version. 98b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski 108b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski This program is distributed in the hope that it will be useful, 118b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski but WITHOUT ANY WARRANTY; without even the implied warranty of 128b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 138b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski GNU General Public License for more details. 148b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski 158b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski You should have received a copy of the GNU General Public License along 168b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski with this program; if not, write to the Free Software Foundation, Inc., 178b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 188b8c726a5c4d5522ab7ce691c3cc6c8a7701ab60Przemyslaw Skibinski*/ 19bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski 20e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#ifndef UTIL_H_MODULE 21e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#define UTIL_H_MODULE 22e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 23e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined (__cplusplus) 24e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinskiextern "C" { 25e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 26e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 27e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 28973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski 29e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/*-**************************************** 30e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski* Dependencies 31e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski******************************************/ 32973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include "platform.h" /* PLATFORM_POSIX_VERSION */ 33973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include <stdlib.h> /* malloc */ 34973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include <stddef.h> /* size_t, ptrdiff_t */ 35973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include <stdio.h> /* fprintf */ 36973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include <sys/types.h> /* stat, utime */ 37973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include <sys/stat.h> /* stat */ 38e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_MSC_VER) 39973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski# include <sys/utime.h> /* utime */ 40973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski# include <io.h> /* _chmod */ 41e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 42bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# include <unistd.h> /* chown, stat */ 43bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# include <utime.h> /* utime */ 44e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 45973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#include <time.h> /* time */ 46e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#include <errno.h> 47e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 48e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 49973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski 50973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski/*-************************************************************** 51973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski* Basic Types 52973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski*****************************************************************/ 53973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) ) 54973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski# include <stdint.h> 55973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef uint8_t BYTE; 56973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef uint16_t U16; 57973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef int16_t S16; 58973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef uint32_t U32; 59973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef int32_t S32; 60973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef uint64_t U64; 61973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef int64_t S64; 62973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#else 63973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef unsigned char BYTE; 64973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef unsigned short U16; 65973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef signed short S16; 66973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef unsigned int U32; 67973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef signed int S32; 68973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef unsigned long long U64; 69973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski typedef signed long long S64; 70973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#endif 71973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski 72973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski 73e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/*-**************************************** 74e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski* Sleep functions: Windows - Posix - others 75e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski******************************************/ 76e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_WIN32) 77e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# include <windows.h> 78e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define SET_HIGH_PRIORITY SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS) 79e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleep(s) Sleep(1000*s) 80e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleepMilli(milli) Sleep(milli) 81bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#elif PLATFORM_POSIX_VERSION >= 0 /* Unix-like operating system */ 82e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# include <unistd.h> 83e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# include <sys/resource.h> /* setpriority */ 84e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# include <time.h> /* clock_t, nanosleep, clock, CLOCKS_PER_SEC */ 85e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# if defined(PRIO_PROCESS) 86e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define SET_HIGH_PRIORITY setpriority(PRIO_PROCESS, 0, -20) 87e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# else 88e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define SET_HIGH_PRIORITY /* disabled */ 89e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# endif 90e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleep(s) sleep(s) 91bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# if (defined(__linux__) && (PLATFORM_POSIX_VERSION >= 199309L)) || (PLATFORM_POSIX_VERSION >= 200112L) /* nanosleep requires POSIX.1-2001 */ 92e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleepMilli(milli) { struct timespec t; t.tv_sec=0; t.tv_nsec=milli*1000000ULL; nanosleep(&t, NULL); } 93e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# else 94e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleepMilli(milli) /* disabled */ 95e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# endif 96e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 97e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define SET_HIGH_PRIORITY /* disabled */ 98e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleep(s) /* disabled */ 99e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_sleepMilli(milli) /* disabled */ 100e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 101e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 102e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 103bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski/* ************************************* 104bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski* Constants 105bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski***************************************/ 106bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#define LIST_SIZE_INCREASE (8*1024) 107bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski 108bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski 109e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/*-**************************************** 110bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski* Compiler specifics 111bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski******************************************/ 112973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#if defined(__INTEL_COMPILER) 113973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski# pragma warning(disable : 177) /* disable: message #177: function was declared but never referenced, useful with UTIL_STATIC */ 114973bc79740f571c2b6700cab16a319df9aed2a05Przemyslaw Skibinski#endif 115bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#if defined(__GNUC__) 116bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# define UTIL_STATIC static __attribute__((unused)) 117bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) 118bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# define UTIL_STATIC static inline 119bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#elif defined(_MSC_VER) 120bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# define UTIL_STATIC static __inline 121bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#else 122bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski# define UTIL_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ 123bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#endif 124bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski 125bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski 126bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski/*-**************************************** 127e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski* Time functions 128e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski******************************************/ 129e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if !defined(_WIN32) 130e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski typedef clock_t UTIL_time_t; 131e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC void UTIL_initTimer(UTIL_time_t* ticksPerSecond) { *ticksPerSecond=0; } 132e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC void UTIL_getTime(UTIL_time_t* x) { *x = clock(); } 133e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC U64 UTIL_getSpanTimeMicro(UTIL_time_t ticksPerSecond, UTIL_time_t clockStart, UTIL_time_t clockEnd) { (void)ticksPerSecond; return 1000000ULL * (clockEnd - clockStart) / CLOCKS_PER_SEC; } 134e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC U64 UTIL_getSpanTimeNano(UTIL_time_t ticksPerSecond, UTIL_time_t clockStart, UTIL_time_t clockEnd) { (void)ticksPerSecond; return 1000000000ULL * (clockEnd - clockStart) / CLOCKS_PER_SEC; } 135e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 136e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski typedef LARGE_INTEGER UTIL_time_t; 137e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC void UTIL_initTimer(UTIL_time_t* ticksPerSecond) { if (!QueryPerformanceFrequency(ticksPerSecond)) fprintf(stderr, "ERROR: QueryPerformance not present\n"); } 138e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC void UTIL_getTime(UTIL_time_t* x) { QueryPerformanceCounter(x); } 139e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC U64 UTIL_getSpanTimeMicro(UTIL_time_t ticksPerSecond, UTIL_time_t clockStart, UTIL_time_t clockEnd) { return 1000000ULL*(clockEnd.QuadPart - clockStart.QuadPart)/ticksPerSecond.QuadPart; } 140e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_STATIC U64 UTIL_getSpanTimeNano(UTIL_time_t ticksPerSecond, UTIL_time_t clockStart, UTIL_time_t clockEnd) { return 1000000000ULL*(clockEnd.QuadPart - clockStart.QuadPart)/ticksPerSecond.QuadPart; } 141e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 142e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 143e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 144e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/* returns time span in microseconds */ 145e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC U64 UTIL_clockSpanMicro( UTIL_time_t clockStart, UTIL_time_t ticksPerSecond ) 146e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 147e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_time_t clockEnd; 148e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_getTime(&clockEnd); 149e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return UTIL_getSpanTimeMicro(ticksPerSecond, clockStart, clockEnd); 150e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 151e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 152e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 153e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC void UTIL_waitForNextTick(UTIL_time_t ticksPerSecond) 154e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 155e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_time_t clockStart, clockEnd; 156e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_getTime(&clockStart); 157e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski do { 158e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski UTIL_getTime(&clockEnd); 159e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } while (UTIL_getSpanTimeNano(ticksPerSecond, clockStart, clockEnd) == 0); 160e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 161e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 162e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 163e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 164e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/*-**************************************** 165e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski* File functions 166e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski******************************************/ 167e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_MSC_VER) 168e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski #define chmod _chmod 169e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski typedef struct _stat64 stat_t; 170e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 171e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski typedef struct stat stat_t; 172e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 173e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 174e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 175e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC int UTIL_setFileStat(const char *filename, stat_t *statbuf) 176e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 177e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int res = 0; 178e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct utimbuf timebuf; 179e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 180e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski timebuf.actime = time(NULL); 181e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski timebuf.modtime = statbuf->st_mtime; 182e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski res += utime(filename, &timebuf); /* set access and modification times */ 183e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 184e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if !defined(_WIN32) 185e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski res += chown(filename, statbuf->st_uid, statbuf->st_gid); /* Copy ownership */ 186e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 187e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 188e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski res += chmod(filename, statbuf->st_mode & 07777); /* Copy file permissions */ 189e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 190e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski errno = 0; 191e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return -res; /* number of errors is returned */ 192e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 193e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 194e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 195e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC int UTIL_getFileStat(const char* infilename, stat_t *statbuf) 196e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 197e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int r; 198e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_MSC_VER) 199e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = _stat64(infilename, statbuf); 200e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (r || !(statbuf->st_mode & S_IFREG)) return 0; /* No good... */ 201e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 202e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = stat(infilename, statbuf); 203e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (r || !S_ISREG(statbuf->st_mode)) return 0; /* No good... */ 204e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 205e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return 1; 206e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 207e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 208e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 209e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC U64 UTIL_getFileSize(const char* infilename) 210e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 211e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int r; 212e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_MSC_VER) 213e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct _stat64 statbuf; 214e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = _stat64(infilename, &statbuf); 215e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (r || !(statbuf.st_mode & S_IFREG)) return 0; /* No good... */ 216e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 217e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct stat statbuf; 218e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = stat(infilename, &statbuf); 219e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (r || !S_ISREG(statbuf.st_mode)) return 0; /* No good... */ 220e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 221e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return (U64)statbuf.st_size; 222e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 223e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 224e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 225e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC U64 UTIL_getTotalFileSize(const char** fileNamesTable, unsigned nbFiles) 226e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 227e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski U64 total = 0; 228e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski unsigned n; 229e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski for (n=0; n<nbFiles; n++) 230e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski total += UTIL_getFileSize(fileNamesTable[n]); 231e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return total; 232e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 233e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 234e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 235e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC int UTIL_doesFileExists(const char* infilename) 236e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 237e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int r; 238e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_MSC_VER) 239e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct _stat64 statbuf; 240e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = _stat64(infilename, &statbuf); 241e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (r || !(statbuf.st_mode & S_IFREG)) return 0; /* No good... */ 242e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 243e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct stat statbuf; 244e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = stat(infilename, &statbuf); 245e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (r || !S_ISREG(statbuf.st_mode)) return 0; /* No good... */ 246e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 247e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return 1; 248e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 249e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 250e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 251e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC U32 UTIL_isDirectory(const char* infilename) 252e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 253e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int r; 254e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined(_MSC_VER) 255e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct _stat64 statbuf; 256e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = _stat64(infilename, &statbuf); 257e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!r && (statbuf.st_mode & _S_IFDIR)) return 1; 258e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 259e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct stat statbuf; 260e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski r = stat(infilename, &statbuf); 261e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!r && S_ISDIR(statbuf.st_mode)) return 1; 262e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 263e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return 0; 264e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 265e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 266e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/* 267e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski * A modified version of realloc(). 268e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski * If UTIL_realloc() fails the original block is freed. 269e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski*/ 270e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC void *UTIL_realloc(void *ptr, size_t size) 271e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 272e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski void *newptr = realloc(ptr, size); 273e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (newptr) return newptr; 274e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski free(ptr); 275e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return NULL; 276e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 277e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 278e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 279e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#ifdef _WIN32 280e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_HAS_CREATEFILELIST 281e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 282e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC int UTIL_prepareFileList(const char *dirName, char** bufStart, size_t* pos, char** bufEnd) 283e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 284e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski char* path; 285e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int dirLength, fnameLength, pathLength, nbFiles = 0; 286fea95c156761ee10d32a4f12105ebd90c67d4f47Przemyslaw Skibinski WIN32_FIND_DATAA cFile; 287e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski HANDLE hFile; 288e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 289e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski dirLength = (int)strlen(dirName); 290e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path = (char*) malloc(dirLength + 3); 291e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!path) return 0; 292e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 293e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski memcpy(path, dirName, dirLength); 294e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[dirLength] = '\\'; 295e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[dirLength+1] = '*'; 296e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[dirLength+2] = 0; 297e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 298fea95c156761ee10d32a4f12105ebd90c67d4f47Przemyslaw Skibinski hFile=FindFirstFileA(path, &cFile); 299e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (hFile == INVALID_HANDLE_VALUE) { 300e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fprintf(stderr, "Cannot open directory '%s'\n", dirName); 301e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return 0; 302e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 303e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski free(path); 304e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 305e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski do { 306e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fnameLength = (int)strlen(cFile.cFileName); 307e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path = (char*) malloc(dirLength + fnameLength + 2); 308e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!path) { FindClose(hFile); return 0; } 309e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski memcpy(path, dirName, dirLength); 310e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[dirLength] = '\\'; 311e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski memcpy(path+dirLength+1, cFile.cFileName, fnameLength); 312e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski pathLength = dirLength+1+fnameLength; 313e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[pathLength] = 0; 314e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (cFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { 315e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (strcmp (cFile.cFileName, "..") == 0 || 316e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski strcmp (cFile.cFileName, ".") == 0) continue; 317e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 318e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski nbFiles += UTIL_prepareFileList(path, bufStart, pos, bufEnd); /* Recursively call "UTIL_prepareFileList" with the new path. */ 319e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart == NULL) { free(path); FindClose(hFile); return 0; } 320e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 321e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski else if ((cFile.dwFileAttributes & FILE_ATTRIBUTE_NORMAL) || (cFile.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) || (cFile.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED)) { 322e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart + *pos + pathLength >= *bufEnd) { 323e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski ptrdiff_t newListSize = (*bufEnd - *bufStart) + LIST_SIZE_INCREASE; 324e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *bufStart = (char*)UTIL_realloc(*bufStart, newListSize); 325e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *bufEnd = *bufStart + newListSize; 326e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart == NULL) { free(path); FindClose(hFile); return 0; } 327e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 328e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart + *pos + pathLength < *bufEnd) { 329e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski strncpy(*bufStart + *pos, path, *bufEnd - (*bufStart + *pos)); 330e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *pos += pathLength + 1; 331e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski nbFiles++; 332e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 333e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 334e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski free(path); 335fea95c156761ee10d32a4f12105ebd90c67d4f47Przemyslaw Skibinski } while (FindNextFileA(hFile, &cFile)); 336e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 337e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski FindClose(hFile); 338e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return nbFiles; 339e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 340e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 341bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski#elif defined(__linux__) || (PLATFORM_POSIX_VERSION >= 200112L) /* opendir, readdir require POSIX.1-2001 */ 342e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# define UTIL_HAS_CREATEFILELIST 343e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski# include <dirent.h> /* opendir, readdir */ 3442efedaf7dc8f20d2e5761ee600712bdb0371bc5cPrzemyslaw Skibinski# include <string.h> /* strerror, memcpy */ 345e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 346e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC int UTIL_prepareFileList(const char *dirName, char** bufStart, size_t* pos, char** bufEnd) 347e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 348e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski DIR *dir; 349e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski struct dirent *entry; 350e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski char* path; 351e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski int dirLength, fnameLength, pathLength, nbFiles = 0; 352e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 353e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!(dir = opendir(dirName))) { 354e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fprintf(stderr, "Cannot open directory '%s': %s\n", dirName, strerror(errno)); 355e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return 0; 356e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 357e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 358e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski dirLength = (int)strlen(dirName); 359e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski errno = 0; 360e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski while ((entry = readdir(dir)) != NULL) { 361e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (strcmp (entry->d_name, "..") == 0 || 362e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski strcmp (entry->d_name, ".") == 0) continue; 363e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fnameLength = (int)strlen(entry->d_name); 364e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path = (char*) malloc(dirLength + fnameLength + 2); 365e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!path) { closedir(dir); return 0; } 366e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski memcpy(path, dirName, dirLength); 367e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[dirLength] = '/'; 368e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski memcpy(path+dirLength+1, entry->d_name, fnameLength); 369e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski pathLength = dirLength+1+fnameLength; 370e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski path[pathLength] = 0; 371e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 372e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (UTIL_isDirectory(path)) { 373e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski nbFiles += UTIL_prepareFileList(path, bufStart, pos, bufEnd); /* Recursively call "UTIL_prepareFileList" with the new path. */ 374e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart == NULL) { free(path); closedir(dir); return 0; } 375e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } else { 376e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart + *pos + pathLength >= *bufEnd) { 377e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski ptrdiff_t newListSize = (*bufEnd - *bufStart) + LIST_SIZE_INCREASE; 378e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *bufStart = (char*)UTIL_realloc(*bufStart, newListSize); 379e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *bufEnd = *bufStart + newListSize; 380e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart == NULL) { free(path); closedir(dir); return 0; } 381e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 382e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (*bufStart + *pos + pathLength < *bufEnd) { 383e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski strncpy(*bufStart + *pos, path, *bufEnd - (*bufStart + *pos)); 384e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *pos += pathLength + 1; 385e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski nbFiles++; 386e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 387e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 388e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski free(path); 389e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski errno = 0; /* clear errno after UTIL_isDirectory, UTIL_prepareFileList */ 390e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 391e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 392e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (errno != 0) { 393e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fprintf(stderr, "readdir(%s) error: %s\n", dirName, strerror(errno)); 394e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski free(*bufStart); 395e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *bufStart = NULL; 396e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 397e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski closedir(dir); 398e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return nbFiles; 399e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 400e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 401e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#else 402e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 403e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC int UTIL_prepareFileList(const char *dirName, char** bufStart, size_t* pos, char** bufEnd) 404e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 405e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski (void)bufStart; (void)bufEnd; (void)pos; 406bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski fprintf(stderr, "Directory %s ignored (compiled without _WIN32 or _POSIX_C_SOURCE)\n", dirName); 407e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return 0; 408e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 409e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 410e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif /* #ifdef _WIN32 */ 411e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 412e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski/* 413e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski * UTIL_createFileList - takes a list of files and directories (params: inputNames, inputNamesNb), scans directories, 414e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski * and returns a new list of files (params: return value, allocatedBuffer, allocatedNamesNb). 415e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski * After finishing usage of the list the structures should be freed with UTIL_freeFileList(params: return value, allocatedBuffer) 416e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski * In case of error UTIL_createFileList returns NULL and UTIL_freeFileList should not be called. 417e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski */ 418e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC const char** UTIL_createFileList(const char **inputNames, unsigned inputNamesNb, char** allocatedBuffer, unsigned* allocatedNamesNb) 419e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 420e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski size_t pos; 421e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski unsigned i, nbFiles; 422bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski char* buf = (char*)malloc(LIST_SIZE_INCREASE); 423bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski char* bufend = buf + LIST_SIZE_INCREASE; 424e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski const char** fileTable; 425e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 426e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!buf) return NULL; 427e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 428e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski for (i=0, pos=0, nbFiles=0; i<inputNamesNb; i++) { 429e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!UTIL_isDirectory(inputNames[i])) { 430bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski size_t const len = strlen(inputNames[i]); 431e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (buf + pos + len >= bufend) { 432e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski ptrdiff_t newListSize = (bufend - buf) + LIST_SIZE_INCREASE; 433e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski buf = (char*)UTIL_realloc(buf, newListSize); 434e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski bufend = buf + newListSize; 435e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!buf) return NULL; 436e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 437e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (buf + pos + len < bufend) { 438e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski strncpy(buf + pos, inputNames[i], bufend - (buf + pos)); 439e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski pos += len + 1; 440e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski nbFiles++; 441e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 442e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } else { 443e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski nbFiles += UTIL_prepareFileList(inputNames[i], &buf, &pos, &bufend); 444e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (buf == NULL) return NULL; 445e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } } 446e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 447e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (nbFiles == 0) { free(buf); return NULL; } 448e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 449e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fileTable = (const char**)malloc((nbFiles+1) * sizeof(const char*)); 450e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (!fileTable) { free(buf); return NULL; } 451e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 452bb69cdf2583a56c6c703f5b91aae0632912f5a8aPrzemyslaw Skibinski for (i=0, pos=0; i<nbFiles; i++) { 453e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski fileTable[i] = buf + pos; 454e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski pos += strlen(fileTable[i]) + 1; 455e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski } 456e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 457e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (buf + pos > bufend) { free(buf); free((void*)fileTable); return NULL; } 458e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 459e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *allocatedBuffer = buf; 460e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski *allocatedNamesNb = nbFiles; 461e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 462e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski return fileTable; 463e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 464e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 465e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 466e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw SkibinskiUTIL_STATIC void UTIL_freeFileList(const char** filenameTable, char* allocatedBuffer) 467e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski{ 468e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (allocatedBuffer) free(allocatedBuffer); 469e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski if (filenameTable) free((void*)filenameTable); 470e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 471e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 472e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 473e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#if defined (__cplusplus) 474e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski} 475e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif 476e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski 477e7648f4fcca64b7b87a0591a65e43e0de1e69e82Przemyslaw Skibinski#endif /* UTIL_H_MODULE */ 478