From 0a00d04ccc6e6e296de0e9947a0fe00c05e7d765 Mon Sep 17 00:00:00 2001 From: gitlost Date: Mon, 27 May 2024 20:55:04 +0100 Subject: [PATCH] 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()` --- CMakeLists.txt | 38 +++++++++++++++++----------------- backend/bmp.h | 16 ++++++++------ backend/code.c | 22 ++++++++++---------- backend/emf.h | 54 ++++++++++++++++++++++++++---------------------- backend/gif.c | 6 +++--- backend/output.h | 7 +++++++ backend/pcx.h | 10 ++++++--- backend/tif.h | 12 +++++++---- 8 files changed, 94 insertions(+), 71 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d4b76ac8..afa5673d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,36 +36,36 @@ endif() include(SetPaths.cmake) -include(CheckCXXCompilerFlag) +include(CheckCCompilerFlag) include(CheckFunctionExists) if(NOT MSVC) # Use default warnings if MSVC otherwise inundated - check_cxx_compiler_flag("-Wall" CXX_COMPILER_FLAG_WALL) - if(CXX_COMPILER_FLAG_WALL) + check_c_compiler_flag("-Wall" C_COMPILER_FLAG_WALL) + if(C_COMPILER_FLAG_WALL) add_compile_options("-Wall") endif() - check_cxx_compiler_flag("-Wextra" CXX_COMPILER_FLAG_WEXTRA) - if(CXX_COMPILER_FLAG_WEXTRA) + check_c_compiler_flag("-Wextra" C_COMPILER_FLAG_WEXTRA) + if(C_COMPILER_FLAG_WEXTRA) add_compile_options("-Wextra") endif() - check_cxx_compiler_flag("-Wpedantic" CXX_COMPILER_FLAG_WPEDANTIC) - if(CXX_COMPILER_FLAG_WPEDANTIC) + check_c_compiler_flag("-Wpedantic" C_COMPILER_FLAG_WPEDANTIC) + if(C_COMPILER_FLAG_WPEDANTIC) add_compile_options("-Wpedantic") endif() endif() if(ZINT_DEBUG) - check_cxx_compiler_flag("-g" CXX_COMPILER_FLAG_G) - if(CXX_COMPILER_FLAG_G) + check_c_compiler_flag("-g" C_COMPILER_FLAG_G) + if(C_COMPILER_FLAG_G) add_compile_options("-g") endif() endif() if(ZINT_NOOPT) - check_cxx_compiler_flag("-O0" CXX_COMPILER_FLAG_O0) - if(CXX_COMPILER_FLAG_O0) + check_c_compiler_flag("-O0" C_COMPILER_FLAG_O0) + if(C_COMPILER_FLAG_O0) add_compile_options("-O0") endif() endif() @@ -82,19 +82,19 @@ if(ZINT_SANITIZE) set(SANITIZERS address undefined) foreach(sanitizer IN ITEMS ${SANITIZERS}) set(CMAKE_REQUIRED_LIBRARIES -fsanitize=${sanitizer}) - check_cxx_compiler_flag(-fsanitize=${sanitizer} CXX_COMPILER_FLAG_FSANITIZE_${sanitizer}) - if(CXX_COMPILER_FLAG_FSANITIZE_${sanitizer}) + check_c_compiler_flag(-fsanitize=${sanitizer} C_COMPILER_FLAG_FSANITIZE_${sanitizer}) + if(C_COMPILER_FLAG_FSANITIZE_${sanitizer}) add_compile_options(-fsanitize=${sanitizer}) link_libraries(-fsanitize=${sanitizer}) endif() unset(CMAKE_REQUIRED_LIBRARIES) 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 add_compile_options(-fno-var-tracking-assignments) 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 add_compile_options(-Wno-deprecated-declarations) endif() @@ -107,14 +107,14 @@ endif() if(ZINT_COVERAGE) 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) - if(CXX_COMPILER_FLAG_COVERAGE) + if(C_COMPILER_FLAG_COVERAGE) add_compile_options(--coverage) link_libraries(-fprofile-arcs) - check_cxx_compiler_flag(-O0 CXX_COMPILER_FLAG_O0) - if(CXX_COMPILER_FLAG_O0) + check_c_compiler_flag(-O0 C_COMPILER_FLAG_O0) + if(C_COMPILER_FLAG_O0) add_compile_options(-O0) endif() endif() diff --git a/backend/bmp.h b/backend/bmp.h index 3cb00f11..6de4c911 100644 --- a/backend/bmp.h +++ b/backend/bmp.h @@ -1,7 +1,7 @@ /* bmp.h - header structure for Windows bitmap files */ /* libzint - the open source barcode library - Copyright (C) 2009-2022 Robin Stuart + Copyright (C) 2009-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,14 +37,16 @@ extern "C" { #endif -#pragma pack (1) +#ifdef _MSC_VER +#pragma pack(1) +#endif typedef struct bitmap_file_header { uint16_t header_field; uint32_t file_size; uint32_t reserved; uint32_t data_offset; - } bitmap_file_header_t; + } OUT_PACK bitmap_file_header_t; typedef struct bitmap_info_header { uint32_t header_size; @@ -58,16 +60,18 @@ extern "C" { int32_t vert_res; uint32_t colours; uint32_t important_colours; - } bitmap_info_header_t; + } OUT_PACK bitmap_info_header_t; typedef struct color_ref { uint8_t blue; uint8_t green; uint8_t red; uint8_t reserved; - } color_ref_t; + } OUT_PACK color_ref_t; -#pragma pack () +#ifdef _MSC_VER +#pragma pack() +#endif #ifdef __cplusplus } diff --git a/backend/code.c b/backend/code.c index 635871f7..dd5772ae 100644 --- a/backend/code.c +++ b/backend/code.c @@ -631,19 +631,19 @@ static void channel_generate_precalc(int channels, long value, int mod, int last #include "channel_precalcs.h" #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; for (i = 0; i < 7; i++) { - B[i] = precalc.B[i]; - S[i] = precalc.S[i]; - bmax[i] = precalc.bmax[i]; - smax[i] = precalc.smax[i]; + B[i] = precalc->B[i]; + S[i] = precalc->S[i]; + bmax[i] = precalc->bmax[i]; + smax[i] = precalc->smax[i]; } - B[7] = precalc.B[7]; - S[7] = precalc.S[7]; + B[7] = precalc->B[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 */ @@ -676,14 +676,14 @@ static void CHNCHR(int channels, long target_value, int B[8], int S[8]) { int bmax[7], smax[7]; 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 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); } 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); } #endif diff --git a/backend/emf.h b/backend/emf.h index 1f5de457..599cdb93 100644 --- a/backend/emf.h +++ b/backend/emf.h @@ -1,7 +1,7 @@ /* emf.h - header structure for Microsoft EMF */ /* libzint - the open source barcode library - Copyright (C) 2016-2022 Robin Stuart + Copyright (C) 2016-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,43 +37,45 @@ extern "C" { #endif +#ifdef _MSC_VER #pragma pack(1) +#endif typedef struct rect_l { int32_t left; int32_t top; int32_t right; int32_t bottom; - } rect_l_t; + } OUT_PACK rect_l_t; typedef struct size_l { uint32_t cx; uint32_t cy; - } size_l_t; + } OUT_PACK size_l_t; typedef struct point_l { int32_t x; int32_t y; - } point_l_t; + } OUT_PACK point_l_t; typedef struct color_ref { uint8_t red; uint8_t green; uint8_t blue; uint8_t reserved; - } color_ref_t; + } OUT_PACK color_ref_t; typedef struct log_brush_ex { uint32_t brush_style; color_ref_t color; uint32_t brush_hatch; - } log_brush_ex_t; + } OUT_PACK log_brush_ex_t; typedef struct log_pen { uint32_t pen_style; point_l_t width; color_ref_t color_ref; - } log_pen_t; + } OUT_PACK log_pen_t; typedef struct log_font { int32_t height; @@ -90,7 +92,7 @@ extern "C" { uint8_t quality; uint8_t pitch_and_family; unsigned char facename[64]; - } log_font_t; + } OUT_PACK log_font_t; typedef struct emr_text { point_l_t reference; @@ -99,7 +101,7 @@ extern "C" { uint32_t options; rect_l_t rectangle; uint32_t off_dx; - } emr_text_t; + } OUT_PACK emr_text_t; typedef struct emf_header { rect_l_t bounds; @@ -121,19 +123,19 @@ extern "C" { uint32_t b_open_gl; /* HeaderExtension2 Object */ size_l_t micrometers; - } emf_header_t; + } OUT_PACK emf_header_t; typedef struct emr_header { uint32_t type; uint32_t size; emf_header_t emf_header; - } emr_header_t; + } OUT_PACK emr_header_t; typedef struct emr_mapmode { uint32_t type; uint32_t size; uint32_t mapmode; - } emr_mapmode_t; + } OUT_PACK emr_mapmode_t; typedef struct emr_setworldtransform { uint32_t type; @@ -144,39 +146,39 @@ extern "C" { float m22; float dx; float dy; - } emr_setworldtransform_t; + } OUT_PACK emr_setworldtransform_t; typedef struct emr_createbrushindirect { uint32_t type; uint32_t size; uint32_t ih_brush; log_brush_ex_t log_brush; - } emr_createbrushindirect_t; + } OUT_PACK emr_createbrushindirect_t; typedef struct emr_createpen { uint32_t type; uint32_t size; uint32_t ih_pen; log_pen_t log_pen; - } emr_createpen_t; + } OUT_PACK emr_createpen_t; typedef struct emr_selectobject { uint32_t type; uint32_t size; uint32_t ih_object; - } emr_selectobject_t; + } OUT_PACK emr_selectobject_t; typedef struct emr_rectangle { uint32_t type; uint32_t size; rect_l_t box; - } emr_rectangle_t; + } OUT_PACK emr_rectangle_t; typedef struct emr_ellipse { uint32_t type; uint32_t size; rect_l_t box; - } emr_ellipse_t; + } OUT_PACK emr_ellipse_t; typedef struct emr_polygon { uint32_t type; @@ -189,26 +191,26 @@ extern "C" { point_l_t a_points_d; point_l_t a_points_e; point_l_t a_points_f; - } emr_polygon_t; + } OUT_PACK emr_polygon_t; typedef struct emr_extcreatefontindirectw { uint32_t type; uint32_t size; uint32_t ih_fonts; log_font_t elw; - } emr_extcreatefontindirectw_t; + } OUT_PACK emr_extcreatefontindirectw_t; typedef struct emr_settextalign { uint32_t type; uint32_t size; uint32_t text_alignment_mode; - } emr_settextalign_t; + } OUT_PACK emr_settextalign_t; typedef struct emr_settextcolor { uint32_t type; uint32_t size; color_ref_t color; - } emr_settextcolor_t; + } OUT_PACK emr_settextcolor_t; typedef struct emr_exttextoutw { uint32_t type; @@ -218,7 +220,7 @@ extern "C" { float ex_scale; float ey_scale; emr_text_t w_emr_text; - } emr_exttextoutw_t; + } OUT_PACK emr_exttextoutw_t; typedef struct emr_eof { uint32_t type; @@ -226,16 +228,18 @@ extern "C" { uint32_t n_pal_entries; uint32_t off_pal_entries; uint32_t size_last; - } emr_eof_t; + } OUT_PACK emr_eof_t; typedef struct box { emr_rectangle_t top; emr_rectangle_t bottom; emr_rectangle_t left; emr_rectangle_t right; - } box_t; + } OUT_PACK box_t; +#ifdef _MSC_VER #pragma pack() +#endif #ifdef __cplusplus } diff --git a/backend/gif.c b/backend/gif.c index 89b67522..7c5d8395 100644 --- a/backend/gif.c +++ b/backend/gif.c @@ -397,9 +397,9 @@ INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf) */ if (transparent_index != -1) { /* Extension Introducer = '!' */ - outbuf[0] = '\x21'; + outbuf[0] = '!'; /* Graphic Control Label */ - outbuf[1] = '\xf9'; + outbuf[1] = 0xf9; /* Block Size */ outbuf[2] = 4; /* Packet fields: @@ -452,7 +452,7 @@ INTERNAL int gif_pixel_plot(struct zint_symbol *symbol, unsigned char *pixelbuf) free(State.pOut); /* GIF terminator */ - fm_putc('\x3b', State.fmp); + fm_putc(';', State.fmp); if (fm_error(State.fmp)) { sprintf(symbol->errtxt, "615: Incomplete write to output (%d: %.30s)", State.fmp->err, diff --git a/backend/output.h b/backend/output.h index 6ff52fab..3dc18f59 100644 --- a/backend/output.h +++ b/backend/output.h @@ -113,6 +113,13 @@ INTERNAL FILE *out_win_fopen(const char *filename, const char *mode); bp[3] = (unsigned char) ((*p_u32 >> 24) & 0xFF); \ } 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 } #endif /* __cplusplus */ diff --git a/backend/pcx.h b/backend/pcx.h index 3e141732..3debb3db 100644 --- a/backend/pcx.h +++ b/backend/pcx.h @@ -37,7 +37,9 @@ extern "C" { #endif -#pragma pack (1) +#ifdef _MSC_VER +#pragma pack(1) +#endif typedef struct pcx_header { uint8_t manufacturer; @@ -58,9 +60,11 @@ extern "C" { uint16_t horiz_screen_size; uint16_t vert_screen_size; uint8_t filler[54]; - } pcx_header_t; + } OUT_PACK pcx_header_t; -#pragma pack () +#ifdef _MSC_VER +#pragma pack() +#endif #ifdef __cplusplus } diff --git a/backend/tif.h b/backend/tif.h index 1709bc92..a9c8ea01 100644 --- a/backend/tif.h +++ b/backend/tif.h @@ -1,7 +1,7 @@ /* tif.h - Aldus Tagged Image File Format */ /* libzint - the open source barcode library - Copyright (C) 2016-2022 Robin Stuart + Copyright (C) 2016-2024 Robin Stuart Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -37,28 +37,32 @@ extern "C" { #endif +#ifdef _MSC_VER #pragma pack(1) +#endif typedef struct tiff_header { uint16_t byte_order; uint16_t identity; uint32_t offset; - } tiff_header_t; + } OUT_PACK tiff_header_t; typedef struct tiff_tag { uint16_t tag; uint16_t type; uint32_t count; uint32_t offset; - } tiff_tag_t; + } OUT_PACK tiff_tag_t; typedef struct tiff_color { uint16_t red; uint16_t green; uint16_t blue; - } tiff_color_t; + } OUT_PACK tiff_color_t; +#ifdef _MSC_VER #pragma pack() +#endif #ifdef __cplusplus }