mirror of
https://github.com/suloku/savegame-manager.git
synced 2026-04-04 00:15:10 -05:00
220 lines
7.0 KiB
C
220 lines
7.0 KiB
C
/***************************************************************************
|
|
libini.h - Header file of functions to
|
|
manipulate an ini file.
|
|
-------------------
|
|
begin : Fri Apr 21 2000
|
|
copyright : (C) 2000 by Simon White
|
|
email : s_a_white@email.com
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#ifndef _libini_h_
|
|
#define _libini_h_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <string.h>
|
|
|
|
#define INI_ADD_EXTRAS
|
|
#define INI_ADD_LIST_SUPPORT
|
|
|
|
#ifdef SWIG
|
|
%ignore ini_readString;
|
|
%include typemaps.i
|
|
%apply int *INOUT { int *value };
|
|
%apply long *INOUT { long *value };
|
|
%apply double *INOUT { double *value };
|
|
%rename (ini_readString) ini_readFileToBuffer;
|
|
#define INI_EXTERN
|
|
#define INI_STATIC
|
|
#endif /* SWIG */
|
|
|
|
#ifdef _WINDOWS
|
|
# define INI_LINKAGE __stdcall
|
|
#else
|
|
# define INI_LINKAGE
|
|
#endif
|
|
|
|
/* DLL building support on win32 hosts */
|
|
#ifndef INI_EXTERN
|
|
# ifdef DLL_EXPORT /* defined by libtool (if required) */
|
|
# define INI_EXTERN __declspec(dllexport)
|
|
# endif
|
|
# ifdef LIBINI_DLL_IMPORT /* define if linking with this dll */
|
|
# define INI_EXTERN extern __declspec(dllimport)
|
|
# endif
|
|
# ifndef INI_EXTERN /* static linking or !_WIN32 */
|
|
# define INI_EXTERN extern
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef INI_ADD_EXTRAS
|
|
#undef INI_ADD_LIST_SUPPORT
|
|
#endif
|
|
|
|
/* Compatibility with future C++ code */
|
|
#ifndef ini_fd_t
|
|
#define ini_fd_t ini_fd_t
|
|
typedef void* ini_fd_t;
|
|
#endif
|
|
|
|
|
|
/* Rev 1.2 Added new fuction */
|
|
INI_EXTERN ini_fd_t INI_LINKAGE ini_open (const char *name, const char *mode,
|
|
const char *comment);
|
|
INI_EXTERN int INI_LINKAGE ini_close (ini_fd_t fd);
|
|
INI_EXTERN int INI_LINKAGE ini_flush (ini_fd_t fd);
|
|
INI_EXTERN int INI_LINKAGE ini_delete (ini_fd_t fd);
|
|
|
|
/* Rev 1.2 Added these functions to make life a bit easier, can still be implemented
|
|
* through ini_writeString though. */
|
|
INI_EXTERN int INI_LINKAGE ini_locateKey (ini_fd_t fd, const char *key);
|
|
INI_EXTERN int INI_LINKAGE ini_locateHeading (ini_fd_t fd, const char *heading);
|
|
INI_EXTERN int INI_LINKAGE ini_deleteKey (ini_fd_t fd);
|
|
INI_EXTERN int INI_LINKAGE ini_deleteHeading (ini_fd_t fd);
|
|
|
|
INI_EXTERN const char * INI_LINKAGE ini_currentKey (ini_fd_t fd);
|
|
INI_EXTERN const char * INI_LINKAGE ini_currentHeading (ini_fd_t fd);
|
|
|
|
/* Returns the number of bytes required to be able to read the key as a
|
|
* string from the file. (1 should be added to this length to account
|
|
* for a NULL character). If delimiters are used, returns the length
|
|
* of the next data element in the key to be read */
|
|
INI_EXTERN int INI_LINKAGE ini_dataLength (ini_fd_t fd);
|
|
|
|
/* Default Data Type Operations
|
|
* Arrays implemented to help with reading, for writing you should format the
|
|
* complete array as a string and perform an ini_writeString. */
|
|
INI_EXTERN int INI_LINKAGE ini_readString (ini_fd_t fd, char *str, size_t size);
|
|
INI_EXTERN int INI_LINKAGE ini_writeString (ini_fd_t fd, const char *str);
|
|
INI_EXTERN int INI_LINKAGE ini_readInt (ini_fd_t fd, int *value);
|
|
|
|
|
|
#ifdef INI_ADD_EXTRAS
|
|
/* Read Operations */
|
|
INI_EXTERN int INI_LINKAGE ini_readLong (ini_fd_t fd, long *value);
|
|
INI_EXTERN int INI_LINKAGE ini_readDouble (ini_fd_t fd, double *value);
|
|
INI_EXTERN int INI_LINKAGE ini_readBool (ini_fd_t fd, int *value);
|
|
|
|
/* Write Operations */
|
|
INI_EXTERN int INI_LINKAGE ini_writeInt (ini_fd_t fd, int value);
|
|
INI_EXTERN int INI_LINKAGE ini_writeLong (ini_fd_t fd, long value);
|
|
INI_EXTERN int INI_LINKAGE ini_writeDouble (ini_fd_t fd, double value);
|
|
INI_EXTERN int INI_LINKAGE ini_writeBool (ini_fd_t fd, int value);
|
|
|
|
/* Extra Functions */
|
|
INI_EXTERN int INI_LINKAGE ini_append (ini_fd_t fddst, ini_fd_t fdsrc);
|
|
#endif /* INI_ADD_EXTRAS */
|
|
|
|
|
|
#ifdef INI_ADD_LIST_SUPPORT
|
|
/* Rev 1.1 Added - List Operations (Used for read operations only)
|
|
* Be warned, once delimiters are set, every key that is read will be checked for the
|
|
* presence of sub strings. This will incure a speed hit and therefore once a line
|
|
* has been read and list/array functionality is not required, set delimiters
|
|
* back to NULL.
|
|
*/
|
|
|
|
/* Returns the number of elements in an list being seperated by the provided delimiters */
|
|
INI_EXTERN int INI_LINKAGE ini_listLength (ini_fd_t fd);
|
|
/* Change delimiters, default "" */
|
|
INI_EXTERN int INI_LINKAGE ini_listDelims (ini_fd_t fd, const char *delims);
|
|
/* Set index to access in a list. When read the index will automatically increment */
|
|
INI_EXTERN int INI_LINKAGE ini_listIndex (ini_fd_t fd, unsigned long index);
|
|
#endif /* INI_ADD_LIST_SUPPORT */
|
|
|
|
|
|
#ifdef SWIG
|
|
%{
|
|
#include <stdio.h>
|
|
#include <libini.h>
|
|
#define INI_STATIC static
|
|
typedef struct
|
|
{
|
|
char *buffer;
|
|
size_t size;
|
|
} ini_buffer_t;
|
|
%}
|
|
|
|
%inline %{
|
|
/*************************************************************
|
|
* SWIG helper functions to create C compatible string buffers
|
|
*************************************************************/
|
|
INI_STATIC ini_buffer_t *ini_createBuffer (unsigned int size)
|
|
{
|
|
ini_buffer_t *b;
|
|
/* Allocate memory to structure */
|
|
if (size == ( ((unsigned) -1 << 1) >> 1 ))
|
|
return 0; /* Size is too big */
|
|
b = malloc (sizeof (ini_buffer_t));
|
|
if (!b)
|
|
return 0;
|
|
|
|
/* Allocate memory to buffer */
|
|
b->buffer = malloc (sizeof (char) * (size + 1));
|
|
if (!b->buffer)
|
|
{
|
|
free (b);
|
|
return 0;
|
|
}
|
|
b->size = size;
|
|
b->buffer[0] = '\0';
|
|
|
|
/* Returns address to tcl */
|
|
return b;
|
|
}
|
|
|
|
INI_STATIC void ini_deleteBuffer (ini_buffer_t *buffer)
|
|
{
|
|
if (!buffer)
|
|
return;
|
|
free (buffer->buffer);
|
|
free (buffer);
|
|
}
|
|
|
|
INI_STATIC int ini_readFileToBuffer (ini_fd_t fd, ini_buffer_t *buffer)
|
|
{
|
|
if (!buffer)
|
|
return -1;
|
|
return ini_readString (fd, buffer->buffer, buffer->size + 1);
|
|
}
|
|
|
|
INI_STATIC char *ini_getBuffer (ini_buffer_t *buffer)
|
|
{
|
|
if (!buffer)
|
|
return "";
|
|
return buffer->buffer;
|
|
}
|
|
|
|
INI_STATIC int ini_setBuffer (ini_buffer_t *buffer, const char *str)
|
|
{
|
|
size_t len;
|
|
if (!buffer)
|
|
return -1;
|
|
len = strlen (str);
|
|
if (len > buffer->size)
|
|
len = buffer->size;
|
|
|
|
memcpy (buffer->buffer, str, len);
|
|
buffer->buffer[len] = '\0';
|
|
return len;
|
|
}
|
|
%}
|
|
#endif /* SWIG */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _libini_h_ */
|