1 /* glpenv.h (GLPK environment) */
2 
3 /***********************************************************************
4 *  This code is part of GLPK (GNU Linear Programming Kit).
5 *
6 *  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
7 *  2009, 2010 Andrew Makhorin, Department for Applied Informatics,
8 *  Moscow Aviation Institute, Moscow, Russia. All rights reserved.
9 *  E-mail: <mao@gnu.org>.
10 *
11 *  GLPK is free software: you can redistribute it and/or modify it
12 *  under the terms of the GNU General Public License as published by
13 *  the Free Software Foundation, either version 3 of the License, or
14 *  (at your option) any later version.
15 *
16 *  GLPK is distributed in the hope that it will be useful, but WITHOUT
17 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18 *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
19 *  License for more details.
20 *
21 *  You should have received a copy of the GNU General Public License
22 *  along with GLPK. If not, see <http://www.gnu.org/licenses/>.
23 ***********************************************************************/
24 
25 #ifndef GLPENV_H
26 #define GLPENV_H
27 
28 #include "glpstd.h"
29 #include "glplib.h"
30 
31 typedef struct ENV ENV;
32 typedef struct MEM MEM;
33 typedef struct XFILE XFILE;
34 
35 #define ENV_MAGIC 0x454E5631
36 /* environment block magic value */
37 
38 #define TERM_BUF_SIZE 4096
39 /* terminal output buffer size, in bytes */
40 
41 #define IOERR_MSG_SIZE 1024
42 /* i/o error message buffer size, in bytes */
43 
44 #define MEM_MAGIC 0x4D454D31
45 /* memory block descriptor magic value */
46 
47 struct ENV
48 {     /* environment block */
49       int magic;
50       /* magic value used for debugging */
51       char version[7+1];
52       /* version string returned by the routine glp_version */
53       /*--------------------------------------------------------------*/
54       /* terminal output */
55       char *term_buf; /* char term_buf[TERM_BUF_SIZE]; */
56       /* terminal output buffer */
57       int term_out;
58       /* flag to enable/disable terminal output */
59       int (*term_hook)(void *info, const char *s);
60       /* user-defined routine to intercept terminal output */
61       void *term_info;
62       /* transit pointer (cookie) passed to the routine term_hook */
63       FILE *tee_file;
64       /* output stream used to copy terminal output */
65       /*--------------------------------------------------------------*/
66       /* error handling */
67       const char *err_file;
68       /* value of the __FILE__ macro passed to glp_error */
69       int err_line;
70       /* value of the __LINE__ macro passed to glp_error */
71       void (*err_hook)(void *info);
72       /* user-defined routine to intercept abnormal termination */
73       void *err_info;
74       /* transit pointer (cookie) passed to the routine err_hook */
75       /*--------------------------------------------------------------*/
76       /* memory allocation */
77       glp_long mem_limit;
78       /* maximal amount of memory (in bytes) available for dynamic
79          allocation */
80       MEM *mem_ptr;
81       /* pointer to the linked list of allocated memory blocks */
82       int mem_count;
83       /* total number of currently allocated memory blocks */
84       int mem_cpeak;
85       /* peak value of mem_count */
86       glp_long mem_total;
87       /* total amount of currently allocated memory (in bytes; is the
88          sum of the size field over all memory block descriptors) */
89       glp_long mem_tpeak;
90       /* peak value of mem_total */
91       /*--------------------------------------------------------------*/
92       /* stream input/output */
93       XFILE *file_ptr;
94       /* pointer to the linked list of active stream descriptors */
95       char *ioerr_msg; /* char ioerr_msg[IOERR_MSG_SIZE]; */
96       /* input/output error message buffer */
97       /*--------------------------------------------------------------*/
98       /* shared libraries support */
99       void *h_odbc;
100       /* handle to ODBC shared library */
101       void *h_mysql;
102       /* handle to MySQL shared library */
103 };
104 
105 struct MEM
106 {     /* memory block descriptor */
107       int flag;
108       /* descriptor flag */
109       int size;
110       /* size of block (in bytes, including descriptor) */
111       MEM *prev;
112       /* pointer to previous memory block descriptor */
113       MEM *next;
114       /* pointer to next memory block descriptor */
115 };
116 
117 struct XFILE
118 {     /* input/output stream descriptor */
119       int type;
120       /* stream handle type: */
121 #define FH_FILE   0x11  /* FILE   */
122 #define FH_ZLIB   0x22  /* gzFile */
123       void *fh;
124       /* pointer to stream handle */
125       XFILE *prev;
126       /* pointer to previous stream descriptor */
127       XFILE *next;
128       /* pointer to next stream descriptor */
129 };
130 
131 #define XEOF (-1)
132 
133 #define get_env_ptr _glp_get_env_ptr
134 ENV *get_env_ptr(void);
135 /* retrieve pointer to environment block */
136 
137 #define tls_set_ptr _glp_tls_set_ptr
138 void tls_set_ptr(void *ptr);
139 /* store global pointer in TLS */
140 
141 #define tls_get_ptr _glp_tls_get_ptr
142 void *tls_get_ptr(void);
143 /* retrieve global pointer from TLS */
144 
145 #define xprintf glp_printf
146 void glp_printf(const char *fmt, ...);
147 /* write formatted output to the terminal */
148 
149 #define xvprintf glp_vprintf
150 void glp_vprintf(const char *fmt, va_list arg);
151 /* write formatted output to the terminal */
152 
153 #ifndef GLP_ERROR_DEFINED
154 #define GLP_ERROR_DEFINED
155 typedef void (*_glp_error)(const char *fmt, ...);
156 #endif
157 
158 #define xerror glp_error_(__FILE__, __LINE__)
159 _glp_error glp_error_(const char *file, int line);
160 /* display error message and terminate execution */
161 
162 #define xassert(expr) \
163       ((void)((expr) || (glp_assert_(#expr, __FILE__, __LINE__), 1)))
164 void glp_assert_(const char *expr, const char *file, int line);
165 /* check for logical condition */
166 
167 #define xmalloc glp_malloc
168 void *glp_malloc(int size);
169 /* allocate memory block */
170 
171 #define xcalloc glp_calloc
172 void *glp_calloc(int n, int size);
173 /* allocate memory block */
174 
175 #define xfree glp_free
176 void glp_free(void *ptr);
177 /* free memory block */
178 
179 #define xtime glp_time
180 glp_long glp_time(void);
181 /* determine current universal time */
182 
183 #define xdifftime glp_difftime
184 double glp_difftime(glp_long t1, glp_long t0);
185 /* compute difference between two time values, in seconds */
186 
187 #define lib_err_msg _glp_lib_err_msg
188 void lib_err_msg(const char *msg);
189 
190 #define xerrmsg _glp_lib_xerrmsg
191 const char *xerrmsg(void);
192 
193 #define xfopen _glp_lib_xfopen
194 XFILE *xfopen(const char *fname, const char *mode);
195 
196 #define xferror _glp_lib_xferror
197 int xferror(XFILE *file);
198 
199 #define xfeof _glp_lib_xfeof
200 int xfeof(XFILE *file);
201 
202 #define xfgetc _glp_lib_xfgetc
203 int xfgetc(XFILE *file);
204 
205 #define xfputc _glp_lib_xfputc
206 int xfputc(int c, XFILE *file);
207 
208 #define xfflush _glp_lib_xfflush
209 int xfflush(XFILE *fp);
210 
211 #define xfclose _glp_lib_xfclose
212 int xfclose(XFILE *file);
213 
214 #define xfprintf _glp_lib_xfprintf
215 int xfprintf(XFILE *file, const char *fmt, ...);
216 
217 #define xdlopen _glp_xdlopen
218 void *xdlopen(const char *module);
219 
220 #define xdlsym _glp_xdlsym
221 void *xdlsym(void *h, const char *symbol);
222 
223 #define xdlclose _glp_xdlclose
224 void xdlclose(void *h);
225 
226 #endif
227 
228 /* eof */
229