xref: /aosp_15_r20/external/libjpeg-turbo/jinclude.h (revision dfc6aa5c1cfd4bc4e2018dc74aa96e29ee49c6da)
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