From d30715bc2cd560b0cdbe3c9e82179c389e308401 Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Fri, 15 Mar 2024 13:59:52 +0100 Subject: [PATCH] add #ifdefs for missing libjpeg libraries to avoid link problems, remove some warnings from compilers/glib versions that tave some functions marked as -Wunused-result --- doc/xschem_man/install_xschem.html | 21 ++++++++++++--------- src/draw.c | 27 ++++++++++++++++++++++++--- src/main.c | 7 +++++-- src/save.c | 13 ++++++++----- 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/doc/xschem_man/install_xschem.html b/doc/xschem_man/install_xschem.html index d0cf6ab7..89ffc4ec 100644 --- a/doc/xschem_man/install_xschem.html +++ b/doc/xschem_man/install_xschem.html @@ -65,15 +65,18 @@ p{padding: 15px 30px 10px;} Tck/Tk versions may vary on different systems, 8.4, 8.5, 8.6 versions are all good.

-  libx11-6              libx11-dev
-  libxrender1           libxrender-dev
-  libxcb1               libx11-xcb-dev        
-  libcairo2             libcairo2-dev
-  tcl8.6                tcl8.6-dev
-  tk8.6                 tk8.6-dev
-  flex                  bison
-  libxpm4               libxpm-dev
-                        libjpeg-dev
+  LIBRARIES                              DEVELOPMENT FILES
+-----------------------------------------------------------
+  libx11-6                               libx11-dev
+  libxrender1                            libxrender-dev
+  libxcb1                                libx11-xcb-dev        
+  libcairo2                              libcairo2-dev
+  tcl8.6                                 tcl8.6-dev
+  tk8.6                                  tk8.6-dev
+  flex                                   bison
+  libxpm4                                libxpm-dev
+  libjpeg62-turbo or libjpeg             libjpeg-dev
+
 # terminal program and editor used by default by xschem:
 # alternative programs can be specified in xschemrc by 
 # setting tcl variables 'terminal' and 'editor', respectively.
diff --git a/src/draw.c b/src/draw.c
index 02dc9386..4f7c20cb 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -3910,8 +3910,10 @@ void inspect_image(cairo_surface_t* surface)
  */
 void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2, int rot, int flip)
 {
-  #if HAS_CAIRO == 1
+  #if HAS_CAIRO==1
+  #if defined(HAS_LIBJPEG)
   int jpeg_quality=75;
+  #endif
   const char *ptr;
   int w,h;
   double x, y, rw, rh;
@@ -3944,9 +3946,11 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
   }
   my_strncpy(filename, get_tok_value(r->prop_ptr, "image", 0), S(filename));
   my_strdup(_ALLOC_ID_, &filter, get_tok_value(r->prop_ptr, "filter", 0));
+  #if defined(HAS_LIBJPEG)
   ptr = get_tok_value(r->prop_ptr, "quality", 0);
   jpeg_quality = 75;
   if(ptr[0]) jpeg_quality = atoi(ptr);
+  #endif
   /* read image from in-memory buffer ... */
   if(emb_ptr && emb_ptr->image) {
     ; /* nothing to do, image is already created */
@@ -3962,7 +3966,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
     if(jpg == 0) {
       emb_ptr->image = cairo_image_surface_create_from_png_stream(png_reader, &closure);
     } else if(jpg == 1) {
+      #if defined(HAS_LIBJPEG)
       emb_ptr->image = cairo_image_surface_create_from_jpeg_mem(closure.buffer, closure.size);
+      #endif
     }
     if(! emb_ptr->image || cairo_surface_status(emb_ptr->image) != CAIRO_STATUS_SUCCESS) {
       dbg(0, "draw_image(): failure creating image surface from \"image_data\" attribute\n");
@@ -3988,8 +3994,12 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
       if(filesize) {
         fd = fopen(filename, "r");
         if(fd) {
+          size_t bytes_read;
           filedata = my_malloc(_ALLOC_ID_, filesize);
-          fread(filedata, filesize, 1, fd);
+          if((bytes_read = fread(filedata, filesize, 1, fd)) < filesize) {
+            filesize = bytes_read;
+            dbg(0, "draw_image(): less bytes read than expected from %s, got %ld bytes\n", filename, bytes_read);
+          }
           fclose(fd);
         }
       }
@@ -4003,7 +4013,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
       if(jpg == 0) {
         emb_ptr->image = cairo_image_surface_create_from_png_stream(png_reader, &closure);
       } else if(jpg == 1) {
+        #if defined(HAS_LIBJPEG)
         emb_ptr->image = cairo_image_surface_create_from_jpeg_mem(closure.buffer, closure.size);
+        #endif
       }
       if(! emb_ptr->image || cairo_surface_status(emb_ptr->image) != CAIRO_STATUS_SUCCESS) {
         dbg(0, "draw_image(): failure creating image surface with filtered data from %s\n", filename);
@@ -4022,7 +4034,12 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
       header[0] = '\0';
       fd = fopen(filename, "r");
       if(fd) {
-        fread(header, size, 1, fd);
+        size_t bytes_read;
+        if((bytes_read = fread(header, size, 1, fd)) < size) {
+          size = bytes_read;
+          dbg(0, "draw_image(): less bytes read than expected from %s, got %ld bytes\n", filename, bytes_read);
+        }
+
         fclose(fd);
       }
       if(!strncmp(header, "\x89PNG", 4)) jpg = 0;
@@ -4034,7 +4051,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
       if(jpg == 0) {
         emb_ptr->image = cairo_image_surface_create_from_png(filename);
       } else if(jpg == 1) {
+        #if defined(HAS_LIBJPEG)
         emb_ptr->image = cairo_image_surface_create_from_jpeg(filename);
+        #endif
       }
       if(! emb_ptr->image || cairo_surface_status(emb_ptr->image) != CAIRO_STATUS_SUCCESS) {
         dbg(0, "draw_image(): failure creating image surface from %s\n", filename);
@@ -4046,7 +4065,9 @@ void draw_image(int dr, xRect *r, double *x1, double *y1, double *x2, double *y2
         cairo_surface_write_to_png_stream(emb_ptr->image, png_writer, &closure);
       } else if(jpg == 1) {
         /* write JPG to in-memory buffer */
+        #if defined(HAS_LIBJPEG)
         cairo_image_surface_write_to_jpeg_mem(emb_ptr->image, &closure.buffer, &closure.pos, jpeg_quality);
+        #endif
       }
       encoded_data = base64_encode(closure.buffer, closure.pos, &olength, 0);
       my_free(_ALLOC_ID_, &closure.buffer);
diff --git a/src/main.c b/src/main.c
index 3f284a7c..f89c116f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -73,6 +73,7 @@ static void child_handler(int signum)
 int main(int argc, char **argv)
 {
   int i;
+  FILE *retval = 0;
   #ifdef __unix__
   int stdin_is_a_fifo = 0;
   struct stat statbuf;
@@ -137,8 +138,10 @@ int main(int argc, char **argv)
   if(cli_opt_detach) {
     fclose(stdin);
     #ifdef __unix__
-    freopen("/dev/null", "w", stdout);
-    freopen("/dev/null", "w", stderr);
+    retval = freopen("/dev/null", "w", stdout);
+    if(!retval) fprintf(stderr, "main(): freopen stdout to /dev/null failed\n");
+    retval = freopen("/dev/null", "w", stderr);
+    if(!retval) fprintf(stderr, "main(): freopen stderr to /dev/null failed\n");
     #else
     freopen("nul", "w", stdout);
     freopen("nul", "w", stderr);
diff --git a/src/save.c b/src/save.c
index 14439e35..c25f0de5 100644
--- a/src/save.c
+++ b/src/save.c
@@ -76,8 +76,8 @@ int filter_data(const char *din,  const size_t ilen,
   }
 
   dbg(1, "filter_data(): ilen=%ld, cmd=%s\n", ilen, cmd);
-  pipe(p1);
-  pipe(p2);
+  if(pipe(p1) == -1) dbg(0, "filter_data(): pipe creation failed\n");
+  if(pipe(p2) == -1) dbg(0, "filter_data(): pipe creation failed\n");
 
   dbg(1, "p1[0] = %d\n", p1[0]);
   dbg(1, "p1[1] = %d\n", p1[1]);
@@ -104,10 +104,10 @@ int filter_data(const char *din,  const size_t ilen,
     close(p1[1]); /* only read from p1 */
     close(p2[0]); /* only write to p2 */
     close(0); /* dup2(p1[0],0); */  /* connect read side of read pipe to stdin */
-    dup(p1[0]);
+    if(dup(p1[0]) == -1) dbg(0, "filter_data(): dup() call failed\n");
     close(p1[0]);
     close(1); /* dup2(p2[1],1); */ /* connect write side of write pipe to stdout */
-    dup(p2[1]);
+    if(dup(p2[1]) == -1) dbg(0, "filter_data(): dup() call failed\n");
     close(p2[1]);
 
     #if 1
@@ -775,8 +775,11 @@ char *base64_from_file(const char *f, size_t *length)
     len = st.st_size;
     fd = fopen(f, fopen_read_mode);
     if(fd) {
+      size_t bytes_read;
       s = my_malloc(_ALLOC_ID_, len);
-      fread(s, len, 1, fd);
+      if((bytes_read = fread(s, len, 1, fd)) < len) {
+        dbg(0, "base64_from_file(): less bytes FROM %S, got %ld bytes\n", f, bytes_read);
+      }
       fclose(fd);
       b64s = base64_encode(s, len, length, 1);
       my_free(_ALLOC_ID_, &s);