xref: /aosp_15_r20/external/zstd/programs/fileio_common.h (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui /*
2*01826a49SYabin Cui  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui  * All rights reserved.
4*01826a49SYabin Cui  *
5*01826a49SYabin Cui  * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui  * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui  * You may select, at your option, one of the above-listed licenses.
9*01826a49SYabin Cui  */
10*01826a49SYabin Cui 
11*01826a49SYabin Cui #ifndef ZSTD_FILEIO_COMMON_H
12*01826a49SYabin Cui #define ZSTD_FILEIO_COMMON_H
13*01826a49SYabin Cui 
14*01826a49SYabin Cui #if defined (__cplusplus)
15*01826a49SYabin Cui extern "C" {
16*01826a49SYabin Cui #endif
17*01826a49SYabin Cui 
18*01826a49SYabin Cui #include "../lib/common/mem.h"     /* U32, U64 */
19*01826a49SYabin Cui #include "fileio_types.h"
20*01826a49SYabin Cui #include "platform.h"
21*01826a49SYabin Cui #include "timefn.h"     /* UTIL_getTime, UTIL_clockSpanMicro */
22*01826a49SYabin Cui 
23*01826a49SYabin Cui /*-*************************************
24*01826a49SYabin Cui *  Macros
25*01826a49SYabin Cui ***************************************/
26*01826a49SYabin Cui #define KB *(1 <<10)
27*01826a49SYabin Cui #define MB *(1 <<20)
28*01826a49SYabin Cui #define GB *(1U<<30)
29*01826a49SYabin Cui #undef MAX
30*01826a49SYabin Cui #define MAX(a,b) ((a)>(b) ? (a) : (b))
31*01826a49SYabin Cui 
32*01826a49SYabin Cui extern FIO_display_prefs_t g_display_prefs;
33*01826a49SYabin Cui 
34*01826a49SYabin Cui #define DISPLAY(...)         fprintf(stderr, __VA_ARGS__)
35*01826a49SYabin Cui #define DISPLAYOUT(...)      fprintf(stdout, __VA_ARGS__)
36*01826a49SYabin Cui #define DISPLAYLEVEL(l, ...) { if (g_display_prefs.displayLevel>=l) { DISPLAY(__VA_ARGS__); } }
37*01826a49SYabin Cui 
38*01826a49SYabin Cui extern UTIL_time_t g_displayClock;
39*01826a49SYabin Cui 
40*01826a49SYabin Cui #define REFRESH_RATE  ((U64)(SEC_TO_MICRO / 6))
41*01826a49SYabin Cui #define READY_FOR_UPDATE() (UTIL_clockSpanMicro(g_displayClock) > REFRESH_RATE || g_display_prefs.displayLevel >= 4)
42*01826a49SYabin Cui #define DELAY_NEXT_UPDATE() { g_displayClock = UTIL_getTime(); }
43*01826a49SYabin Cui #define DISPLAYUPDATE(l, ...) {                              \
44*01826a49SYabin Cui         if (g_display_prefs.displayLevel>=l && (g_display_prefs.progressSetting != FIO_ps_never)) { \
45*01826a49SYabin Cui             if (READY_FOR_UPDATE()) { \
46*01826a49SYabin Cui                 DELAY_NEXT_UPDATE();                         \
47*01826a49SYabin Cui                 DISPLAY(__VA_ARGS__);                        \
48*01826a49SYabin Cui                 if (g_display_prefs.displayLevel>=4) fflush(stderr);       \
49*01826a49SYabin Cui     }   }   }
50*01826a49SYabin Cui 
51*01826a49SYabin Cui #define SHOULD_DISPLAY_SUMMARY() \
52*01826a49SYabin Cui     (g_display_prefs.displayLevel >= 2 || g_display_prefs.progressSetting == FIO_ps_always)
53*01826a49SYabin Cui #define SHOULD_DISPLAY_PROGRESS()                       \
54*01826a49SYabin Cui     (g_display_prefs.progressSetting != FIO_ps_never && SHOULD_DISPLAY_SUMMARY())
55*01826a49SYabin Cui #define DISPLAY_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYLEVEL(1, __VA_ARGS__); }}
56*01826a49SYabin Cui #define DISPLAYUPDATE_PROGRESS(...) { if (SHOULD_DISPLAY_PROGRESS()) { DISPLAYUPDATE(1, __VA_ARGS__); }}
57*01826a49SYabin Cui #define DISPLAY_SUMMARY(...) { if (SHOULD_DISPLAY_SUMMARY()) { DISPLAYLEVEL(1, __VA_ARGS__); } }
58*01826a49SYabin Cui 
59*01826a49SYabin Cui #undef MIN  /* in case it would be already defined */
60*01826a49SYabin Cui #define MIN(a,b)    ((a) < (b) ? (a) : (b))
61*01826a49SYabin Cui 
62*01826a49SYabin Cui 
63*01826a49SYabin Cui #define EXM_THROW(error, ...)                                             \
64*01826a49SYabin Cui {                                                                         \
65*01826a49SYabin Cui     DISPLAYLEVEL(1, "zstd: ");                                            \
66*01826a49SYabin Cui     DISPLAYLEVEL(5, "Error defined at %s, line %i : \n", __FILE__, __LINE__); \
67*01826a49SYabin Cui     DISPLAYLEVEL(1, "error %i : ", error);                                \
68*01826a49SYabin Cui     DISPLAYLEVEL(1, __VA_ARGS__);                                         \
69*01826a49SYabin Cui     DISPLAYLEVEL(1, " \n");                                               \
70*01826a49SYabin Cui     exit(error);                                                          \
71*01826a49SYabin Cui }
72*01826a49SYabin Cui 
73*01826a49SYabin Cui #define CHECK_V(v, f)                                \
74*01826a49SYabin Cui     v = f;                                           \
75*01826a49SYabin Cui     if (ZSTD_isError(v)) {                           \
76*01826a49SYabin Cui         DISPLAYLEVEL(5, "%s \n", #f);                \
77*01826a49SYabin Cui         EXM_THROW(11, "%s", ZSTD_getErrorName(v));   \
78*01826a49SYabin Cui     }
79*01826a49SYabin Cui #define CHECK(f) { size_t err; CHECK_V(err, f); }
80*01826a49SYabin Cui 
81*01826a49SYabin Cui 
82*01826a49SYabin Cui /* Avoid fseek()'s 2GiB barrier with MSVC, macOS, *BSD, MinGW */
83*01826a49SYabin Cui #if defined(_MSC_VER) && _MSC_VER >= 1400
84*01826a49SYabin Cui #   define LONG_SEEK _fseeki64
85*01826a49SYabin Cui #   define LONG_TELL _ftelli64
86*01826a49SYabin Cui #elif !defined(__64BIT__) && (PLATFORM_POSIX_VERSION >= 200112L) /* No point defining Large file for 64 bit */
87*01826a49SYabin Cui #  define LONG_SEEK fseeko
88*01826a49SYabin Cui #  define LONG_TELL ftello
89*01826a49SYabin Cui #elif defined(__MINGW32__) && !defined(__STRICT_ANSI__) && !defined(__NO_MINGW_LFS) && defined(__MSVCRT__)
90*01826a49SYabin Cui #   define LONG_SEEK fseeko64
91*01826a49SYabin Cui #   define LONG_TELL ftello64
92*01826a49SYabin Cui #elif defined(_WIN32) && !defined(__DJGPP__)
93*01826a49SYabin Cui #   include <windows.h>
LONG_SEEK(FILE * file,__int64 offset,int origin)94*01826a49SYabin Cui     static int LONG_SEEK(FILE* file, __int64 offset, int origin) {
95*01826a49SYabin Cui         LARGE_INTEGER off;
96*01826a49SYabin Cui         DWORD method;
97*01826a49SYabin Cui         off.QuadPart = offset;
98*01826a49SYabin Cui         if (origin == SEEK_END)
99*01826a49SYabin Cui             method = FILE_END;
100*01826a49SYabin Cui         else if (origin == SEEK_CUR)
101*01826a49SYabin Cui             method = FILE_CURRENT;
102*01826a49SYabin Cui         else
103*01826a49SYabin Cui             method = FILE_BEGIN;
104*01826a49SYabin Cui 
105*01826a49SYabin Cui         if (SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, NULL, method))
106*01826a49SYabin Cui             return 0;
107*01826a49SYabin Cui         else
108*01826a49SYabin Cui             return -1;
109*01826a49SYabin Cui     }
LONG_TELL(FILE * file)110*01826a49SYabin Cui     static __int64 LONG_TELL(FILE* file) {
111*01826a49SYabin Cui         LARGE_INTEGER off, newOff;
112*01826a49SYabin Cui         off.QuadPart = 0;
113*01826a49SYabin Cui         newOff.QuadPart = 0;
114*01826a49SYabin Cui         SetFilePointerEx((HANDLE) _get_osfhandle(_fileno(file)), off, &newOff, FILE_CURRENT);
115*01826a49SYabin Cui         return newOff.QuadPart;
116*01826a49SYabin Cui     }
117*01826a49SYabin Cui #else
118*01826a49SYabin Cui #   define LONG_SEEK fseek
119*01826a49SYabin Cui #   define LONG_TELL ftell
120*01826a49SYabin Cui #endif
121*01826a49SYabin Cui 
122*01826a49SYabin Cui #if defined (__cplusplus)
123*01826a49SYabin Cui }
124*01826a49SYabin Cui #endif
125*01826a49SYabin Cui #endif /* ZSTD_FILEIO_COMMON_H */
126