CMakeLists.txt: check against c not c++ (CheckCXX -> CheckC etc)

BMP/EMF/PCX/TIF: use more portable packed attribute instead of
  pragma if not MSVC
CHANNEL: pass ptr not struct to `channel_copy_precalc()`
This commit is contained in:
gitlost 2024-05-27 20:55:04 +01:00
parent 3960dfdbfc
commit 0a00d04ccc
8 changed files with 94 additions and 71 deletions

View File

@ -36,36 +36,36 @@ endif()
include(SetPaths.cmake) include(SetPaths.cmake)
include(CheckCXXCompilerFlag) include(CheckCCompilerFlag)
include(CheckFunctionExists) include(CheckFunctionExists)
if(NOT MSVC) # Use default warnings if MSVC otherwise inundated if(NOT MSVC) # Use default warnings if MSVC otherwise inundated
check_cxx_compiler_flag("-Wall" CXX_COMPILER_FLAG_WALL) check_c_compiler_flag("-Wall" C_COMPILER_FLAG_WALL)
if(CXX_COMPILER_FLAG_WALL) if(C_COMPILER_FLAG_WALL)
add_compile_options("-Wall") add_compile_options("-Wall")
endif() endif()
check_cxx_compiler_flag("-Wextra" CXX_COMPILER_FLAG_WEXTRA) check_c_compiler_flag("-Wextra" C_COMPILER_FLAG_WEXTRA)
if(CXX_COMPILER_FLAG_WEXTRA) if(C_COMPILER_FLAG_WEXTRA)
add_compile_options("-Wextra") add_compile_options("-Wextra")
endif() endif()
check_cxx_compiler_flag("-Wpedantic" CXX_COMPILER_FLAG_WPEDANTIC) check_c_compiler_flag("-Wpedantic" C_COMPILER_FLAG_WPEDANTIC)
if(CXX_COMPILER_FLAG_WPEDANTIC) if(C_COMPILER_FLAG_WPEDANTIC)
add_compile_options("-Wpedantic") add_compile_options("-Wpedantic")
endif() endif()
endif() endif()
if(ZINT_DEBUG) if(ZINT_DEBUG)
check_cxx_compiler_flag("-g" CXX_COMPILER_FLAG_G) check_c_compiler_flag("-g" C_COMPILER_FLAG_G)
if(CXX_COMPILER_FLAG_G) if(C_COMPILER_FLAG_G)
add_compile_options("-g") add_compile_options("-g")
endif() endif()
endif() endif()
if(ZINT_NOOPT) if(ZINT_NOOPT)
check_cxx_compiler_flag("-O0" CXX_COMPILER_FLAG_O0) check_c_compiler_flag("-O0" C_COMPILER_FLAG_O0)
if(CXX_COMPILER_FLAG_O0) if(C_COMPILER_FLAG_O0)
add_compile_options("-O0") add_compile_options("-O0")
endif() endif()
endif() endif()
@ -82,19 +82,19 @@ if(ZINT_SANITIZE)
set(SANITIZERS address undefined) set(SANITIZERS address undefined)
foreach(sanitizer IN ITEMS ${SANITIZERS}) foreach(sanitizer IN ITEMS ${SANITIZERS})
set(CMAKE_REQUIRED_LIBRARIES -fsanitize=${sanitizer}) set(CMAKE_REQUIRED_LIBRARIES -fsanitize=${sanitizer})
check_cxx_compiler_flag(-fsanitize=${sanitizer} CXX_COMPILER_FLAG_FSANITIZE_${sanitizer}) check_c_compiler_flag(-fsanitize=${sanitizer} C_COMPILER_FLAG_FSANITIZE_${sanitizer})
if(CXX_COMPILER_FLAG_FSANITIZE_${sanitizer}) if(C_COMPILER_FLAG_FSANITIZE_${sanitizer})
add_compile_options(-fsanitize=${sanitizer}) add_compile_options(-fsanitize=${sanitizer})
link_libraries(-fsanitize=${sanitizer}) link_libraries(-fsanitize=${sanitizer})
endif() endif()
unset(CMAKE_REQUIRED_LIBRARIES) unset(CMAKE_REQUIRED_LIBRARIES)
endforeach() endforeach()
if(NOT ZINT_DEBUG AND CMAKE_CXX_COMPILER_ID MATCHES "GNU") if(NOT ZINT_DEBUG AND CMAKE_C_COMPILER_ID MATCHES "GNU")
# Gives warning on MainWindow::setupUI() and retries (& takes forever) if var-tracking-assignments enabled # Gives warning on MainWindow::setupUI() and retries (& takes forever) if var-tracking-assignments enabled
add_compile_options(-fno-var-tracking-assignments) add_compile_options(-fno-var-tracking-assignments)
endif() endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") if(CMAKE_C_COMPILER_ID MATCHES "Clang")
# Recent clangs added deprecation warnings for `sprintf()` that are only triggered on sanitize - suppress # Recent clangs added deprecation warnings for `sprintf()` that are only triggered on sanitize - suppress
add_compile_options(-Wno-deprecated-declarations) add_compile_options(-Wno-deprecated-declarations)
endif() endif()
@ -107,14 +107,14 @@ endif()
if(ZINT_COVERAGE) if(ZINT_COVERAGE)
set(CMAKE_REQUIRED_LIBRARIES -fprofile-arcs) set(CMAKE_REQUIRED_LIBRARIES -fprofile-arcs)
check_cxx_compiler_flag(--coverage CXX_COMPILER_FLAG_COVERAGE) check_c_compiler_flag(--coverage C_COMPILER_FLAG_COVERAGE)
unset(CMAKE_REQUIRED_LIBRARIES) unset(CMAKE_REQUIRED_LIBRARIES)
if(CXX_COMPILER_FLAG_COVERAGE) if(C_COMPILER_FLAG_COVERAGE)
add_compile_options(--coverage) add_compile_options(--coverage)
link_libraries(-fprofile-arcs) link_libraries(-fprofile-arcs)
check_cxx_compiler_flag(-O0 CXX_COMPILER_FLAG_O0) check_c_compiler_flag(-O0 C_COMPILER_FLAG_O0)
if(CXX_COMPILER_FLAG_O0) if(C_COMPILER_FLAG_O0)
add_compile_options(-O0) add_compile_options(-O0)
endif() endif()
endif() endif()

View File

@ -1,7 +1,7 @@
/* bmp.h - header structure for Windows bitmap files */ /* bmp.h - header structure for Windows bitmap files */
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2009-2022 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2009-2024 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@ -37,14 +37,16 @@
extern "C" { extern "C" {
#endif #endif
#ifdef _MSC_VER
#pragma pack(1) #pragma pack(1)
#endif
typedef struct bitmap_file_header { typedef struct bitmap_file_header {
uint16_t header_field; uint16_t header_field;
uint32_t file_size; uint32_t file_size;
uint32_t reserved; uint32_t reserved;
uint32_t data_offset; uint32_t data_offset;
} bitmap_file_header_t; } OUT_PACK bitmap_file_header_t;
typedef struct bitmap_info_header { typedef struct bitmap_info_header {
uint32_t header_size; uint32_t header_size;
@ -58,16 +60,18 @@ extern "C" {
int32_t vert_res; int32_t vert_res;
uint32_t colours; uint32_t colours;
uint32_t important_colours; uint32_t important_colours;
} bitmap_info_header_t; } OUT_PACK bitmap_info_header_t;
typedef struct color_ref { typedef struct color_ref {
uint8_t blue; uint8_t blue;
uint8_t green; uint8_t green;
uint8_t red; uint8_t red;
uint8_t reserved; uint8_t reserved;
} color_ref_t; } OUT_PACK color_ref_t;
#ifdef _MSC_VER
#pragma pack() #pragma pack()
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -631,19 +631,19 @@ static void channel_generate_precalc(int channels, long value, int mod, int last
#include "channel_precalcs.h" #include "channel_precalcs.h"
#endif #endif
static long channel_copy_precalc(channel_precalc precalc, int B[8], int S[8], int bmax[7], int smax[7]) { static long channel_copy_precalc(channel_precalc *const precalc, int B[8], int S[8], int bmax[7], int smax[7]) {
int i; int i;
for (i = 0; i < 7; i++) { for (i = 0; i < 7; i++) {
B[i] = precalc.B[i]; B[i] = precalc->B[i];
S[i] = precalc.S[i]; S[i] = precalc->S[i];
bmax[i] = precalc.bmax[i]; bmax[i] = precalc->bmax[i];
smax[i] = precalc.smax[i]; smax[i] = precalc->smax[i];
} }
B[7] = precalc.B[7]; B[7] = precalc->B[7];
S[7] = precalc.S[7]; S[7] = precalc->S[7];
return precalc.value; return precalc->value;
} }
/* CHNCHR is adapted from ANSI/AIM BC12-1998 Annex D Figure D5 and is Copyright (c) AIM 1997 */ /* CHNCHR is adapted from ANSI/AIM BC12-1998 Annex D Figure D5 and is Copyright (c) AIM 1997 */
@ -676,14 +676,14 @@ static void CHNCHR(int channels, long target_value, int B[8], int S[8]) {
int bmax[7], smax[7]; int bmax[7], smax[7];
long value = 0; long value = 0;
channel_copy_precalc(initial_precalcs[channels - 3], B, S, bmax, smax); channel_copy_precalc(&initial_precalcs[channels - 3], B, S, bmax, smax);
#ifndef CHANNEL_GENERATE_PRECALCS #ifndef CHANNEL_GENERATE_PRECALCS
if (channels == 7 && target_value >= channel_precalcs7[0].value) { if (channels == 7 && target_value >= channel_precalcs7[0].value) {
value = channel_copy_precalc(channel_precalcs7[(target_value / channel_precalcs7[0].value) - 1], B, S, bmax, value = channel_copy_precalc(&channel_precalcs7[(target_value / channel_precalcs7[0].value) - 1], B, S, bmax,
smax); smax);
} else if (channels == 8 && target_value >= channel_precalcs8[0].value) { } else if (channels == 8 && target_value >= channel_precalcs8[0].value) {
value = channel_copy_precalc(channel_precalcs8[(target_value / channel_precalcs8[0].value) - 1], B, S, bmax, value = channel_copy_precalc(&channel_precalcs8[(target_value / channel_precalcs8[0].value) - 1], B, S, bmax,
smax); smax);
} }
#endif #endif

View File

@ -1,7 +1,7 @@
/* emf.h - header structure for Microsoft EMF */ /* emf.h - header structure for Microsoft EMF */
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2016-2022 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2016-2024 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@ -37,43 +37,45 @@
extern "C" { extern "C" {
#endif #endif
#ifdef _MSC_VER
#pragma pack(1) #pragma pack(1)
#endif
typedef struct rect_l { typedef struct rect_l {
int32_t left; int32_t left;
int32_t top; int32_t top;
int32_t right; int32_t right;
int32_t bottom; int32_t bottom;
} rect_l_t; } OUT_PACK rect_l_t;
typedef struct size_l { typedef struct size_l {
uint32_t cx; uint32_t cx;
uint32_t cy; uint32_t cy;
} size_l_t; } OUT_PACK size_l_t;
typedef struct point_l { typedef struct point_l {
int32_t x; int32_t x;
int32_t y; int32_t y;
} point_l_t; } OUT_PACK point_l_t;
typedef struct color_ref { typedef struct color_ref {
uint8_t red; uint8_t red;
uint8_t green; uint8_t green;
uint8_t blue; uint8_t blue;
uint8_t reserved; uint8_t reserved;
} color_ref_t; } OUT_PACK color_ref_t;
typedef struct log_brush_ex { typedef struct log_brush_ex {
uint32_t brush_style; uint32_t brush_style;
color_ref_t color; color_ref_t color;
uint32_t brush_hatch; uint32_t brush_hatch;
} log_brush_ex_t; } OUT_PACK log_brush_ex_t;
typedef struct log_pen { typedef struct log_pen {
uint32_t pen_style; uint32_t pen_style;
point_l_t width; point_l_t width;
color_ref_t color_ref; color_ref_t color_ref;
} log_pen_t; } OUT_PACK log_pen_t;
typedef struct log_font { typedef struct log_font {
int32_t height; int32_t height;
@ -90,7 +92,7 @@ extern "C" {
uint8_t quality; uint8_t quality;
uint8_t pitch_and_family; uint8_t pitch_and_family;
unsigned char facename[64]; unsigned char facename[64];
} log_font_t; } OUT_PACK log_font_t;
typedef struct emr_text { typedef struct emr_text {
point_l_t reference; point_l_t reference;
@ -99,7 +101,7 @@ extern "C" {
uint32_t options; uint32_t options;
rect_l_t rectangle; rect_l_t rectangle;
uint32_t off_dx; uint32_t off_dx;
} emr_text_t; } OUT_PACK emr_text_t;
typedef struct emf_header { typedef struct emf_header {
rect_l_t bounds; rect_l_t bounds;
@ -121,19 +123,19 @@ extern "C" {
uint32_t b_open_gl; uint32_t b_open_gl;
/* HeaderExtension2 Object */ /* HeaderExtension2 Object */
size_l_t micrometers; size_l_t micrometers;
} emf_header_t; } OUT_PACK emf_header_t;
typedef struct emr_header { typedef struct emr_header {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
emf_header_t emf_header; emf_header_t emf_header;
} emr_header_t; } OUT_PACK emr_header_t;
typedef struct emr_mapmode { typedef struct emr_mapmode {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
uint32_t mapmode; uint32_t mapmode;
} emr_mapmode_t; } OUT_PACK emr_mapmode_t;
typedef struct emr_setworldtransform { typedef struct emr_setworldtransform {
uint32_t type; uint32_t type;
@ -144,39 +146,39 @@ extern "C" {
float m22; float m22;
float dx; float dx;
float dy; float dy;
} emr_setworldtransform_t; } OUT_PACK emr_setworldtransform_t;
typedef struct emr_createbrushindirect { typedef struct emr_createbrushindirect {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
uint32_t ih_brush; uint32_t ih_brush;
log_brush_ex_t log_brush; log_brush_ex_t log_brush;
} emr_createbrushindirect_t; } OUT_PACK emr_createbrushindirect_t;
typedef struct emr_createpen { typedef struct emr_createpen {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
uint32_t ih_pen; uint32_t ih_pen;
log_pen_t log_pen; log_pen_t log_pen;
} emr_createpen_t; } OUT_PACK emr_createpen_t;
typedef struct emr_selectobject { typedef struct emr_selectobject {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
uint32_t ih_object; uint32_t ih_object;
} emr_selectobject_t; } OUT_PACK emr_selectobject_t;
typedef struct emr_rectangle { typedef struct emr_rectangle {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
rect_l_t box; rect_l_t box;
} emr_rectangle_t; } OUT_PACK emr_rectangle_t;
typedef struct emr_ellipse { typedef struct emr_ellipse {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
rect_l_t box; rect_l_t box;
} emr_ellipse_t; } OUT_PACK emr_ellipse_t;
typedef struct emr_polygon { typedef struct emr_polygon {
uint32_t type; uint32_t type;
@ -189,26 +191,26 @@ extern "C" {
point_l_t a_points_d; point_l_t a_points_d;
point_l_t a_points_e; point_l_t a_points_e;
point_l_t a_points_f; point_l_t a_points_f;
} emr_polygon_t; } OUT_PACK emr_polygon_t;
typedef struct emr_extcreatefontindirectw { typedef struct emr_extcreatefontindirectw {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
uint32_t ih_fonts; uint32_t ih_fonts;
log_font_t elw; log_font_t elw;
} emr_extcreatefontindirectw_t; } OUT_PACK emr_extcreatefontindirectw_t;
typedef struct emr_settextalign { typedef struct emr_settextalign {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
uint32_t text_alignment_mode; uint32_t text_alignment_mode;
} emr_settextalign_t; } OUT_PACK emr_settextalign_t;
typedef struct emr_settextcolor { typedef struct emr_settextcolor {
uint32_t type; uint32_t type;
uint32_t size; uint32_t size;
color_ref_t color; color_ref_t color;
} emr_settextcolor_t; } OUT_PACK emr_settextcolor_t;
typedef struct emr_exttextoutw { typedef struct emr_exttextoutw {
uint32_t type; uint32_t type;
@ -218,7 +220,7 @@ extern "C" {
float ex_scale; float ex_scale;
float ey_scale; float ey_scale;
emr_text_t w_emr_text; emr_text_t w_emr_text;
} emr_exttextoutw_t; } OUT_PACK emr_exttextoutw_t;
typedef struct emr_eof { typedef struct emr_eof {
uint32_t type; uint32_t type;
@ -226,16 +228,18 @@ extern "C" {
uint32_t n_pal_entries; uint32_t n_pal_entries;
uint32_t off_pal_entries; uint32_t off_pal_entries;
uint32_t size_last; uint32_t size_last;
} emr_eof_t; } OUT_PACK emr_eof_t;
typedef struct box { typedef struct box {
emr_rectangle_t top; emr_rectangle_t top;
emr_rectangle_t bottom; emr_rectangle_t bottom;
emr_rectangle_t left; emr_rectangle_t left;
emr_rectangle_t right; emr_rectangle_t right;
} box_t; } OUT_PACK box_t;
#ifdef _MSC_VER
#pragma pack() #pragma pack()
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -397,9 +397,9 @@ INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf)
*/ */
if (transparent_index != -1) { if (transparent_index != -1) {
/* Extension Introducer = '!' */ /* Extension Introducer = '!' */
outbuf[0] = '\x21'; outbuf[0] = '!';
/* Graphic Control Label */ /* Graphic Control Label */
outbuf[1] = '\xf9'; outbuf[1] = 0xf9;
/* Block Size */ /* Block Size */
outbuf[2] = 4; outbuf[2] = 4;
/* Packet fields: /* Packet fields:
@ -452,7 +452,7 @@ INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf)
free(State.pOut); free(State.pOut);
/* GIF terminator */ /* GIF terminator */
fm_putc('\x3b', State.fmp); fm_putc(';', State.fmp);
if (fm_error(State.fmp)) { if (fm_error(State.fmp)) {
sprintf(symbol->errtxt, "615: Incomplete write to output (%d: %.30s)", State.fmp->err, sprintf(symbol->errtxt, "615: Incomplete write to output (%d: %.30s)", State.fmp->err,

View File

@ -113,6 +113,13 @@ INTERNAL FILE *out_win_fopen(const char *filename, const char *mode);
bp[3] = (unsigned char) ((*p_u32 >> 24) & 0xFF); \ bp[3] = (unsigned char) ((*p_u32 >> 24) & 0xFF); \
} while (0) } while (0)
/* For more portability, use `#pragma pack()` pair for MSCV, per-type packed attribute otherwise */
#ifdef _MSC_VER
# define OUT_PACK
#else
# define OUT_PACK __attribute__((__packed__))
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */ #endif /* __cplusplus */

View File

@ -37,7 +37,9 @@
extern "C" { extern "C" {
#endif #endif
#ifdef _MSC_VER
#pragma pack(1) #pragma pack(1)
#endif
typedef struct pcx_header { typedef struct pcx_header {
uint8_t manufacturer; uint8_t manufacturer;
@ -58,9 +60,11 @@ extern "C" {
uint16_t horiz_screen_size; uint16_t horiz_screen_size;
uint16_t vert_screen_size; uint16_t vert_screen_size;
uint8_t filler[54]; uint8_t filler[54];
} pcx_header_t; } OUT_PACK pcx_header_t;
#ifdef _MSC_VER
#pragma pack() #pragma pack()
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -1,7 +1,7 @@
/* tif.h - Aldus Tagged Image File Format */ /* tif.h - Aldus Tagged Image File Format */
/* /*
libzint - the open source barcode library libzint - the open source barcode library
Copyright (C) 2016-2022 Robin Stuart <rstuart114@gmail.com> Copyright (C) 2016-2024 Robin Stuart <rstuart114@gmail.com>
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions
@ -37,28 +37,32 @@
extern "C" { extern "C" {
#endif #endif
#ifdef _MSC_VER
#pragma pack(1) #pragma pack(1)
#endif
typedef struct tiff_header { typedef struct tiff_header {
uint16_t byte_order; uint16_t byte_order;
uint16_t identity; uint16_t identity;
uint32_t offset; uint32_t offset;
} tiff_header_t; } OUT_PACK tiff_header_t;
typedef struct tiff_tag { typedef struct tiff_tag {
uint16_t tag; uint16_t tag;
uint16_t type; uint16_t type;
uint32_t count; uint32_t count;
uint32_t offset; uint32_t offset;
} tiff_tag_t; } OUT_PACK tiff_tag_t;
typedef struct tiff_color { typedef struct tiff_color {
uint16_t red; uint16_t red;
uint16_t green; uint16_t green;
uint16_t blue; uint16_t blue;
} tiff_color_t; } OUT_PACK tiff_color_t;
#ifdef _MSC_VER
#pragma pack() #pragma pack()
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }