2008-07-13 21:15:55 +00:00
/* common.h - Header for all common functions in common.c */
/*
libzint - the open source barcode library
2021-01-11 18:11:41 +00:00
Copyright ( C ) 2009 - 2021 Robin Stuart < rstuart114 @ gmail . com >
2013-05-16 19:26:38 +02:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
2016-02-20 09:38:03 +00:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2013-05-16 19:26:38 +02:00
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
2016-02-20 09:38:03 +00:00
documentation and / or other materials provided with the distribution .
2013-05-16 19:26:38 +02:00
3. Neither the name of the project nor the names of its contributors
may be used to endorse or promote products derived from this software
2016-02-20 09:38:03 +00:00
without specific prior written permission .
2013-05-16 19:26:38 +02:00
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
2016-02-20 09:38:03 +00:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2013-05-16 19:26:38 +02:00
SUCH DAMAGE .
2016-02-20 09:38:03 +00:00
*/
2019-10-17 10:06:21 +01:00
/* vim: set ts=4 sw=4 et : */
2008-07-13 21:15:55 +00:00
2009-06-02 20:23:38 +00:00
# ifndef __COMMON_H
# define __COMMON_H
# ifndef FALSE
2020-06-04 18:45:25 +01:00
# define FALSE 0
2009-06-02 20:23:38 +00:00
# endif
# ifndef TRUE
2020-06-04 18:45:25 +01:00
# define TRUE 1
2009-06-02 20:23:38 +00:00
# endif
2008-07-13 21:15:55 +00:00
/* The most commonly used set */
2020-06-04 18:45:25 +01:00
# define NEON "0123456789"
2008-07-13 21:15:55 +00:00
# include "zint.h"
2020-11-22 11:29:45 +00:00
# include "zintconfig.h"
2016-09-05 22:06:50 +01:00
# include <stdlib.h>
2020-06-04 18:45:25 +01:00
# include <string.h>
2016-09-05 22:06:50 +01:00
2020-06-04 18:45:25 +01:00
/* Helpers to cast away char pointer signedness */
# define ustrlen(source) strlen((const char *) (source))
# define ustrcpy(target, source) strcpy((char *) (target), (const char *) (source))
# define ustrcat(target, source) strcat((char *) (target), (const char *) (source))
2020-12-21 19:30:07 +00:00
# define ustrncat(target, source, count) strncat((char *) (target), (const char *) (source), (count))
2008-07-13 21:15:55 +00:00
2021-06-10 11:15:39 +01:00
# ifdef _MSC_VER
2021-07-06 19:53:31 +01:00
# if _MSC_VER == 1200 /* VC6 */
2021-06-10 11:15:39 +01:00
# define ceilf (float) ceil
# define floorf (float) floor
2021-06-30 11:57:21 +01:00
# define fmodf (float) fmod
2021-07-06 19:53:31 +01:00
# endif
# if _MSC_VER < 1800 /* round (C99) not before MSVC 2013 (C++ 12.0) */
# define round(arg) floor((arg) + 0.5)
# define roundf(arg) floorf((arg) + 0.5f)
2021-04-27 00:07:55 +09:00
# endif
2021-06-10 11:15:39 +01:00
# pragma warning(disable: 4244) /* conversion from int to float */
2021-07-06 19:53:31 +01:00
# if _MSC_VER != 1200 /* VC6 */
2021-06-10 11:15:39 +01:00
# pragma warning(disable: 4996) /* function or variable may be unsafe */
2021-04-27 00:07:55 +09:00
# endif
2020-06-14 14:42:40 +01:00
# endif
2021-06-30 11:57:21 +01:00
/* Is float integral value? (https://stackoverflow.com/a/40404149/664741) */
# define isfintf(arg) (fmodf(arg, 1.0f) == 0.0f)
2021-06-10 11:15:39 +01:00
# if (defined(__GNUC__) || defined(__clang__)) && !defined(ZINT_TEST) && !defined(__MINGW32__)
# define INTERNAL __attribute__ ((visibility ("hidden")))
# elif defined(ZINT_TEST)
# define INTERNAL ZINT_EXTERN /* The test suite references INTERNAL functions, so they need to be exported */
# else
# define INTERNAL
# endif
# ifdef ZINT_TEST
# define STATIC_UNLESS_ZINT_TEST INTERNAL
2020-06-14 14:42:40 +01:00
# else
# define STATIC_UNLESS_ZINT_TEST static
# endif
2019-12-19 00:37:55 +00:00
2020-11-01 18:32:55 +00:00
# define COMMON_INLINE 1
# ifdef COMMON_INLINE
/* Return true (1) if a module is dark/black, otherwise false (0) */
2021-06-10 11:15:39 +01:00
# define module_is_set(s, y, x) (((s)->encoded_data[(y)][(x) >> 3] >> ((x) & 0x07)) & 1)
2020-11-01 18:32:55 +00:00
/* Set a module to dark/black */
2021-06-10 11:15:39 +01:00
# define set_module(s, y, x) do { (s)->encoded_data[(y)][(x) >> 3] |= 1 << ((x) & 0x07); } while (0)
2020-11-01 18:32:55 +00:00
/* Return true (1-8) if a module is colour, otherwise false (0) */
2021-06-10 11:15:39 +01:00
# define module_colour_is_set(s, y, x) ((s)->encoded_data[(y)][(x)])
2020-11-01 18:32:55 +00:00
/* Set a module to a colour */
2021-06-10 11:15:39 +01:00
# define set_module_colour(s, y, x, c) do { (s)->encoded_data[(y)][(x)] = (c); } while (0)
2020-11-01 18:32:55 +00:00
# endif
2009-06-02 20:23:38 +00:00
# ifdef __cplusplus
2016-02-20 09:38:03 +00:00
extern " C " {
2009-06-02 20:23:38 +00:00
# endif /* __cplusplus */
2019-12-19 00:37:55 +00:00
INTERNAL int ctoi ( const char source ) ;
INTERNAL char itoc ( const int source ) ;
2020-12-19 17:13:35 +00:00
INTERNAL int to_int ( const unsigned char source [ ] , const int length ) ;
2019-12-19 00:37:55 +00:00
INTERNAL void to_upper ( unsigned char source [ ] ) ;
2021-01-11 18:11:41 +00:00
INTERNAL int chr_cnt ( const unsigned char string [ ] , const int length , const unsigned char c ) ;
2020-12-19 17:13:35 +00:00
INTERNAL int is_sane ( const char test_string [ ] , const unsigned char source [ ] , const int length ) ;
2019-12-19 00:37:55 +00:00
INTERNAL void lookup ( const char set_string [ ] , const char * table [ ] , const char data , char dest [ ] ) ;
INTERNAL void bin_append ( const int arg , const int length , char * binary ) ;
2020-12-19 17:13:35 +00:00
INTERNAL int bin_append_posn ( const int arg , const int length , char * binary , const int bin_posn ) ;
2019-12-19 00:37:55 +00:00
INTERNAL int posn ( const char set_string [ ] , const char data ) ;
2020-11-01 18:32:55 +00:00
# ifndef COMMON_INLINE
2019-12-19 00:37:55 +00:00
INTERNAL int module_is_set ( const struct zint_symbol * symbol , const int y_coord , const int x_coord ) ;
INTERNAL void set_module ( struct zint_symbol * symbol , const int y_coord , const int x_coord ) ;
2020-11-01 18:32:55 +00:00
INTERNAL int module_colour_is_set ( const struct zint_symbol * symbol , const int y_coord , const int x_coord ) ;
2021-06-19 13:11:23 +01:00
INTERNAL void set_module_colour ( struct zint_symbol * symbol , const int y_coord , const int x_coord ,
const int colour ) ;
2020-11-01 18:32:55 +00:00
# endif
2019-12-19 00:37:55 +00:00
INTERNAL void unset_module ( struct zint_symbol * symbol , const int y_coord , const int x_coord ) ;
2020-06-04 18:45:25 +01:00
INTERNAL void expand ( struct zint_symbol * symbol , const char data [ ] ) ;
2019-12-19 00:37:55 +00:00
INTERNAL int is_stackable ( const int symbology ) ;
INTERNAL int is_extendable ( const int symbology ) ;
INTERNAL int is_composite ( const int symbology ) ;
2020-08-05 15:58:21 +01:00
INTERNAL int istwodigits ( const unsigned char source [ ] , const int length , const int position ) ;
2020-07-10 19:39:32 +01:00
INTERNAL unsigned int decode_utf8 ( unsigned int * state , unsigned int * codep , const unsigned char byte ) ;
2021-03-21 17:35:52 +00:00
INTERNAL int is_valid_utf8 ( const unsigned char source [ ] , const int length ) ;
2020-09-30 12:19:12 +01:00
INTERNAL int utf8_to_unicode ( struct zint_symbol * symbol , const unsigned char source [ ] , unsigned int vals [ ] ,
2020-12-19 17:13:35 +00:00
int * length , const int disallow_4byte ) ;
2021-06-19 13:11:23 +01:00
INTERNAL int set_height ( struct zint_symbol * symbol , const float min_row_height , const float default_height ,
const float max_height , const int set_errtxt ) ;
2019-12-08 16:15:34 +00:00
2020-12-19 17:13:35 +00:00
INTERNAL int colour_to_red ( const int colour ) ;
INTERNAL int colour_to_green ( const int colour ) ;
INTERNAL int colour_to_blue ( const int colour ) ;
2019-12-16 17:31:52 +00:00
2019-12-19 00:37:55 +00:00
# ifdef ZINT_TEST
2021-06-19 13:11:23 +01:00
INTERNAL void debug_test_codeword_dump ( struct zint_symbol * symbol , const unsigned char * codewords ,
const int length ) ;
2021-06-10 11:15:39 +01:00
INTERNAL void debug_test_codeword_dump_int ( struct zint_symbol * symbol , const int * codewords , const int length ) ;
2019-12-19 00:37:55 +00:00
# endif
2019-12-16 17:31:52 +00:00
2009-06-02 20:23:38 +00:00
# ifdef __cplusplus
}
# endif /* __cplusplus */
2009-02-19 19:09:57 +00:00
2009-06-02 20:23:38 +00:00
# endif /* __COMMON_H */