From 04c960d96239f7f133bb3cb44af6bf3f1b92b6e1 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sun, 13 Apr 2025 15:36:55 +0200 Subject: [PATCH] full adaptation to c99 --- bf.c | 32 +++++++++++++++++--------------- makefile | 18 ++++++++++++++---- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/bf.c b/bf.c index aa1ad67..8400309 100644 --- a/bf.c +++ b/bf.c @@ -55,14 +55,13 @@ int usage (int ret) /* main process */ int process (char *buffer, int nb, FILE *out) { - int i; - for (i = 0; i < nb; i++) { + for (int i = 0; i < nb; i++) { if (buffer[i] == 0) { break; } - VERBOSE (DEBUG, fprintf (stderr, "%s: p=%d, buffer='%s', memory=[ ", progname, p, buffer + i); int _i; for (_i = 0; _i < MEMSIZE; _i++) fprintf (stderr," %d", mem[_i]); fprintf (stderr," ]\n")); + VERBOSE (DEBUG, fprintf (stderr, "%s: p=%d, buffer='%s', memory=[ ", progname, p, buffer + i); for (int _i = 0; _i < MEMSIZE; _i++) fprintf (stderr," %d", mem[_i]); fprintf (stderr," ]\n")); switch (buffer[i]) { case '>': /* increase pointer */ @@ -143,7 +142,7 @@ int process (char *buffer, int nb, FILE *out) { VERBOSE (WARNING, fprintf (stderr, "%s: can't understand '%c'\n", progname, buffer[i])); } - //VERBOSE (DEBUG, int _i; fprintf (stderr, "%s: p: %d mem:", progname, p); for (_i = 0; _i < MEMSIZE; _i++) fprintf (stderr, " %d", mem[_i]); fprintf (stderr, "\n")); + //VERBOSE (DEBUG, fprintf (stderr, "%s: p: %d mem:", progname, p); for (int _i = 0; _i < MEMSIZE; _i++) fprintf (stderr, " %d", mem[_i]); fprintf (stderr, "\n")); } @@ -157,7 +156,6 @@ int main (int argc, char *argv[]) char *input = NULL; char *output = NULL; char *buffer = NULL; - int i; int n = 0; int size = 0; FILE *fid = NULL; @@ -175,9 +173,7 @@ int main (int argc, char *argv[]) while ((c = getopt(argc, argv, "e:i:m:o:hv:")) != EOF) { switch (c) { case 'e': - if (buffer) { - free (buffer); - } + free (buffer); buffer = strdup (optarg); CHECKALLOC (buffer); size = strlen (buffer) + 1; @@ -186,7 +182,7 @@ int main (int argc, char *argv[]) input = optarg; break; case 'm': - for (i = 0; i < MEMSIZE; i++) { + for (int i = 0; i < MEMSIZE; i++) { if (optarg) { mem[i] = strtol (optarg, &optarg, 10); VERBOSE (DEBUG, fprintf (stderr, "%s: mem[%d] = %d\n", progname, i, mem[i])); @@ -194,6 +190,7 @@ int main (int argc, char *argv[]) } if (*optarg != 0) { VERBOSE (WARNING, fprintf (stderr, "%s: too many memory values or incorrect value\n", progname)); + free (buffer); return 1; } break; @@ -205,11 +202,13 @@ int main (int argc, char *argv[]) break; case 'h': default: + free (buffer); return usage (c != 'h'); } } if (argc - optind != 0) { VERBOSE (ERROR, fprintf (stderr, "%s: invalid option -- %s\n", progname, argv[optind])); + free (buffer); return usage (1); } @@ -218,6 +217,7 @@ int main (int argc, char *argv[]) fid = fopen (input, "r"); if (fid == NULL) { VERBOSE (ERROR, fprintf (stderr, "%s: can't open file '%s' for reading\n", progname, input)); + free (buffer); return 1; } } else if (buffer == NULL) { @@ -231,14 +231,17 @@ int main (int argc, char *argv[]) CHECKALLOC (buffer); memset (buffer + size, 0, BUFSIZE); n = fread (buffer + size, 1, BUFSIZE, fid); - if ((n == 0) && (errno != 0)) { + if (ferror (fid)) { VERBOSE (ERROR, fprintf (stderr, "%s: can't read data from file '%s'\n", progname, input)); + if (fid != stdin) { + fclose (fid); + } + free (buffer); return 1; } size += BUFSIZE; } - /* close input file */ if (fid != stdin) { fclose (fid); } @@ -252,7 +255,7 @@ int main (int argc, char *argv[]) fid = fopen (output, "w"); if (fid == NULL) { VERBOSE (ERROR, fprintf (stderr, "%s: can't open file '%s' for writing\n", progname, output)); - if (buffer) free (buffer); + free (buffer); return 1; } } else { @@ -267,11 +270,10 @@ int main (int argc, char *argv[]) fclose (fid); } - /* free buffer */ - free (buffer); - VERBOSE (INFO, fprintf (stdout, "\nmemory:"); int _i; for (_i = 0; _i < MEMSIZE; _i++) fprintf (stdout," %d", (int)mem[_i]); fprintf (stdout,"\n")); + VERBOSE (INFO, fprintf (stdout, "\nmemory:"); for (int _i = 0; _i < MEMSIZE; _i++) fprintf (stdout," %d", (int)mem[_i]); fprintf (stdout,"\n")); + free (buffer); return rc; } diff --git a/makefile b/makefile index dfe04ea..09ecb8b 100644 --- a/makefile +++ b/makefile @@ -5,12 +5,14 @@ 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 #OFLAGS += -minline-all-stringops -fsingle-precision-constant #OFLAGS += -malign-double CFLAGS += -W -Wall -Wextra -g +#CFLAGS += -std=c99 -D_XOPEN_SOURCE=500 CFLAGS += $(OFLAGS) $(INCLUDES) $(OPTIONS) LDFLAGS += -g $(LDOPTS) $(OPTIONS) @@ -20,8 +22,11 @@ ifneq (, $(findstring linux, $(MAKE_HOST))) # Linux else ifneq (, $(findstring mingw, $(MAKE_HOST))) # Windows MinGw +CFLAGS += -DWIN32 +#LDLIBS += -lws2_32 LDOPT = winlnk else ifneq (, $(findstring cygwin, $(MAKE_HOST))) +CFLAGS += -DWIN32 # Windows CygWin LDOPT = winlnk else ifneq (, $(findstring msdos, $(MAKE_HOST))) @@ -32,8 +37,7 @@ endif # Targets -ALLEXE = -ALLEXE += bf +ALLEXE = $(shell for f in *.c; do grep -q '/\*\slinker:' $$f && echo $${f/.c}; done) SHELL = bash @@ -62,6 +66,11 @@ 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) @@ -114,7 +123,7 @@ gcov_%: touch gcov rm -f gcov $(wildcard *.gcda *.gcno) $(MAKE) purge - grep '#####' *.c.gcov || true + grep '^ *#####' *.c.gcov || true gprof_%: $(MAKE) purge @@ -148,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 @@ -181,7 +191,7 @@ valgrind_%: %.exe ## Phony -.PHONY: all clean count depends gcovs purge tests +.PHONY: all analyze clean count depends gcovs purge tests ## Precious -- 2.30.2