full adaptation to c99 master
authorLaurent Mazet <mazet@softndesign.org>
Tue, 15 Apr 2025 08:09:48 +0000 (10:09 +0200)
committerLaurent Mazet <mazet@softndesign.org>
Tue, 15 Apr 2025 08:09:48 +0000 (10:09 +0200)
display.c
function.c
makefile

index 266e710ab9960cffd697f65b7abebe2a875c6a28..92d188dc255bb5f9983d93b413eb1194ad74f43a 100644 (file)
--- a/display.c
+++ b/display.c
@@ -73,8 +73,7 @@ int _helpwindow (char *msg, int xoffset, int yoffset, int length)
 
 void _displaytitle (char *title, int xoffset, int yoffset)
 {
 
 void _displaytitle (char *title, int xoffset, int yoffset)
 {
-    int i;
-    for (i = 0; title[i] != '\0'; i++) {
+    for (int i = 0; title[i] != '\0'; i++) {
         mvaddch (yoffset, xoffset + i, title[i]);
         mvaddch (yoffset + 1, xoffset + i, ACS_HLINE);
     }
         mvaddch (yoffset, xoffset + i, title[i]);
         mvaddch (yoffset + 1, xoffset + i, ACS_HLINE);
     }
@@ -82,13 +81,11 @@ void _displaytitle (char *title, int xoffset, int yoffset)
 
 void _dobound (int xsize, int ysize, int xoffset, int yoffset)
 {
 
 void _dobound (int xsize, int ysize, int xoffset, int yoffset)
 {
-    int i, j;
-
-    for (i = 0; i < xsize; i++) {
+    for (int i = 0; i < xsize; i++) {
         mvaddch (yoffset - 1, xoffset + i, ACS_HLINE);
         mvaddch (yoffset + ysize, xoffset + i, ACS_HLINE);
     }
         mvaddch (yoffset - 1, xoffset + i, ACS_HLINE);
         mvaddch (yoffset + ysize, xoffset + i, ACS_HLINE);
     }
-    for (j = 0; j < ysize; j++) {
+    for (int j = 0; j < ysize; j++) {
         mvaddch (yoffset + j, xoffset - 1, ACS_VLINE);
         mvaddch (yoffset + j, xoffset + xsize, ACS_VLINE);
     }
         mvaddch (yoffset + j, xoffset - 1, ACS_VLINE);
         mvaddch (yoffset + j, xoffset + xsize, ACS_VLINE);
     }
@@ -114,8 +111,7 @@ void librarywindow (char *msg, int xoffset, int yoffset)
     mvaddstr (yoffset, xoffset + (LIBWIDTH - 7) / 2, "Library");
     set_color (black);
 
     mvaddstr (yoffset, xoffset + (LIBWIDTH - 7) / 2, "Library");
     set_color (black);
 
-    int i;
-    for (i = 0; i < LIBWIDTH; i++) {
+    for (int i = 0; i < LIBWIDTH; i++) {
         mvaddch (yoffset + 1, xoffset + i, ' ');
     }
 
         mvaddch (yoffset + 1, xoffset + i, ' ');
     }
 
@@ -127,14 +123,12 @@ void librarywindow (char *msg, int xoffset, int yoffset)
 
 void boardwindow (board_t *board, int xoffset, int yoffset, int bound)
 {
 
 void boardwindow (board_t *board, int xoffset, int yoffset, int bound)
 {
-    int i, j;
-
     if (bound) {
         _dobound (board->xsize, board->ysize, xoffset, yoffset);
     }
 
     if (bound) {
         _dobound (board->xsize, board->ysize, xoffset, yoffset);
     }
 
-    for (i = 0; i < board->xsize; i++) {
-        for (j = 0; j < board->ysize; j++) {
+    for (int i = 0; i < board->xsize; i++) {
+        for (int j = 0; j < board->ysize; j++) {
             char cell = *getcell (board, i, j);
             switch (cell) {
             case '1':
             char cell = *getcell (board, i, j);
             switch (cell) {
             case '1':
@@ -163,10 +157,8 @@ void boardwindow (board_t *board, int xoffset, int yoffset, int bound)
 
 void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y)
 {
 
 void elementwindow (board_t *board, int xoffset, int yoffset, board_t *element, int x, int y)
 {
-    int i, j;
-
-    for (i = 0; i < element->xsize; i++) {
-        for (j = 0; j < element->ysize; j++) {
+    for (int i = 0; i < element->xsize; i++) {
+        for (int j = 0; j < element->ysize; j++) {
             if (*getcell (element, i, j) == 'X') {
                 set_color (blue);
                 mvaddch (yoffset + (y + j) % board->ysize, xoffset + (x + i) % board->xsize, ' ');
             if (*getcell (element, i, j) == 'X') {
                 set_color (blue);
                 mvaddch (yoffset + (y + j) % board->ysize, xoffset + (x + i) % board->xsize, ' ');
@@ -186,10 +178,10 @@ char *savewindow (int length, int xoffset, int yoffset)
     _dobound (length, 1, xoffset, yoffset);
     set_color (white);
 
     _dobound (length, 1, xoffset, yoffset);
     set_color (white);
 
-    int i = 0, j;
+    int i = 0;
     int stop = 0;
     while (!stop) {
     int stop = 0;
     while (!stop) {
-        for (j = 0; j < length; j++) {
+        for (int j = 0; j < length; j++) {
             set_color ((j == i) ? yellow : black);
             mvaddch (yoffset, xoffset + j, name[j]);
             set_color (white);
             set_color ((j == i) ? yellow : black);
             mvaddch (yoffset, xoffset + j, name[j]);
             set_color (white);
@@ -234,7 +226,7 @@ char *savewindow (int length, int xoffset, int yoffset)
     }
 
     if (name) {
     }
 
     if (name) {
-        for (j = length - 1; j >= 0; j--) {
+        for (int j = length - 1; j >= 0; j--) {
             if (name[j] == ' ') {
                 name[j] = '\0';
             }
             if (name[j] == ' ') {
                 name[j] = '\0';
             }
index d2daf9b84dcfba7d4a40357a04bf59ad2ba4eef7..b0c529228ffa038d3c330e70dcbfe669ceacc74d 100644 (file)
@@ -49,12 +49,10 @@ board_t *copyboard (board_t *dst, board_t *src)
 
 board_t *resizeboard (board_t *board, int xsize, int ysize, int xoffset, int yoffset)
 {
 
 board_t *resizeboard (board_t *board, int xsize, int ysize, int xoffset, int yoffset)
 {
-    int i, j;
-
     board_t *newboard = initboard (xsize, ysize);
 
     board_t *newboard = initboard (xsize, ysize);
 
-    for (i = 0; (i + max (0, xoffset) < board->xsize) && (i - min (0, xoffset) < xsize); i++) {
-        for (j = 0; (j + max (0, yoffset) < board->ysize) && (j - min (0, yoffset) < ysize); j++) {
+    for (int i = 0; (i + max (0, xoffset) < board->xsize) && (i - min (0, xoffset) < xsize); i++) {
+        for (int j = 0; (j + max (0, yoffset) < board->ysize) && (j - min (0, yoffset) < ysize); j++) {
             *getcell (newboard, i - min(0, xoffset), j - min (0, yoffset)) =
                 *getcell (board, i + max (0, xoffset), j + max (0, yoffset));
         }
             *getcell (newboard, i - min(0, xoffset), j - min (0, yoffset)) =
                 *getcell (board, i + max (0, xoffset), j + max (0, yoffset));
         }
@@ -138,10 +136,10 @@ void freeboard (board_t *board)
 
 int _makecomments (char *buffer, board_t *board)
 {
 
 int _makecomments (char *buffer, board_t *board)
 {
-    int i, j, l = 0;
-    for (j = 0; j < board->ysize; j++) {
+    int l = 0;
+    for (int j = 0; j < board->ysize; j++) {
         l += sprintf (buffer + l, "rem: \"");
         l += sprintf (buffer + l, "rem: \"");
-        for (i = 0; i < board->xsize; i++) {
+        for (int i = 0; i < board->xsize; i++) {
             l += sprintf (buffer + l, "%c", *getcell (board, i, j));
         }
         l += sprintf (buffer + l, "\"\n");
             l += sprintf (buffer + l, "%c", *getcell (board, i, j));
         }
         l += sprintf (buffer + l, "\"\n");
@@ -190,6 +188,11 @@ char *readdata (char *filename)
     if (fd) {
         fseek (fd, 0, SEEK_END);
         int size = ftell (fd);
     if (fd) {
         fseek (fd, 0, SEEK_END);
         int size = ftell (fd);
+        if (size == -1) {
+            VERBOSE (WARNING, printf ("can't fully read file (%s)\n", filename));
+            fclose (fd);
+            return buffer;
+        }
         buffer = (char *) calloc (size + 1, 1);
         CHECKALLOC (buffer);
 
         buffer = (char *) calloc (size + 1, 1);
         CHECKALLOC (buffer);
 
@@ -264,7 +267,7 @@ board_t *loadboard (char *str, char **pname)
         memcpy (board->tab, tab, xsize * ysize);
     }
     if ((board != NULL) && (pname != NULL)) {
         memcpy (board->tab, tab, xsize * ysize);
     }
     if ((board != NULL) && (pname != NULL)) {
-        *pname = strdup (name);
+        *pname = strdup (name ? name : "");
     }
 
     return board;
     }
 
     return board;
@@ -296,11 +299,10 @@ int getnbneighbours (board_t *board, int x, int y)
 
 board_t *computenextgen (board_t *board)
 {
 
 board_t *computenextgen (board_t *board)
 {
-    int i, j;
     board_t *nextboard = initboard (board->xsize, board->ysize);
 
     board_t *nextboard = initboard (board->xsize, board->ysize);
 
-    for (i = 0; i < board->xsize; i++) {
-        for (j = 0; j < board->ysize; j++) {
+    for (int i = 0; i < board->xsize; i++) {
+        for (int j = 0; j < board->ysize; j++) {
             int n = getnbneighbours (board, i, j);
             if (*getcell (board, i, j) == ' ') {
                 if ((n >= 3) && (n <= 3)) {
             int n = getnbneighbours (board, i, j);
             if (*getcell (board, i, j) == ' ') {
                 if ((n >= 3) && (n <= 3)) {
@@ -314,8 +316,8 @@ board_t *computenextgen (board_t *board)
         }
     }
 
         }
     }
 
-    for (i = 0; i < nextboard->xsize; i++) {
-        for (j = 0; j < nextboard->ysize; j++) {
+    for (int i = 0; i < nextboard->xsize; i++) {
+        for (int j = 0; j < nextboard->ysize; j++) {
             char *cell = getcell (nextboard, i, j);
             if (*cell != ' ') {
                 int n = getnbneighbours (nextboard, i, j);
             char *cell = getcell (nextboard, i, j);
             if (*cell != ' ') {
                 int n = getnbneighbours (nextboard, i, j);
@@ -334,8 +336,6 @@ board_t *computenextgen (board_t *board)
 
 board_t *rotateelement (board_t *element, int rot)
 {
 
 board_t *rotateelement (board_t *element, int rot)
 {
-    int i, j;
-
     rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4;
 
     board_t *newelement = (rot % 2 == 0) ? initboard (element->xsize, element->ysize) : initboard (element->ysize, element->xsize);
     rot = (rot > 0) ? rot % 4 : ((1 - rot / 4) * 4 + rot) % 4;
 
     board_t *newelement = (rot % 2 == 0) ? initboard (element->xsize, element->ysize) : initboard (element->ysize, element->xsize);
@@ -345,22 +345,22 @@ board_t *rotateelement (board_t *element, int rot)
         copyboard (newelement, element);
         break;
     case 1:
         copyboard (newelement, element);
         break;
     case 1:
-        for (i = 0; i < element->xsize; i++) {
-            for (j = 0; j < element->ysize; j++) {
+        for (int i = 0; i < element->xsize; i++) {
+            for (int j = 0; j < element->ysize; j++) {
                 *getcell (newelement, element->ysize - 1 - j, i) = *getcell (element, i, j);
             }
         }
         break;
     case 2:
                 *getcell (newelement, element->ysize - 1 - j, i) = *getcell (element, i, j);
             }
         }
         break;
     case 2:
-        for (i = 0; i < element->xsize; i++) {
-            for (j = 0; j < element->ysize; j++) {
+        for (int i = 0; i < element->xsize; i++) {
+            for (int j = 0; j < element->ysize; j++) {
                 *getcell (newelement, element->xsize - 1 - i, element->ysize - 1 - j) = *getcell (element, i, j);
             }
         }
         break;
     case 3:
                 *getcell (newelement, element->xsize - 1 - i, element->ysize - 1 - j) = *getcell (element, i, j);
             }
         }
         break;
     case 3:
-        for (i = 0; i < element->xsize; i++) {
-            for (j = 0; j < element->ysize; j++) {
+        for (int i = 0; i < element->xsize; i++) {
+            for (int j = 0; j < element->ysize; j++) {
                 *getcell (newelement, j, element->xsize - 1 - i) = *getcell (element, i, j);
             }
         }
                 *getcell (newelement, j, element->xsize - 1 - i) = *getcell (element, i, j);
             }
         }
@@ -376,11 +376,9 @@ board_t *rotateelement (board_t *element, int rot)
 
 board_t *mirrorelement (board_t *element, int mode)
 {
 
 board_t *mirrorelement (board_t *element, int mode)
 {
-    int i, j;
-
     if (mode > 0) { /* verticaly */
     if (mode > 0) { /* verticaly */
-        for (i = 0; i < element->xsize; i++) {
-            for (j = 0; j < element->ysize / 2; j++) {
+        for (int i = 0; i < element->xsize; i++) {
+            for (int j = 0; j < element->ysize / 2; j++) {
                 char *pt1 = getcell (element, i, j);
                 char *pt2 = getcell (element, i, element->ysize - 1 - j);
                 char temp = *pt1;
                 char *pt1 = getcell (element, i, j);
                 char *pt2 = getcell (element, i, element->ysize - 1 - j);
                 char temp = *pt1;
@@ -390,8 +388,8 @@ board_t *mirrorelement (board_t *element, int mode)
         }
     }
     if (mode < 0) { /* horizontaly */
         }
     }
     if (mode < 0) { /* horizontaly */
-        for (j = 0; j < element->ysize; j++) {
-            for (i = 0; i < element->xsize / 2 ; i++) {
+        for (int j = 0; j < element->ysize; j++) {
+            for (int i = 0; i < element->xsize / 2 ; i++) {
                 char *pt1 = getcell (element, i, j);
                 char *pt2 = getcell (element, element->xsize - 1 - i, j);
                 char temp = *pt1;
                 char *pt1 = getcell (element, i, j);
                 char *pt2 = getcell (element, element->xsize - 1 - i, j);
                 char temp = *pt1;
@@ -406,10 +404,8 @@ board_t *mirrorelement (board_t *element, int mode)
 
 board_t *putelement (board_t *board, board_t *element, int x, int y, int mode)
 {
 
 board_t *putelement (board_t *board, board_t *element, int x, int y, int mode)
 {
-    int i, j;
-
-    for (i = 0; i < element->xsize; i++) {
-        for (j = 0; j < element->ysize; j++) {
+    for (int i = 0; i < element->xsize; i++) {
+        for (int j = 0; j < element->ysize; j++) {
             if (*getcell (element, i, j) != ' ') {
                 *getcell (board, (x + i) % board->xsize, (y + j) % board->ysize) = (mode) ? 'X' : ' ';
             }
             if (*getcell (element, i, j) != ' ') {
                 *getcell (board, (x + i) % board->xsize, (y + j) % board->ysize) = (mode) ? 'X' : ' ';
             }
index 763ae7694e20b113ba51e85df348b6bbeb902e71..09ecb8bc309abe5c9bba31812b7dfecc3743bcb9 100644 (file)
--- a/makefile
+++ b/makefile
@@ -5,6 +5,7 @@ CC = gcc
 #INCLUDES = -I../debug -D__MEMORY_ALLOCATION__
 INCLUDES =
 OFLAGS  = -O4 -Os
 #INCLUDES = -I../debug -D__MEMORY_ALLOCATION__
 INCLUDES =
 OFLAGS  = -O4 -Os
+#OFLAGS  = -O0
 #OFLAGS  = -O4 -ffast-math -finline-functions
 #OFLAGS  = -O4 -finline-functions
 #OFLAGS += -mtune=pentium3 -mmmx -msse -msse2 -m3dnow
 #OFLAGS  = -O4 -ffast-math -finline-functions
 #OFLAGS  = -O4 -finline-functions
 #OFLAGS += -mtune=pentium3 -mmmx -msse -msse2 -m3dnow
@@ -13,21 +14,30 @@ OFLAGS  = -O4 -Os
 CFLAGS += -W -Wall -Wextra -g
 #CFLAGS += -std=c99 -D_XOPEN_SOURCE=500
 CFLAGS += $(OFLAGS) $(INCLUDES) $(OPTIONS)
 CFLAGS += -W -Wall -Wextra -g
 #CFLAGS += -std=c99 -D_XOPEN_SOURCE=500
 CFLAGS += $(OFLAGS) $(INCLUDES) $(OPTIONS)
-LDFLAGS += -g $(OPTIONS)
+LDFLAGS += -g $(LDOPTS) $(OPTIONS)
 
 LDOPT = linker
 
 LDOPT = linker
-ifeq ($(OS),Windows_NT)
+MV = mv
+ifneq (, $(findstring linux, $(MAKE_HOST)))
+# Linux
+else ifneq (, $(findstring mingw, $(MAKE_HOST)))
+# Windows MinGw
+CFLAGS += -DWIN32
 #LDLIBS += -lws2_32
 LDOPT = winlnk
 #LDLIBS += -lws2_32
 LDOPT = winlnk
-endif
-ifeq ($(OS),Dos)
+else ifneq (, $(findstring cygwin, $(MAKE_HOST)))
+CFLAGS += -DWIN32
+# Windows CygWin
+LDOPT = winlnk
+else ifneq (, $(findstring msdos, $(MAKE_HOST)))
+# MSDOS
 LDOPT = doslnk
 LDOPT = doslnk
+MV = move
 endif
 
 # Targets
 
 endif
 
 # Targets
 
-ALLEXE  =
-ALLEXE += gameoflife
+ALLEXE  = $(shell for f in *.c; do grep -q '/\*\slinker:' $$f && echo $${f/.c}; done)
 
 SHELL = bash
 
 
 SHELL = bash
 
@@ -56,13 +66,18 @@ GETCOMMENTS = awk '/\/\*\s*$(1):/,/\*\// { sub(/.*\/\*\s*$(1):/, ""); sub (/\s*\
 all: depends
        $(MAKE) $(ALLEXE:%=%.exe)
 
 all: depends
        $(MAKE) $(ALLEXE:%=%.exe)
 
+analyze:
+       make purge
+       scan-build make
+       #scan-build -stats make
+
 count:
        wc $(wildcard *.c *.h) $(MAKEFILE_LIST)
 
 clean:
        $(call TITLE, "Cleaning")
        touch clean
 count:
        wc $(wildcard *.c *.h) $(MAKEFILE_LIST)
 
 clean:
        $(call TITLE, "Cleaning")
        touch clean
-       rm -f clean $(wildcard *.d *.ld *.log *.o *.test *~ .exec_* gmon.out)
+       rm -f clean $(wildcard *.d *.ld *.log *.o *.test *~ .exec_* gmon.out _)
        $(call PASS, SUCCESS)
 
 depends: $(patsubst %.c, %.d, $(wildcard *.c)) $(patsubst %, %.ld, $(ALLEXE))
        $(call PASS, SUCCESS)
 
 depends: $(patsubst %.c, %.d, $(wildcard *.c)) $(patsubst %, %.ld, $(ALLEXE))
@@ -79,7 +94,8 @@ purge: clean
        rm -f purge $(ALLEXE:%=%.exe)
        $(call PASS, SUCCESS)
 
        rm -f purge $(ALLEXE:%=%.exe)
        $(call PASS, SUCCESS)
 
-valgrinds: all
+valgrinds:
+       $(MAKE) all
        $(MAKE) $(addprefix valgrind_,$(ALLEXE))
 
 wipe: purge
        $(MAKE) $(addprefix valgrind_,$(ALLEXE))
 
 wipe: purge
@@ -88,7 +104,9 @@ wipe: purge
        rm -f wipe $(wildcard *.gcda *.gcno *.gcov *.glog)
        $(call PASS, SUCCESS)
 
        rm -f wipe $(wildcard *.gcda *.gcno *.gcov *.glog)
        $(call PASS, SUCCESS)
 
-tests: all
+tests:
+       -rm -f $(ALLEXE)
+       $(MAKE) all
        $(MAKE) $(addprefix test_,$(ALLEXE))
 
 ## Main rules
        $(MAKE) $(addprefix test_,$(ALLEXE))
 
 ## Main rules
@@ -98,13 +116,14 @@ include $(wildcard *.ld)
 
 gcov_%:
        $(MAKE) purge
 
 gcov_%:
        $(MAKE) purge
-       OPTIONS="-coverage -O0" $(MAKE)
+       $(MAKE) depends
+       OPTIONS="-coverage -O0" $(MAKE) ${@:gcov_%=%}.exe
        $(MAKE) test_$(@:gcov_%=%)
        gcov `sed -e 's/\.exe:/.c/;s/\.o/.c/g' $(@:gcov_%=%.ld)`
        touch gcov
        rm -f gcov $(wildcard *.gcda *.gcno)
        $(MAKE) purge
        $(MAKE) test_$(@:gcov_%=%)
        gcov `sed -e 's/\.exe:/.c/;s/\.o/.c/g' $(@:gcov_%=%.ld)`
        touch gcov
        rm -f gcov $(wildcard *.gcda *.gcno)
        $(MAKE) purge
-       grep '#####' *.c.gcov || true
+       grep '^ *#####' *.c.gcov || true
 
 gprof_%:
        $(MAKE) purge
 
 gprof_%:
        $(MAKE) purge
@@ -129,6 +148,7 @@ gprof_%:
        $(call TITLE, "Building $@")
        $(call GETCOMMENTS,test, $<) > $@
        $(call PASS, SUCCESS)
        $(call TITLE, "Building $@")
        $(call GETCOMMENTS,test, $<) > $@
        $(call PASS, SUCCESS)
+       -rm -f _
 
 test_%: %.test %.exe
        IFS=$$'\n'; RC=0; \
 
 test_%: %.test %.exe
        IFS=$$'\n'; RC=0; \
@@ -137,6 +157,7 @@ test_%: %.test %.exe
          eval $$test; \
          [ $$? -eq 0 ] && echo -e "\033[1;32mSUCCESS\033[0;0m" \
                        || { echo -e "\033[1;31mFAILED\033[0;0m"; RC=1; }; \
          eval $$test; \
          [ $$? -eq 0 ] && echo -e "\033[1;32mSUCCESS\033[0;0m" \
                        || { echo -e "\033[1;31mFAILED\033[0;0m"; RC=1; }; \
+         test "$$RC" = 1 -a "$(STOP)" = 1 && break; \
        done; \
        test "$$RC" -ne 1
 
        done; \
        test "$$RC" -ne 1
 
@@ -149,7 +170,7 @@ valgrind_%: %.exe
        $(call TITLE, "Building $@")
        $(CC) $(INCLUDES) -MM $< -o $@~
        echo ${<:.c=.o}: $(shell $(call GETCOMMENTS,depends, $<)) >> $@~
        $(call TITLE, "Building $@")
        $(CC) $(INCLUDES) -MM $< -o $@~
        echo ${<:.c=.o}: $(shell $(call GETCOMMENTS,depends, $<)) >> $@~
-       mv $@~ $@
+       $(MV) $@~ $@
        $(call PASS, SUCCESS)
 
 %.ld: %.c
        $(call PASS, SUCCESS)
 
 %.ld: %.c
@@ -170,7 +191,7 @@ valgrind_%: %.exe
 
 ## Phony
 
 
 ## Phony
 
-.PHONY: all clean count depends gcovs purge tests
+.PHONY: all analyze clean count depends gcovs purge tests
 
 ## Precious
 
 
 ## Precious