2018-01-17 19:22:57 +01:00
|
|
|
#ifndef FORT_IMPL_H
|
|
|
|
#define FORT_IMPL_H
|
|
|
|
|
2018-04-17 19:14:50 +02:00
|
|
|
#if defined(_MSC_VER)
|
|
|
|
#define _CRT_SECURE_NO_WARNINGS /* To disable warnings for unsafe functions */
|
|
|
|
#endif
|
|
|
|
|
2018-01-17 19:22:57 +01:00
|
|
|
#include <stddef.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <assert.h>
|
|
|
|
#include <stdio.h>
|
2018-03-18 10:17:33 +01:00
|
|
|
#include "fort.h"
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-08-28 21:25:43 +02:00
|
|
|
/* Define FT_INTERNAL to make internal libfort functions static
|
|
|
|
* in the result amalgamed source file.
|
|
|
|
*/
|
|
|
|
#ifdef FT_AMALGAMED_SOURCE
|
|
|
|
#define FT_INTERNAL static
|
|
|
|
#else
|
|
|
|
#define FT_INTERNAL
|
|
|
|
#endif /* FT_AMALGAMED_SORCE */
|
2018-04-17 19:14:50 +02:00
|
|
|
|
2018-04-16 20:01:45 +02:00
|
|
|
|
2019-01-27 08:48:42 +01:00
|
|
|
#define FORT_DEFAULT_COL_SEPARATOR '|'
|
|
|
|
extern char g_col_separator;
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-05-02 16:55:29 +02:00
|
|
|
#define FORT_COL_SEPARATOR_LENGTH 1
|
|
|
|
|
2018-01-17 19:22:57 +01:00
|
|
|
#define FORT_UNUSED __attribute__((unused))
|
|
|
|
|
2018-04-04 21:13:37 +02:00
|
|
|
#define F_MALLOC fort_malloc
|
|
|
|
#define F_FREE fort_free
|
|
|
|
#define F_CALLOC fort_calloc
|
|
|
|
#define F_REALLOC fort_realloc
|
2018-01-17 19:22:57 +01:00
|
|
|
#define F_STRDUP fort_strdup
|
2018-03-05 19:08:14 +01:00
|
|
|
#define F_WCSDUP fort_wcsdup
|
2019-08-14 21:01:57 +02:00
|
|
|
/* @todo: replace with custom impl !!!*/
|
|
|
|
#define F_UTF8DUP utf8dup
|
2018-01-17 19:22:57 +01:00
|
|
|
|
|
|
|
#define F_CREATE(type) ((type *)F_CALLOC(sizeof(type), 1))
|
|
|
|
|
2019-01-01 19:43:21 +01:00
|
|
|
#define MAX(a,b) ((a) > (b) ? (a) : (b))
|
|
|
|
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2019-08-14 21:01:57 +02:00
|
|
|
#define FT_NEWLINE "\n"
|
|
|
|
#define FT_SPACE " "
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-05-06 16:04:34 +02:00
|
|
|
enum PolicyOnNull {
|
2018-01-17 19:22:57 +01:00
|
|
|
Create,
|
|
|
|
DoNotCreate
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2018-05-06 16:04:34 +02:00
|
|
|
enum F_BOOL {
|
2018-01-17 19:22:57 +01:00
|
|
|
F_FALSE = 0,
|
|
|
|
F_TRUE = 1
|
|
|
|
};
|
|
|
|
|
2019-08-14 21:01:57 +02:00
|
|
|
enum str_buf_type {
|
|
|
|
CHAR_BUF,
|
|
|
|
#ifdef FT_HAVE_WCHAR
|
|
|
|
W_CHAR_BUF,
|
|
|
|
#endif /* FT_HAVE_WCHAR */
|
|
|
|
#ifdef FT_HAVE_UTF8
|
|
|
|
UTF8_BUF,
|
|
|
|
#endif /* FT_HAVE_WCHAR */
|
|
|
|
TYPE_END
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
typedef const char ** str_arr;
|
|
|
|
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-05-05 21:34:45 +02:00
|
|
|
#define FT_STR_2_CAT_(arg1, arg2) \
|
2018-01-17 19:22:57 +01:00
|
|
|
arg1##arg2
|
2018-05-05 21:34:45 +02:00
|
|
|
#define FT_STR_2_CAT(arg1, arg2) \
|
|
|
|
FT_STR_2_CAT_(arg1, arg2)
|
2018-01-17 19:22:57 +01:00
|
|
|
|
|
|
|
#define UNIQUE_NAME_(prefix) \
|
2018-05-05 21:34:45 +02:00
|
|
|
FT_STR_2_CAT(prefix,__COUNTER__)
|
2018-01-17 19:22:57 +01:00
|
|
|
#define UNIQUE_NAME(prefix) \
|
|
|
|
UNIQUE_NAME_(prefix)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* LOGGER
|
|
|
|
*****************************************************************************/
|
|
|
|
#define SYS_LOG_ERROR(...)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
|
|
* DEFAULT_SIZES
|
|
|
|
* ***************************************************************************/
|
|
|
|
#define DEFAULT_STR_BUF_SIZE 1024
|
|
|
|
#define DEFAULT_VECTOR_CAPACITY 10
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-11-03 21:50:30 +01:00
|
|
|
struct fort_table_properties;
|
|
|
|
struct fort_column_properties;
|
2018-01-17 19:22:57 +01:00
|
|
|
struct fort_row;
|
|
|
|
struct vector;
|
|
|
|
struct fort_cell;
|
|
|
|
struct string_buffer;
|
2018-05-06 16:04:34 +02:00
|
|
|
struct separator {
|
2018-02-04 14:21:04 +01:00
|
|
|
int enabled;
|
|
|
|
};
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-11-03 21:50:30 +01:00
|
|
|
typedef struct fort_table_properties fort_table_properties_t;
|
2018-05-06 16:04:34 +02:00
|
|
|
struct fort_context {
|
2018-11-03 21:50:30 +01:00
|
|
|
fort_table_properties_t *table_properties;
|
2018-02-26 19:42:48 +01:00
|
|
|
size_t row;
|
|
|
|
size_t column;
|
|
|
|
};
|
|
|
|
typedef struct fort_context context_t;
|
2018-11-03 21:50:30 +01:00
|
|
|
typedef struct fort_column_properties fort_column_properties_t;
|
2018-01-17 19:22:57 +01:00
|
|
|
typedef struct vector vector_t;
|
|
|
|
typedef struct fort_cell fort_cell_t;
|
|
|
|
typedef struct string_buffer string_buffer_t;
|
|
|
|
typedef struct fort_row fort_row_t;
|
2018-05-08 20:46:24 +02:00
|
|
|
/*typedef struct ft_table ft_table_t;*/
|
2018-02-04 14:21:04 +01:00
|
|
|
typedef struct separator separator_t;
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-05-06 16:04:34 +02:00
|
|
|
enum CellType {
|
2018-05-02 16:55:29 +02:00
|
|
|
CommonCell,
|
|
|
|
GroupMasterCell,
|
|
|
|
GroupSlaveCell
|
|
|
|
};
|
|
|
|
|
2018-11-10 07:58:21 +01:00
|
|
|
enum request_geom_type {
|
|
|
|
VISIBLE_GEOMETRY,
|
|
|
|
INTERN_REPR_GEOMETRY
|
|
|
|
};
|
2018-05-02 16:55:29 +02:00
|
|
|
|
2019-08-14 21:01:57 +02:00
|
|
|
struct conv_context {
|
|
|
|
char *buf_origin;
|
|
|
|
char *buf;
|
|
|
|
size_t raw_avail;
|
|
|
|
struct fort_context *cntx;
|
|
|
|
enum str_buf_type b_type;
|
|
|
|
};
|
|
|
|
typedef struct conv_context conv_context_t;
|
|
|
|
|
|
|
|
|
2018-01-17 19:22:57 +01:00
|
|
|
/*****************************************************************************
|
|
|
|
* LIBFORT helpers
|
|
|
|
*****************************************************************************/
|
2018-04-04 21:13:37 +02:00
|
|
|
|
|
|
|
extern void *(*fort_malloc)(size_t size);
|
|
|
|
extern void (*fort_free)(void *ptr);
|
|
|
|
extern void *(*fort_calloc)(size_t nmemb, size_t size);
|
|
|
|
extern void *(*fort_realloc)(void *ptr, size_t size);
|
|
|
|
|
2018-11-24 10:38:01 +01:00
|
|
|
FT_INTERNAL
|
|
|
|
void set_memory_funcs(void *(*f_malloc)(size_t size), void (*f_free)(void *ptr));
|
2018-04-04 21:13:37 +02:00
|
|
|
|
2018-11-24 10:38:01 +01:00
|
|
|
FT_INTERNAL
|
2018-05-06 16:04:34 +02:00
|
|
|
char *fort_strdup(const char *str);
|
2018-11-24 10:38:01 +01:00
|
|
|
|
|
|
|
FT_INTERNAL
|
2018-01-17 19:22:57 +01:00
|
|
|
size_t number_of_columns_in_format_string(const char *fmt);
|
2018-11-24 10:38:01 +01:00
|
|
|
|
2018-11-16 19:27:25 +01:00
|
|
|
#if defined(FT_HAVE_WCHAR)
|
2018-11-24 10:38:01 +01:00
|
|
|
FT_INTERNAL
|
2018-11-16 19:27:25 +01:00
|
|
|
wchar_t *fort_wcsdup(const wchar_t *str);
|
2018-11-24 10:38:01 +01:00
|
|
|
|
|
|
|
FT_INTERNAL
|
2018-04-24 20:36:07 +02:00
|
|
|
size_t number_of_columns_in_format_wstring(const wchar_t *fmt);
|
2018-11-16 19:27:25 +01:00
|
|
|
#endif
|
2018-11-24 10:38:01 +01:00
|
|
|
|
|
|
|
FT_INTERNAL
|
2019-08-14 21:01:57 +02:00
|
|
|
int print_n_strings(conv_context_t *cntx, size_t n, const char *str);
|
|
|
|
|
2018-11-24 10:38:01 +01:00
|
|
|
|
|
|
|
FT_INTERNAL
|
2019-08-14 21:01:57 +02:00
|
|
|
int ft_nprint(conv_context_t *cntx, const char *str, size_t strlen);
|
|
|
|
#ifdef FT_HAVE_WCHAR
|
|
|
|
FT_INTERNAL
|
|
|
|
int ft_nwprint(conv_context_t *cntx, const wchar_t *str, size_t strlen);
|
|
|
|
#endif /* FT_HAVE_WCHAR */
|
|
|
|
#ifdef FT_HAVE_UTF8
|
|
|
|
FT_INTERNAL
|
|
|
|
int ft_nu8print(conv_context_t *cntx, const void *beg, const void *end);
|
|
|
|
#endif /* FT_HAVE_UTF8 */
|
|
|
|
|
2018-03-05 19:08:14 +01:00
|
|
|
|
2019-08-14 21:01:57 +02:00
|
|
|
/*#define PRINT_DEBUG_INFO fprintf(stderr, "error in %s(%s:%d)\n", __FUNCTION__, __FILE__, __LINE__);*/
|
|
|
|
#define PRINT_DEBUG_INFO
|
|
|
|
|
|
|
|
#define FT_CHECK(statement) \
|
|
|
|
do { \
|
|
|
|
tmp = statement; \
|
|
|
|
if (tmp < 0) {\
|
|
|
|
PRINT_DEBUG_INFO \
|
|
|
|
goto clear; \
|
|
|
|
} \
|
|
|
|
} while(0)
|
2018-01-17 19:22:57 +01:00
|
|
|
|
2018-03-31 16:54:01 +02:00
|
|
|
#define CHCK_RSLT_ADD_TO_WRITTEN(statement) \
|
|
|
|
do { \
|
|
|
|
tmp = statement; \
|
|
|
|
if (tmp < 0) {\
|
2019-08-14 21:01:57 +02:00
|
|
|
PRINT_DEBUG_INFO \
|
2018-03-31 16:54:01 +02:00
|
|
|
goto clear; \
|
|
|
|
} \
|
2019-01-01 17:55:00 +01:00
|
|
|
written += (size_t)tmp; \
|
2018-03-31 16:54:01 +02:00
|
|
|
} while(0)
|
|
|
|
|
2018-11-10 07:58:21 +01:00
|
|
|
#define CHCK_RSLT_ADD_TO_INVISIBLE_WRITTEN(statement) \
|
|
|
|
do { \
|
|
|
|
tmp = statement; \
|
|
|
|
if (tmp < 0) {\
|
2019-08-14 21:01:57 +02:00
|
|
|
PRINT_DEBUG_INFO \
|
2018-11-10 07:58:21 +01:00
|
|
|
goto clear; \
|
|
|
|
} \
|
2019-01-01 17:55:00 +01:00
|
|
|
invisible_written += (size_t)tmp; \
|
2018-11-10 07:58:21 +01:00
|
|
|
} while(0)
|
|
|
|
|
2018-04-16 21:33:05 +02:00
|
|
|
|
|
|
|
#define CHECK_NOT_NEGATIVE(x) \
|
2019-01-01 19:43:21 +01:00
|
|
|
do { if ((x) < 0) goto fort_fail; } while (0)
|
2018-04-16 21:33:05 +02:00
|
|
|
|
2018-03-09 10:44:16 +01:00
|
|
|
#endif /* FORT_IMPL_H */
|