Scippy

    SCIP

    Solving Constraint Integer Programs

    fileio.c
    Go to the documentation of this file.
    1/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    2/* */
    3/* This file is part of the program and library */
    4/* SCIP --- Solving Constraint Integer Programs */
    5/* */
    6/* Copyright (c) 2002-2025 Zuse Institute Berlin (ZIB) */
    7/* */
    8/* Licensed under the Apache License, Version 2.0 (the "License"); */
    9/* you may not use this file except in compliance with the License. */
    10/* You may obtain a copy of the License at */
    11/* */
    12/* http://www.apache.org/licenses/LICENSE-2.0 */
    13/* */
    14/* Unless required by applicable law or agreed to in writing, software */
    15/* distributed under the License is distributed on an "AS IS" BASIS, */
    16/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
    17/* See the License for the specific language governing permissions and */
    18/* limitations under the License. */
    19/* */
    20/* You should have received a copy of the Apache-2.0 license */
    21/* along with SCIP; see the file LICENSE. If not visit scipopt.org. */
    22/* */
    23/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
    24
    25/**@file fileio.c
    26 * @ingroup OTHER_CFILES
    27 * @brief wrapper functions to map file i/o to standard or zlib file i/o
    28 * @author Tobias Achterberg
    29 */
    30
    31/*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
    32
    33#include <stdio.h>
    34#include <stdarg.h>
    35
    36#include "scip/pub_fileio.h"
    37
    38
    39#define BUFFER_LEN 8192
    40
    41#ifdef SCIP_WITH_ZLIB
    42
    43/* file i/o using zlib */
    44#include <zlib.h>
    45
    46SCIP_FILE* SCIPfopen(const char *path, const char *mode)
    47{
    48 return (SCIP_FILE*)gzopen(path, mode);
    49}
    50
    51SCIP_FILE* SCIPfdopen(int fildes, const char *mode)
    52{
    53 return (SCIP_FILE*)gzdopen(fildes, mode);
    54}
    55
    56size_t SCIPfread(void *ptr, size_t size, size_t nmemb, SCIP_FILE *stream)
    57{
    58 int nbytesread;
    59
    60 nbytesread = gzread((gzFile)stream, ptr, (unsigned int) (size * nmemb));
    61 /* An error occured if nbytesread < 0. To be compatible with fread(), we return 0, which signifies an error there. */
    62 if ( nbytesread < 0 )
    63 return 0;
    64
    65 return (size_t) nbytesread; /*lint !e571*/
    66}
    67
    68size_t SCIPfwrite(const void *ptr, size_t size, size_t nmemb, SCIP_FILE *stream)
    69{
    70 return (size_t) gzwrite((gzFile)stream, ptr, (unsigned int) (size * nmemb)); /*lint !e571*/
    71}
    72
    73int SCIPfprintf(SCIP_FILE *stream, const char *format, ...)
    74{
    75 char buffer[BUFFER_LEN];
    76 va_list ap;
    77 int n;
    78
    79 va_start(ap, format); /*lint !e826*/
    80#if defined(_MSC_VER) && _MSC_VER < 1900
    81 n = _vsnprintf(buffer, BUFFER_LEN, format, ap);
    82#else
    83 n = vsnprintf(buffer, BUFFER_LEN, format, ap);
    84#endif
    85 va_end(ap);
    86 if( n < 0 || n > BUFFER_LEN)
    87 buffer[BUFFER_LEN-1] = '\0';
    88
    89 return gzputs((gzFile)stream, buffer);
    90}
    91
    92int SCIPfputc(int c, SCIP_FILE *stream)
    93{
    94 return gzputc((gzFile)stream, c);
    95}
    96
    97int SCIPfputs(const char *s, SCIP_FILE *stream)
    98{
    99 return gzputs((gzFile)stream, s);
    100}
    101
    102int SCIPfgetc(SCIP_FILE *stream)
    103{
    104 return gzgetc((gzFile)stream);
    105}
    106
    107char* SCIPfgets(char *s, int size, SCIP_FILE *stream)
    108{
    109 if( size > 0 )
    110 s[0] = '\0';
    111 return gzgets((gzFile)stream, s, size);
    112}
    113
    114int SCIPfflush(SCIP_FILE *stream)
    115{
    116 return gzflush((gzFile)stream, Z_SYNC_FLUSH);
    117}
    118
    119int SCIPfseek(SCIP_FILE *stream, long offset, int whence)
    120{
    121 return (int) gzseek((gzFile)stream, offset, whence);
    122}
    123
    124void SCIPrewind(SCIP_FILE *stream)
    125{
    126 (void) gzrewind((gzFile)stream);
    127}
    128
    129long SCIPftell(SCIP_FILE *stream)
    130{
    131 return gztell((gzFile)stream);
    132}
    133
    134int SCIPfeof(SCIP_FILE *stream)
    135{
    136 return gzeof((gzFile)stream);
    137}
    138
    139int SCIPfclose(SCIP_FILE *fp)
    140{
    141 return gzclose((gzFile)fp);
    142}
    143
    144
    145#else
    146
    147#ifdef _MSC_VER
    148#define fdopen _fdopen
    149#endif
    150
    151/* file i/o using standard i/o */
    152
    153SCIP_FILE* SCIPfopen(const char *path, const char *mode)
    154{
    155 return (SCIP_FILE*)fopen(path, mode);
    156}
    157
    158SCIP_FILE* SCIPfdopen(int fildes, const char *mode)
    159{
    160 return (SCIP_FILE*)fdopen(fildes, mode);
    161}
    162
    163size_t SCIPfread(void *ptr, size_t size, size_t nmemb, SCIP_FILE *stream)
    164{
    165 return fread(ptr, size, nmemb, (FILE*)stream);
    166}
    167
    168size_t SCIPfwrite(const void *ptr, size_t size, size_t nmemb, SCIP_FILE *stream)
    169{
    170 return fwrite(ptr, size, nmemb, (FILE*)stream);
    171}
    172
    173int SCIPfprintf(SCIP_FILE *stream, const char *format, ...)
    174{
    175 va_list ap;
    176 int retval;
    177
    178 va_start(ap, format); /*lint !e826*/
    179 retval = vfprintf((FILE*)stream, format, ap);
    180 va_end(ap);
    181
    182 return retval;
    183}
    184
    185int SCIPfputc(int c, SCIP_FILE *stream)
    186{
    187 return fputc(c, (FILE*)stream);
    188}
    189
    190int SCIPfputs(const char *s, SCIP_FILE *stream)
    191{
    192 return fputs(s, (FILE*)stream);
    193}
    194
    196{
    197 return fgetc((FILE*)stream);
    198}
    199
    200char* SCIPfgets(char *s, int size, SCIP_FILE *stream)
    201{
    202 if( size > 0 )
    203 s[0] = '\0';
    204 return fgets(s, size, (FILE*)stream);
    205}
    206
    208{
    209 return fflush((FILE*)stream);
    210}
    211
    212int SCIPfseek(SCIP_FILE *stream, long offset, int whence)
    213{
    214 return fseek((FILE*)stream, offset, whence);
    215}
    216
    218{
    219 rewind((FILE*)stream);
    220}
    221
    222long SCIPftell(SCIP_FILE *stream)
    223{
    224 return ftell((FILE*)stream);
    225}
    226
    227int SCIPfeof(SCIP_FILE *stream)
    228{
    229 return feof((FILE*)stream);
    230}
    231
    233{
    234 return fclose((FILE*)fp);
    235}
    236
    237
    238#endif
    SCIP_FILE * SCIPfopen(const char *path, const char *mode)
    Definition: fileio.c:153
    size_t SCIPfwrite(const void *ptr, size_t size, size_t nmemb, SCIP_FILE *stream)
    Definition: fileio.c:168
    int SCIPfgetc(SCIP_FILE *stream)
    Definition: fileio.c:195
    int SCIPfprintf(SCIP_FILE *stream, const char *format,...)
    Definition: fileio.c:173
    int SCIPfseek(SCIP_FILE *stream, long offset, int whence)
    Definition: fileio.c:212
    #define BUFFER_LEN
    Definition: fileio.c:39
    int SCIPfeof(SCIP_FILE *stream)
    Definition: fileio.c:227
    void SCIPrewind(SCIP_FILE *stream)
    Definition: fileio.c:217
    size_t SCIPfread(void *ptr, size_t size, size_t nmemb, SCIP_FILE *stream)
    Definition: fileio.c:163
    long SCIPftell(SCIP_FILE *stream)
    Definition: fileio.c:222
    int SCIPfputc(int c, SCIP_FILE *stream)
    Definition: fileio.c:185
    int SCIPfclose(SCIP_FILE *fp)
    Definition: fileio.c:232
    char * SCIPfgets(char *s, int size, SCIP_FILE *stream)
    Definition: fileio.c:200
    int SCIPfputs(const char *s, SCIP_FILE *stream)
    Definition: fileio.c:190
    SCIP_FILE * SCIPfdopen(int fildes, const char *mode)
    Definition: fileio.c:158
    int SCIPfflush(SCIP_FILE *stream)
    Definition: fileio.c:207
    wrapper functions to map file i/o to standard or zlib file i/o
    struct SCIP_File SCIP_FILE
    Definition: pub_fileio.h:43