doc/glpk06.tex
changeset 2 4c8956a7bdf4
equal deleted inserted replaced
-1:000000000000 0:ead2505bc460
       
     1 %* glpk06.tex *%
       
     2 
       
     3 \chapter{Miscellaneous API Routines}
       
     4 
       
     5 \section{GLPK environment routines}
       
     6 
       
     7 \subsection{glp\_long---64-bit integer data type}
       
     8 
       
     9 Some GLPK API routines use 64-bit integer data type, which is declared
       
    10 in the header \verb|glpk.h| as follows:
       
    11 
       
    12 \begin{verbatim}
       
    13 typedef struct { int lo, hi; } glp_long;
       
    14 \end{verbatim}
       
    15 
       
    16 \noindent
       
    17 where \verb|lo| contains low 32 bits, and \verb|hi| contains high 32
       
    18 bits of 64-bit integer value.\footnote{GLPK conforms to ILP32, LLP64,
       
    19 and LP64 programming models, where the built-in type {\tt int}
       
    20 corresponds to 32-bit integers.}
       
    21 
       
    22 \subsection{glp\_init\_env---initialize GLPK environment}
       
    23 
       
    24 \subsubsection*{Synopsis}
       
    25 
       
    26 \begin{verbatim}
       
    27 int glp_init_env(void);
       
    28 \end{verbatim}
       
    29 
       
    30 \subsubsection*{Description}
       
    31 
       
    32 The routine \verb|glp_init_env| initializes the GLPK environment.
       
    33 Normally the application program does not need to call this routine,
       
    34 because it is called automatically on the first call to any API routine.
       
    35 
       
    36 \newpage
       
    37 
       
    38 \subsubsection*{Returns}
       
    39 
       
    40 The routine \verb|glp_init_env| returns one of the following codes:
       
    41 
       
    42 \noindent
       
    43 0 --- initialization successful;
       
    44 
       
    45 \noindent
       
    46 1 --- environment is already initialized;
       
    47 
       
    48 \noindent
       
    49 2 --- initialization failed (insufficient memory);
       
    50 
       
    51 \noindent
       
    52 3 --- initialization failed (unsupported programming model).
       
    53 
       
    54 \subsection{glp\_version---determine library version}
       
    55 
       
    56 \subsubsection*{Synopsis}
       
    57 
       
    58 \begin{verbatim}
       
    59 const char *glp_version(void);
       
    60 \end{verbatim}
       
    61 
       
    62 \subsubsection*{Returns}
       
    63 
       
    64 The routine \verb|glp_version| returns a pointer to a null-terminated
       
    65 character string, which specifies the version of the GLPK library in
       
    66 the form \verb|"X.Y"|, where `\verb|X|' is the major version number, and
       
    67 `\verb|Y|' is the minor version number, for example, \verb|"4.16"|.
       
    68 
       
    69 \subsubsection*{Example}
       
    70 
       
    71 \begin{footnotesize}
       
    72 \begin{verbatim}
       
    73 printf("GLPK version is %s\n", glp_version());
       
    74 \end{verbatim}
       
    75 \end{footnotesize}
       
    76 
       
    77 \subsection{glp\_free\_env---free GLPK environment}
       
    78 
       
    79 \subsubsection*{Synopsis}
       
    80 
       
    81 \begin{verbatim}
       
    82 int glp_free_env(void);
       
    83 \end{verbatim}
       
    84 
       
    85 \subsubsection*{Description}
       
    86 
       
    87 The routine \verb|glp_free_env| frees all resources used by GLPK
       
    88 routines (memory blocks, etc.) which are currently still in use.
       
    89 
       
    90 Normally the application program does not need to call this routine,
       
    91 because GLPK routines always free all unused resources. However, if
       
    92 the application program even has deleted all problem objects, there
       
    93 will be several memory blocks still allocated for the internal library
       
    94 needs. For some reasons the application program may want GLPK to free
       
    95 this memory, in which case it should call \verb|glp_free_env|.
       
    96 
       
    97 Note that a call to \verb|glp_free_env| invalidates all problem objects
       
    98 which still exist.
       
    99 
       
   100 \subsubsection*{Returns}
       
   101 
       
   102 The routine \verb|glp_free_env| returns one of the following codes:
       
   103 
       
   104 \noindent
       
   105 0 --- termination successful;
       
   106 
       
   107 \noindent
       
   108 1 --- environment is inactive (was not initialized).
       
   109 
       
   110 \subsection{glp\_printf---write formatted output to terminal}
       
   111 
       
   112 \subsubsection*{Synopsis}
       
   113 
       
   114 \begin{verbatim}
       
   115 void glp_printf(const char *fmt, ...);
       
   116 \end{verbatim}
       
   117 
       
   118 \subsubsection*{Description}
       
   119 
       
   120 The routine \verb|glp_printf| uses the format control string
       
   121 \verb|fmt| to format its parameters and writes the formatted output to
       
   122 the terminal.
       
   123 
       
   124 This routine is a replacement of the standard C function
       
   125 \verb|printf| and used by all GLPK routines to perform terminal
       
   126 output. The application program may use \verb|glp_printf| for the same
       
   127 purpose that allows controlling its terminal output with the routines
       
   128 \verb|glp_term_out| and \verb|glp_term_hook|.
       
   129 
       
   130 \subsection{glp\_vprintf---write formatted output to terminal}
       
   131 
       
   132 \subsubsection*{Synopsis}
       
   133 
       
   134 \begin{verbatim}
       
   135 void glp_vprintf(const char *fmt, va_list arg);
       
   136 \end{verbatim}
       
   137 
       
   138 \subsubsection*{Description}
       
   139 
       
   140 The routine \verb|glp_vprintf| uses the format control string
       
   141 \verb|fmt| to format its parameters specified by the list \verb|arg|
       
   142 and writes the formatted output to the terminal.
       
   143 
       
   144 This routine is a replacement of the standard C function
       
   145 \verb|vprintf| and used by all GLPK routines to perform terminal
       
   146 output. The application program may use \verb|glp_vprintf| for the same
       
   147 purpose that allows controlling its terminal output with the routines
       
   148 \verb|glp_term_out| and \verb|glp_term_hook|.
       
   149 
       
   150 \newpage
       
   151 
       
   152 \subsection{glp\_term\_out---enable/disable terminal output}
       
   153 
       
   154 \subsubsection*{Synopsis}
       
   155 
       
   156 \begin{verbatim}
       
   157 int glp_term_out(int flag);
       
   158 \end{verbatim}
       
   159 
       
   160 \subsubsection*{Description}
       
   161 
       
   162 Depending on the parameter flag the routine \verb|glp_term_out| enables
       
   163 or disables terminal output performed by glpk routines:
       
   164 
       
   165 \verb|GLP_ON | --- enable terminal output;
       
   166 
       
   167 \verb|GLP_OFF| --- disable terminal output.
       
   168 
       
   169 \subsubsection*{Returns}
       
   170 
       
   171 The routine \verb|glp_term_out| returns the previous value of the
       
   172 terminal output flag (\verb|GLP_ON| or \verb|GLP_OFF|).
       
   173 
       
   174 \subsection{glp\_term\_hook---intercept terminal output}
       
   175 
       
   176 \subsubsection*{Synopsis}
       
   177 
       
   178 \begin{verbatim}
       
   179 void glp_term_hook(int (*func)(void *info, const char *s),
       
   180       void *info);
       
   181 \end{verbatim}
       
   182 
       
   183 \subsubsection*{Description}
       
   184 
       
   185 The routine \verb|glp_term_hook| installs the user-defined hook routine
       
   186 to intercept all terminal output performed by GLPK routines.
       
   187 
       
   188 %This feature can be used to redirect the terminal output to other
       
   189 %destination, for example, to a file or a text window.
       
   190 
       
   191 The parameter {\it func} specifies the user-defined hook routine. It is
       
   192 called from an internal printing routine, which passes to it two
       
   193 parameters: {\it info} and {\it s}. The parameter {\it info} is a
       
   194 transit pointer specified in corresponding call to the routine
       
   195 \verb|glp_term_hook|; it may be used to pass some additional information
       
   196 to the hook routine. The parameter {\it s} is a pointer to the null
       
   197 terminated character string, which is intended to be written to the
       
   198 terminal. If the hook routine returns zero, the printing routine writes
       
   199 the string {\it s} to the terminal in a usual way; otherwise, if the
       
   200 hook routine returns non-zero, no terminal output is performed.
       
   201 
       
   202 To uninstall the hook routine both parameters {\it func} and {\it info}
       
   203 should be specified as \verb|NULL|.
       
   204 
       
   205 \newpage
       
   206 
       
   207 \subsubsection*{Example}
       
   208 
       
   209 \begin{footnotesize}
       
   210 \begin{verbatim}
       
   211 static int hook(void *info, const char *s)
       
   212 {     FILE *foo = info;
       
   213       fputs(s, foo);
       
   214       return 1;
       
   215 }
       
   216 
       
   217 int main(void)
       
   218 {     FILE *foo;
       
   219       . . .
       
   220       /* redirect terminal output */
       
   221       glp_term_hook(hook, foo);
       
   222       . . .
       
   223       /* resume terminal output */
       
   224       glp_term_hook(NULL, NULL);
       
   225       . . .
       
   226 }
       
   227 \end{verbatim}
       
   228 \end{footnotesize}
       
   229 
       
   230 \subsection{glp\_open\_tee---start copying terminal output}
       
   231 
       
   232 \subsubsection*{Synopsis}
       
   233 
       
   234 \begin{verbatim}
       
   235 int glp_open_tee(const char *fname);
       
   236 \end{verbatim}
       
   237 
       
   238 \subsubsection*{Description}
       
   239 
       
   240 The routine \verb|glp_open_tee| starts copying all the terminal output
       
   241 to an output text file, whose name is specified by the character string
       
   242 \verb|fname|.
       
   243 
       
   244 \subsubsection*{Returns}
       
   245 
       
   246 The routine \verb|glp_open_tee| returns one of the following codes:
       
   247 
       
   248 \noindent
       
   249 0 --- operation successful;
       
   250 
       
   251 \noindent
       
   252 1 --- copying terminal output is already active;
       
   253 
       
   254 \noindent
       
   255 2 --- unable to create output file.
       
   256 
       
   257 \newpage
       
   258 
       
   259 \subsection{glp\_close\_tee---stop copying terminal output}
       
   260 
       
   261 \subsubsection*{Synopsis}
       
   262 
       
   263 \begin{verbatim}
       
   264 int glp_close_tee(void);
       
   265 \end{verbatim}
       
   266 
       
   267 \subsubsection*{Description}
       
   268 
       
   269 The routine \verb|glp_close_tee| stops copying the terminal output to
       
   270 the output text file previously open by the routine \verb|glp_open_tee|
       
   271 closing that file.
       
   272 
       
   273 \subsubsection*{Returns}
       
   274 
       
   275 The routine \verb|glp_close_tee| returns one of the following codes:
       
   276 
       
   277 \noindent
       
   278 0 --- operation successful;
       
   279 
       
   280 \noindent
       
   281 1 --- copying terminal output was not started.
       
   282 
       
   283 \subsection{glp\_error---display error message and terminate execution}
       
   284 
       
   285 \subsubsection*{Synopsis}
       
   286 
       
   287 \begin{verbatim}
       
   288 void glp_error(const char *fmt, ...);
       
   289 \end{verbatim}
       
   290 
       
   291 \subsubsection*{Description}
       
   292 
       
   293 The routine \verb|glp_error| (implemented as a macro) formats its
       
   294 parameters using the format control string \verb|fmt|, writes the
       
   295 formatted message to the terminal, and then abnormally terminates the
       
   296 program.
       
   297 
       
   298 \subsection{glp\_assert---check logical condition}
       
   299 
       
   300 \subsubsection*{Synopsis}
       
   301 
       
   302 \begin{verbatim}
       
   303 void glp_assert(int expr);
       
   304 \end{verbatim}
       
   305 
       
   306 \subsubsection*{Description}
       
   307 
       
   308 The routine \verb|glp_assert| (implemented as a macro) checks
       
   309 a logical condition specified by the expression \verb|expr|. If the
       
   310 condition is true (non-zero), the routine does nothing; otherwise, if
       
   311 the condition is false (zero), the routine prints an error message and
       
   312 abnormally terminates the program.
       
   313 
       
   314 This routine is a replacement of the standard C function \verb|assert|
       
   315 and used by all GLPK routines to check program logic. The application
       
   316 program may use \verb|glp_assert| for the same purpose.
       
   317 
       
   318 \subsection{glp\_error\_hook---install hook to intercept abnormal
       
   319 termination}
       
   320 
       
   321 \subsubsection*{Synopsis}
       
   322 
       
   323 \begin{verbatim}
       
   324 void glp_error_hook(void (*func)(void *info), void *info);
       
   325 \end{verbatim}
       
   326 
       
   327 \subsubsection*{Description}
       
   328 
       
   329 The routine \verb|glp_error_hook| installs a user-defined hook routine
       
   330 to intercept abnormal termination.
       
   331 
       
   332 The parameter \verb|func| specifies the user-defined hook routine. It
       
   333 is called from the routine \verb|glp_error| before the latter calls the
       
   334 abort function to abnormally terminate the application program because
       
   335 of fatal error. The parameter \verb|info| is a transit pointer,
       
   336 specified in the corresponding call to the routine
       
   337 \verb|glp_error_hook|; it may be used to pass some information to the
       
   338 hook routine.
       
   339 
       
   340 To uninstall the hook routine the parameters \verb|func| and \verb|info|
       
   341 should be specified as \verb|NULL|.
       
   342 
       
   343 \subsubsection*{Usage note}
       
   344 
       
   345 If the hook routine returns, the application program is abnormally
       
   346 terminated. To prevent abnormal termnation the hook routine may perform
       
   347 a global jump using the standard function \verb|longjmp|, in which case
       
   348 the application program {\it must} call the routine \verb|glp_free_env|.
       
   349 
       
   350 \subsection{glp\_malloc---allocate memory block}
       
   351 
       
   352 \subsubsection*{Synopsis}
       
   353 
       
   354 \begin{verbatim}
       
   355 void *glp_malloc(int size);
       
   356 \end{verbatim}
       
   357 
       
   358 \subsubsection*{Description}
       
   359 
       
   360 The routine \verb|glp_malloc| dynamically allocates a memory block of
       
   361 \verb|size| bytes long. Should note that:
       
   362 
       
   363 1) the parameter \verb|size| must be positive;
       
   364 
       
   365 2) being allocated the memory block contains arbitrary data, that is,
       
   366 it is {\it not} initialized by binary zeros;
       
   367 
       
   368 3) if the block cannot be allocated due to insufficient memory, the
       
   369 routine prints an error message and abnormally terminates the program.
       
   370 
       
   371 This routine is a replacement of the standard C function \verb|malloc|
       
   372 and used by all GLPK routines for dynamic memory allocation. The
       
   373 application program may use \verb|glp_malloc| for the same purpose.
       
   374 
       
   375 \subsubsection*{Returns}
       
   376 
       
   377 The routine \verb|glp_malloc| returns a pointer to the memory block
       
   378 allocated. To free this block the routine \verb|glp_free| (not the
       
   379 standard C function \verb|free|!) must be used.
       
   380 
       
   381 \subsection{glp\_calloc---allocate memory block}
       
   382 
       
   383 \subsubsection*{Synopsis}
       
   384 
       
   385 \begin{verbatim}
       
   386 void *glp_calloc(int n, int size);
       
   387 \end{verbatim}
       
   388 
       
   389 \subsubsection*{Description}
       
   390 
       
   391 The routine \verb|glp_calloc| dynamically allocates a memory block of
       
   392 \verb|n|$\times$\verb|size| bytes long. Should note that:
       
   393 
       
   394 1) both parameters \verb|n| and \verb|size| must be positive;
       
   395 
       
   396 2) being allocated the memory block contains arbitrary data, that is,
       
   397 it is {\it not} initialized by binary zeros;
       
   398 
       
   399 3) if the block cannot be allocated due to insufficient memory, the
       
   400 routine prints an error message and abnormally terminates the program.
       
   401 
       
   402 This routine is a replacement of the standard C function \verb|calloc|
       
   403 (with exception that the block is not cleaned) and used by all GLPK
       
   404 routines for dynamic memory allocation. The application program may use
       
   405 \verb|glp_calloc| for the same purpose.
       
   406 
       
   407 \subsubsection*{Returns}
       
   408 
       
   409 The routine \verb|glp_calloc| returns a pointer to the memory block
       
   410 allocated. To free this block the routine \verb|glp_free| (not the
       
   411 standard C function \verb|free|!) must be used.
       
   412 
       
   413 \subsection{glp\_free---free memory block}
       
   414 
       
   415 \subsubsection*{Synopsis}
       
   416 
       
   417 \begin{verbatim}
       
   418 void glp_free(void *ptr);
       
   419 \end{verbatim}
       
   420 
       
   421 \subsubsection*{Description}
       
   422 
       
   423 The routine \verb|glp_free| frees (deallocates) a memory block pointed
       
   424 to by \verb|ptr|, which was previously allocated by the routine
       
   425 \verb|glp_malloc| or \verb|glp_calloc|. Note that the pointer \verb|ptr|
       
   426 must valid and must not be \verb|NULL|.
       
   427 
       
   428 This routine is a replacement of the standard C function \verb|free|
       
   429 and used by all GLPK routines for dynamic memory allocation. The
       
   430 application program may use \verb|glp_free| for the same purpose.
       
   431 
       
   432 \subsection{glp\_mem\_usage---get memory usage information}
       
   433 
       
   434 \subsubsection*{Synopsis}
       
   435 
       
   436 \begin{verbatim}
       
   437 void glp_mem_usage(int *count, int *cpeak, glp_long *total,
       
   438       glp_long *tpeak);
       
   439 \end{verbatim}
       
   440 
       
   441 \subsubsection*{Description}
       
   442 
       
   443 The routine \verb|glp_mem_usage| reports some information about
       
   444 utilization of the memory by the routines \verb|glp_malloc|,
       
   445 \verb|glp_calloc|, and \verb|glp_free|. Information is stored to
       
   446 locations specified by corresponding parameters (see below). Any
       
   447 parameter can be specified as \verb|NULL|, in which case corresponding
       
   448 information is not stored.
       
   449 
       
   450 \verb|*count| is the number of currently allocated memory blocks.
       
   451 
       
   452 \verb|*cpeak| is the peak value of \verb|*count| reached since the
       
   453 initialization of the GLPK library environment.
       
   454 
       
   455 \verb|*total| is the total amount, in bytes, of currently allocated
       
   456 memory blocks.
       
   457 
       
   458 \verb|*tpeak| is the peak value of \verb|*total| reached since the
       
   459 initialization of the GLPK library envirionment.
       
   460 
       
   461 \subsubsection*{Example}
       
   462 
       
   463 \begin{footnotesize}
       
   464 \begin{verbatim}
       
   465 glp_mem_usage(&count, NULL, NULL, NULL);
       
   466 printf("%d memory block(s) are still allocated\n", count);
       
   467 \end{verbatim}
       
   468 \end{footnotesize}
       
   469 
       
   470 \subsection{glp\_mem\_limit---set memory usage limit}
       
   471 
       
   472 \subsubsection*{Synopsis}
       
   473 
       
   474 \begin{verbatim}
       
   475 void glp_mem_limit(int limit);
       
   476 \end{verbatim}
       
   477 
       
   478 \subsubsection*{Description}
       
   479 
       
   480 The routine \verb|glp_mem_limit| limits the amount of memory available
       
   481 for dynamic allocation (with the routines \verb|glp_malloc| and
       
   482 \verb|glp_calloc|) to \verb|limit| megabytes.
       
   483 
       
   484 \subsection{glp\_time---determine current universal time}
       
   485 
       
   486 \subsubsection*{Synopsis}
       
   487 
       
   488 \begin{verbatim}
       
   489 glp_long glp_time(void);
       
   490 \end{verbatim}
       
   491 
       
   492 \subsection*{Returns}
       
   493 
       
   494 The routine \verb|glp_time| returns the current universal time (UTC),
       
   495 in milliseconds, elapsed since 00:00:00 GMT January 1, 1970.
       
   496 
       
   497 \subsection{glp\_difftime---compute difference between two time values}
       
   498 
       
   499 \subsubsection*{Synopsis}
       
   500 
       
   501 \begin{verbatim}
       
   502 double glp_difftime(glp_long t1, glp_long t0);
       
   503 \end{verbatim}
       
   504 
       
   505 \subsection*{Returns}
       
   506 
       
   507 The routine \verb|glp_difftime| returns the difference between two time
       
   508 values \verb|t1| and \verb|t0|, expressed in seconds.
       
   509 
       
   510 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
       
   511 
       
   512 \newpage
       
   513 
       
   514 \section{Plain data file reading routines}
       
   515 
       
   516 \subsection{Introduction}
       
   517 
       
   518 On developing simple applications to solve optimization problems it is
       
   519 often needed to read data from plain text files. To do this the standard
       
   520 C function \verb|fscanf| may be used, however, it is not convenient; for
       
   521 example, if it scans an integer number according to the format
       
   522 specification `\verb|%d|', and that number is coded incorrectly,
       
   523 no diagnostics is provided.
       
   524 
       
   525 This section describes a set of GLPK API routines, which may be used in
       
   526 application programs to simplify reading data from plain text files.
       
   527 
       
   528 \subsubsection*{Example 1}
       
   529 
       
   530 The following main program reads ten integer numbers from plain text
       
   531 file \verb|data.txt| and prints their sum.
       
   532 
       
   533 \begin{footnotesize}
       
   534 \begin{verbatim}
       
   535 /* sdfsamp1.c */
       
   536 
       
   537 #include <stdio.h>
       
   538 #include <stdlib.h>
       
   539 #include <glpk.h>
       
   540 
       
   541 int main(void)
       
   542 {     glp_data *data;
       
   543       int j, num, sum;
       
   544       /* open plain data file */
       
   545       data = glp_sdf_open_file("data.txt");
       
   546       if (data == NULL) exit(EXIT_FAILURE);
       
   547       sum = 0;
       
   548       for (j = 1; j <= 10; j++)
       
   549       {  /* read next integer number */
       
   550          num = glp_sdf_read_int(data);
       
   551          sum += num;
       
   552       }
       
   553       printf("sum = %d\n", sum);
       
   554       /* close plain data file */
       
   555       glp_sdf_close_file(data);
       
   556       return 0;
       
   557 }
       
   558 
       
   559 /* eof */
       
   560 \end{verbatim}
       
   561 \end{footnotesize}
       
   562 
       
   563 The input data are coded in free format. For example, the file
       
   564 \verb|data.txt| may look like this:
       
   565 
       
   566 \begin{footnotesize}
       
   567 \begin{verbatim}
       
   568 123 65 432 890 -12 743 895 -7 111 326
       
   569 \end{verbatim}
       
   570 \end{footnotesize}
       
   571 
       
   572 \noindent
       
   573 or like this:
       
   574 
       
   575 \begin{footnotesize}
       
   576 \begin{verbatim}
       
   577 123   65  432  890  -12
       
   578 743  895   -7  111  326
       
   579 \end{verbatim}
       
   580 \end{footnotesize}
       
   581 
       
   582 \noindent
       
   583 If the input data file contains incorrect data, the routine
       
   584 \verb|glp_sdf_read_int| prints an error message and, if no error
       
   585 handling is provided by the application program, abnormally terminates
       
   586 program execution. For example, the file \verb|data.txt| could contain
       
   587 the following data:
       
   588 
       
   589 \begin{footnotesize}
       
   590 \begin{verbatim}
       
   591 123   65  432  890  -12
       
   592 743  895   =7  111  326
       
   593 \end{verbatim}
       
   594 \end{footnotesize}
       
   595 
       
   596 \noindent
       
   597 in which case the error message would be the following:
       
   598 
       
   599 \begin{footnotesize}
       
   600 \begin{verbatim}
       
   601 data.txt:2: cannot convert `=7' to integer
       
   602 \end{verbatim}
       
   603 \end{footnotesize}
       
   604 
       
   605 \subsubsection*{Example 2}
       
   606 
       
   607 As it was said above, by default any attempt to read incorrect data
       
   608 leads to abnormal termination. However, sometimes it is desirable to
       
   609 catch such errors. This feature is illustrated by the following main
       
   610 program, which does the same job as in the previous example.
       
   611 
       
   612 \begin{footnotesize}
       
   613 \begin{verbatim}
       
   614 /* sdfsamp2.c */
       
   615 
       
   616 #include <setjmp.h>
       
   617 #include <stdio.h>
       
   618 #include <stdlib.h>
       
   619 #include <glpk.h>
       
   620 
       
   621 int main(void)
       
   622 {     glp_data *data;
       
   623       jmp_buf jump;
       
   624       int j, num, sum, ret;
       
   625       /* open plain data file */
       
   626       data = glp_sdf_open_file("data.txt");
       
   627       if (data == NULL)
       
   628       {  ret = EXIT_FAILURE;
       
   629          goto done;
       
   630       }
       
   631       /* set up error handling */
       
   632       if (setjmp(jump))
       
   633       {  ret = EXIT_FAILURE;
       
   634          goto done;
       
   635       }
       
   636       glp_sdf_set_jump(data, jump);
       
   637       /* read and process data */
       
   638       sum = 0;
       
   639       for (j = 1; j <= 10; j++)
       
   640       {  /* read next integer number */
       
   641          num = glp_sdf_read_int(data);
       
   642          if (abs(num) > 1000)
       
   643             glp_sdf_error(data, "integer %d too big\n", num);
       
   644          if (num < 0)
       
   645             glp_sdf_warning(data, "integer %d is negative\n", num);
       
   646          sum += num;
       
   647       }
       
   648       printf("sum = %d\n", sum);
       
   649       ret = EXIT_SUCCESS;
       
   650 done: /* close plain data file */
       
   651       if (data != NULL) glp_sdf_close_file(data);
       
   652       return ret;
       
   653 }
       
   654 
       
   655 /* eof */
       
   656 \end{verbatim}
       
   657 \end{footnotesize}
       
   658 
       
   659 \subsection{glp\_sdf\_open\_file---open plain data file}
       
   660 
       
   661 \subsubsection*{Synopsis}
       
   662 
       
   663 \begin{verbatim}
       
   664 glp_data *glp_sdf_open_file(const char *fname);
       
   665 \end{verbatim}
       
   666 
       
   667 \subsubsection*{Description}
       
   668 
       
   669 The routine \verb|glp_sdf_open_file| opens a plain data file, whose
       
   670 name is specified by the character string \verb|fname|.
       
   671 
       
   672 \subsubsection*{Returns}
       
   673 
       
   674 If the operation was successful, the routine \verb|glp_sdf_open_file|
       
   675 returns a pointer to the opaque program object of the type
       
   676 \verb|glp_data|\footnote{This data structure is declared in the header
       
   677 file {\tt glpk.h}.} associated with the plain data file. Otherwise, if
       
   678 the operation failed, the routine prints an error message and returns
       
   679 \verb|NULL|.
       
   680 
       
   681 \subsubsection*{Note}
       
   682 
       
   683 The application program should use the pointer returned by the routine
       
   684 \verb|glp_sdf_open_file| to perform all subsequent operations on the
       
   685 data file.
       
   686 
       
   687 \newpage
       
   688 
       
   689 \subsection{glp\_sdf\_set\_jump---set up error handling}
       
   690 
       
   691 \subsubsection*{Synopsis}
       
   692 
       
   693 \begin{verbatim}
       
   694 void glp_sdf_set_jump(glp_data *data, jmp_buf jump);
       
   695 \end{verbatim}
       
   696 
       
   697 \subsubsection*{Description}
       
   698 
       
   699 The routine \verb|glp_sdf_set_jump| sets up error handling for the
       
   700 plain data file specified by the parameter \verb|data|.
       
   701 
       
   702 The parameter \verb|jump| specifies the environment buffer, which must
       
   703 be initialized with the standard C function \verb|setjmp| prior to call
       
   704 to the routine \verb|glp_sdf_set_jump|. Detecting any incorrect data in
       
   705 the corresponding plain data file will cause non-local ``go to'' by
       
   706 a call to the standard C function \verb|longjmp|.
       
   707 
       
   708 The parameter \verb|jump| can be specified as \verb|NULL|, in which
       
   709 case the routine \verb|glp_sdf_set_jump| restores the default behavior,
       
   710 in which case detecting incorrect data leads to abnormal termination.
       
   711 
       
   712 \subsection{glp\_sdf\_error---print error message}
       
   713 
       
   714 \subsubsection*{Synopsis}
       
   715 
       
   716 \begin{verbatim}
       
   717 void glp_sdf_error(glp_data *data, const char *fmt, ...);
       
   718 \end{verbatim}
       
   719 
       
   720 \subsubsection*{Description}
       
   721 
       
   722 The routine \verb|glp_sdf_error| prints an error message related to the
       
   723 plain data file specified by the parameter \verb|data|. If error handing
       
   724 was not previously provided, the routine then abnormally terminates
       
   725 execution of the application program. Otherwise, it signals about the
       
   726 error by a call to the standard C function \verb|longjmp|.
       
   727 
       
   728 The character string \verb|fmt| and optional parameters following it
       
   729 have the same meaning as for the standard C function \verb|printf|.
       
   730 
       
   731 The message produced by the routine \verb|glp_sdf_error| looks like
       
   732 follows:
       
   733 
       
   734 \medskip
       
   735 
       
   736 {\it file}{\tt :}{\it line}{\tt :} {\it message text}
       
   737 
       
   738 \medskip
       
   739 
       
   740 \noindent
       
   741 where {\it file} is the filename passed to the routine
       
   742 \verb|glp_sdf_open| and {\it line} is the current line number.
       
   743 
       
   744 \newpage
       
   745 
       
   746 \subsection{glp\_sdf\_warning---print warning message}
       
   747 
       
   748 \subsubsection*{Synopsis}
       
   749 
       
   750 \begin{verbatim}
       
   751 void glp_sdf_warning(glp_data *data, const char *fmt, ...);
       
   752 \end{verbatim}
       
   753 
       
   754 \subsubsection*{Description}
       
   755 
       
   756 The routine \verb|glp_sdf_warning| prints a warning message related to
       
   757 the plain data file specified by the parameter \verb|data|.
       
   758 
       
   759 The character string \verb|fmt| and optional parameters following it
       
   760 have the same meaning as for the standard C function \verb|printf|.
       
   761 
       
   762 The message produced by the routine \verb|glp_sdf_warning| looks like
       
   763 follows:
       
   764 
       
   765 \medskip
       
   766 
       
   767 {\it file}{\tt :}{\it line}\verb|: warning:| {\it message text}
       
   768 
       
   769 \medskip
       
   770 
       
   771 \noindent
       
   772 where {\it file} is the filename passed to the routine
       
   773 \verb|glp_sdf_open| and {\it line} is the current line number.
       
   774 
       
   775 \subsection{glp\_sdf\_read\_int---read integer number}
       
   776 
       
   777 \subsubsection*{Synopsis}
       
   778 
       
   779 \begin{verbatim}
       
   780 int glp_sdf_read_int(glp_data *data);
       
   781 \end{verbatim}
       
   782 
       
   783 \subsubsection*{Description}
       
   784 
       
   785 The routine \verb|glp_sdf_read_int| skips optional white-space
       
   786 characters and then reads an integer number from the plain data file
       
   787 specified by the parameter \verb|data|. If the operation failed, the
       
   788 routine \verb|glp_sdf_read_int| calls the routine \verb|glp_sdf_error|
       
   789 (see above).
       
   790 
       
   791 \subsubsection*{Returns}
       
   792 
       
   793 The routine \verb|glp_sdf_read_int| returns the integer number read.
       
   794 
       
   795 \newpage
       
   796 
       
   797 \subsection{glp\_sdf\_read\_num---read floating-point number}
       
   798 
       
   799 \subsubsection*{Synopsis}
       
   800 
       
   801 \begin{verbatim}
       
   802 double glp_sdf_read_num(glp_data *data);
       
   803 \end{verbatim}
       
   804 
       
   805 \subsubsection*{Description}
       
   806 
       
   807 The routine \verb|glp_sdf_read_num| skips optional white-space
       
   808 characters and then reads a floating-point number from the plain data
       
   809 file specified by the parameter \verb|data|. If the operation failed,
       
   810 the routine \verb|glp_sdf_num| calls the routine \verb|glp_sdf_error|
       
   811 (see above).
       
   812 
       
   813 \subsubsection*{Returns}
       
   814 
       
   815 The routine \verb|glp_sdf_read_num| returns the floating-point number
       
   816 read.
       
   817 
       
   818 \subsection{glp\_sdf\_read\_item---read data item}
       
   819 
       
   820 \subsubsection*{Synopsis}
       
   821 
       
   822 \begin{verbatim}
       
   823 const char *glp_sdf_read_item(glp_data *data);
       
   824 \end{verbatim}
       
   825 
       
   826 \subsubsection*{Description}
       
   827 
       
   828 The routine \verb|glp_sdf_read_item| skips optional white-space
       
   829 characters and then reads a data item from the plain data file specified
       
   830 by the parameter \verb|data|. If the operation failed, the routine
       
   831 \verb|glp_sdf_read_item| calls the routine \verb|glp_sdf_error| (see
       
   832 above).
       
   833 
       
   834 {\it Data item} is a sequence of 1 to 255 arbitrary graphic characters
       
   835 delimited by white-space characters. Data items may be used to represent
       
   836 symbolic names, identifiers, etc.
       
   837 
       
   838 \subsubsection*{Returns}
       
   839 
       
   840 The routine \verb|glp_sdf_read_item| returns a pointer to the internal
       
   841 buffer, which contains the data item read in the form of a
       
   842 null-terminated character string.
       
   843 
       
   844 \newpage
       
   845 
       
   846 \subsection{glp\_sdf\_read\_text---read text until end of line}
       
   847 
       
   848 \subsubsection*{Synopsis}
       
   849 
       
   850 \begin{verbatim}
       
   851 const char *glp_sdf_read_text(glp_data *data);
       
   852 \end{verbatim}
       
   853 
       
   854 \subsubsection*{Description}
       
   855 
       
   856 The routine \verb|glp_sdf_read_text| reads a text from the plain data
       
   857 file specified by the parameter \verb|data|.
       
   858 
       
   859 Reading starts from the current position and extends until end of the
       
   860 current line. Initial and trailing white-space characters as well as
       
   861 the newline character are not included in the text.
       
   862 
       
   863 \subsubsection*{Returns}
       
   864 
       
   865 The routine \verb|glp_sdf_read_text| returns a pointer to the internal
       
   866 buffer, which contains the text read in the form of a null-terminated
       
   867 character string.
       
   868 
       
   869 \subsection{glp\_sdf\_line---determine current line number}
       
   870 
       
   871 \subsubsection*{Synopsis}
       
   872 
       
   873 \begin{verbatim}
       
   874 int glp_sdf_line(glp_data *data);
       
   875 \end{verbatim}
       
   876 
       
   877 \subsubsection*{Returns}
       
   878 
       
   879 The routine \verb|glp_sdf_line| returns the current line number for the
       
   880 plain data file specified by the parameter \verb|data|.
       
   881 
       
   882 \subsection{glp\_sdf\_close\_file---close plain data file}
       
   883 
       
   884 \subsubsection*{Synopsis}
       
   885 
       
   886 \begin{verbatim}
       
   887 void glp_sdf_close_file(glp_data *data);
       
   888 \end{verbatim}
       
   889 
       
   890 \subsubsection*{Description}
       
   891 
       
   892 The routine \verb|glp_sdf_close_file| closes the plain data file
       
   893 specified by the parameter \verb|data| and frees all the resources
       
   894 allocated to this program object.
       
   895 
       
   896 %* eof *%