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