jinclude.h (3188B)
1 /* 2 * jinclude.h 3 * 4 * This file was part of the Independent JPEG Group's software: 5 * Copyright (C) 1991-1994, Thomas G. Lane. 6 * libjpeg-turbo Modifications: 7 * Copyright (C) 2022-2023, D. R. Commander. 8 * For conditions of distribution and use, see the accompanying README.ijg 9 * file. 10 * 11 * This file exists to provide a single place to fix any problems with 12 * including the wrong system include files. (Common problems are taken 13 * care of by the standard jconfig symbols, but on really weird systems 14 * you may have to edit this file.) 15 * 16 * NOTE: this file is NOT intended to be included by applications using the 17 * JPEG library. Most applications need only include jpeglib.h. 18 */ 19 20 #ifndef __JINCLUDE_H__ 21 #define __JINCLUDE_H__ 22 23 /* Include auto-config file to find out which system include files we need. */ 24 25 #include "jconfig.h" /* auto configuration options */ 26 #include "jconfigint.h" 27 #define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ 28 29 /* 30 * Note that the core JPEG library does not require <stdio.h>; 31 * only the default error handler and data source/destination modules do. 32 * But we must pull it in because of the references to FILE in jpeglib.h. 33 * You can remove those references if you want to compile without <stdio.h>. 34 */ 35 36 #include <stddef.h> 37 #include <stdlib.h> 38 #include <stdio.h> 39 #include <string.h> 40 41 /* 42 * These macros/inline functions facilitate using Microsoft's "safe string" 43 * functions with Visual Studio builds without the need to scatter #ifdefs 44 * throughout the code base. 45 */ 46 47 48 #ifdef _MSC_VER 49 50 #define SNPRINTF(str, n, format, ...) \ 51 _snprintf_s(str, n, _TRUNCATE, format, ##__VA_ARGS__) 52 53 #else 54 55 #define SNPRINTF snprintf 56 57 #endif 58 59 60 #ifndef NO_GETENV 61 62 #ifdef _MSC_VER 63 64 static INLINE int GETENV_S(char *buffer, size_t buffer_size, const char *name) 65 { 66 size_t required_size; 67 68 return (int)getenv_s(&required_size, buffer, buffer_size, name); 69 } 70 71 #else /* _MSC_VER */ 72 73 #include <errno.h> 74 75 /* This provides a similar interface to the Microsoft/C11 getenv_s() function, 76 * but other than parameter validation, it has no advantages over getenv(). 77 */ 78 79 static INLINE int GETENV_S(char *buffer, size_t buffer_size, const char *name) 80 { 81 char *env; 82 83 if (!buffer) { 84 if (buffer_size == 0) 85 return 0; 86 else 87 return (errno = EINVAL); 88 } 89 if (buffer_size == 0) 90 return (errno = EINVAL); 91 if (!name) { 92 *buffer = 0; 93 return 0; 94 } 95 96 env = getenv(name); 97 if (!env) 98 { 99 *buffer = 0; 100 return 0; 101 } 102 103 if (strlen(env) + 1 > buffer_size) { 104 *buffer = 0; 105 return ERANGE; 106 } 107 108 strncpy(buffer, env, buffer_size); 109 110 return 0; 111 } 112 113 #endif /* _MSC_VER */ 114 115 #endif /* NO_GETENV */ 116 117 118 #ifndef NO_PUTENV 119 120 #ifdef _WIN32 121 122 #define PUTENV_S(name, value) _putenv_s(name, value) 123 124 #else 125 126 #include <errno.h> 127 128 /* This provides a similar interface to the Microsoft _putenv_s() function, but 129 * other than parameter validation, it has no advantages over setenv(). 130 */ 131 132 static INLINE int PUTENV_S(const char *name, const char *value) 133 { 134 if (!name || !value) 135 return (errno = EINVAL); 136 137 setenv(name, value, 1); 138 139 return errno; 140 } 141 142 #endif /* _WIN32 */ 143 144 #endif /* NO_PUTENV */ 145 146 147 #endif /* JINCLUDE_H */