From: Laurent Mazet Date: Tue, 15 Apr 2025 08:09:48 +0000 (+0200) Subject: full adaptation to c99 X-Git-Url: https://secure.softndesign.org/git/?a=commitdiff_plain;h=HEAD;p=gameoflife.git full adaptation to c99 --- diff --git a/display.c b/display.c index 266e710..92d188d 100644 --- 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) { - 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); } @@ -82,13 +81,11 @@ void _displaytitle (char *title, 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); } - 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); } @@ -114,8 +111,7 @@ void librarywindow (char *msg, int xoffset, int yoffset) 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, ' '); } @@ -127,14 +123,12 @@ void librarywindow (char *msg, int xoffset, int yoffset) void boardwindow (board_t *board, int xoffset, int yoffset, int bound) { - int i, j; - 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': @@ -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) { - 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, ' '); @@ -186,10 +178,10 @@ char *savewindow (int length, int xoffset, int yoffset) _dobound (length, 1, xoffset, yoffset); set_color (white); - int i = 0, j; + int i = 0; 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); @@ -234,7 +226,7 @@ char *savewindow (int length, int xoffset, int yoffset) } if (name) { - for (j = length - 1; j >= 0; j--) { + for (int j = length - 1; j >= 0; j--) { if (name[j] == ' ') { name[j] = '\0'; } diff --git a/function.c b/function.c index d2daf9b..b0c5292 100644 --- a/function.c +++ b/function.c @@ -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) { - int i, j; - 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)); } @@ -138,10 +136,10 @@ void freeboard (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: \""); - 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"); @@ -190,6 +188,11 @@ char *readdata (char *filename) 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); @@ -264,7 +267,7 @@ board_t *loadboard (char *str, char **pname) memcpy (board->tab, tab, xsize * ysize); } if ((board != NULL) && (pname != NULL)) { - *pname = strdup (name); + *pname = strdup (name ? name : ""); } return board; @@ -296,11 +299,10 @@ int getnbneighbours (board_t *board, int x, int y) board_t *computenextgen (board_t *board) { - int i, j; 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)) { @@ -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); @@ -334,8 +336,6 @@ board_t *computenextgen (board_t *board) 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); @@ -345,22 +345,22 @@ board_t *rotateelement (board_t *element, int rot) 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: - 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: - 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); } } @@ -376,11 +376,9 @@ board_t *rotateelement (board_t *element, int rot) board_t *mirrorelement (board_t *element, int mode) { - int i, j; - 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; @@ -390,8 +388,8 @@ board_t *mirrorelement (board_t *element, int mode) } } 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; @@ -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) { - 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' : ' '; } diff --git a/makefile b/makefile index 763ae76..09ecb8b 100644 --- a/makefile +++ b/makefile @@ -5,6 +5,7 @@ CC = gcc #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 @@ -13,21 +14,30 @@ OFLAGS = -O4 -Os 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 -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 -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 +MV = move endif # Targets -ALLEXE = -ALLEXE += gameoflife +ALLEXE = $(shell for f in *.c; do grep -q '/\*\slinker:' $$f && echo $${f/.c}; done) SHELL = bash @@ -56,13 +66,18 @@ GETCOMMENTS = awk '/\/\*\s*$(1):/,/\*\// { sub(/.*\/\*\s*$(1):/, ""); sub (/\s*\ 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 - 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)) @@ -79,7 +94,8 @@ purge: clean rm -f purge $(ALLEXE:%=%.exe) $(call PASS, SUCCESS) -valgrinds: all +valgrinds: + $(MAKE) all $(MAKE) $(addprefix valgrind_,$(ALLEXE)) wipe: purge @@ -88,7 +104,9 @@ wipe: purge 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 @@ -98,13 +116,14 @@ include $(wildcard *.ld) 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 - grep '#####' *.c.gcov || true + grep '^ *#####' *.c.gcov || true gprof_%: $(MAKE) purge @@ -129,6 +148,7 @@ gprof_%: $(call TITLE, "Building $@") $(call GETCOMMENTS,test, $<) > $@ $(call PASS, SUCCESS) + -rm -f _ 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; }; \ + test "$$RC" = 1 -a "$(STOP)" = 1 && break; \ 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, $<)) >> $@~ - mv $@~ $@ + $(MV) $@~ $@ $(call PASS, SUCCESS) %.ld: %.c @@ -170,7 +191,7 @@ valgrind_%: %.exe ## Phony -.PHONY: all clean count depends gcovs purge tests +.PHONY: all analyze clean count depends gcovs purge tests ## Precious