From 07cc2c73136a32ed16083282d109ee53c669141c Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Tue, 19 Dec 2023 16:56:18 +0100 Subject: [PATCH] reorder functions --- bf.c | 159 ++++++++++++++++++++++++++++++----------------------------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/bf.c b/bf.c index a3f78b5..0e331d9 100644 --- a/bf.c +++ b/bf.c @@ -39,6 +39,86 @@ int usage (int ret) return ret; } +/* main process */ + +int process (char *buffer, int nb, FILE *out) { + int i; + + for (i = 0; (i < nb) && (buffer[i] != 0); i++) { + + VERBOSE (DEBUG, fprintf (stderr, "%s: read '%c' (%u)\n", progname, buffer[i], buffer[i])); + switch (buffer[i]) { + case '>': /* increase pointer */ + p++; + break; + case '<': /* decrease pointer */ + p--; + break; + case '+': /* increase pointer value */ + if ((p >= 0) && (p < MEMSIZE)) { + mem[p]++; + } else { + VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); + return 1; + } + break; + case '-': /* decrease pointer value */ + if ((p >= 0) && (p < MEMSIZE)) { + mem[p]--; + } else { + VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); + return 1; + } + break; + case '.': /* output pointer value */ + if ((p >= 0) && (p < MEMSIZE)) { + fprintf (out, "%c", mem[p]); + } else { + VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); + return 1; + } + break; + case ',': /* read a byte and store it in memory */ + if ((p >= 0) && (p < MEMSIZE)) { + mem[p] = buffer[++i]; + } else { + VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); + return 1; + } + break; + case '[': /* jump to right bracket if pointer is set to 0 */ + if (mem[p] == 0) { + int bracket = 1; + while ((++i < nb) && (bracket > 0)) { + bracket += (buffer[i] == '[') ? +1 : (buffer[i] == ']') ? -1 :0; + } + if (bracket) { + VERBOSE (ERROR, fprintf (stderr, "%s: brace not closed\n", progname)); + return 1; + } + } else { + return process (buffer + i + 1, nb - i - 1, out); + } + break; + case ']': /* jump to left bracket if pointer is different to 0 */ + if (mem[p] != 0) { + i = -1; + } + break; + case '\n': + case '\r': + break; + default: + 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")); + + } + + return 0; +} + /* main function */ int main (int argc, char *argv[]) @@ -146,85 +226,6 @@ int main (int argc, char *argv[]) return rc; } -/* main process */ -int process (char *buffer, int nb, FILE *out) { - int i; - - for (i = 0; (i < nb) && (buffer[i] != 0); i++) { - - VERBOSE (DEBUG, fprintf (stderr, "%s: read '%c' (%u)\n", progname, buffer[i], buffer[i])); - switch (buffer[i]) { - case '>': /* increase pointer */ - p++; - break; - case '<': /* decrease pointer */ - p--; - break; - case '+': /* increase pointer value */ - if ((p >= 0) && (p < MEMSIZE)) { - mem[p]++; - } else { - VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); - return 1; - } - break; - case '-': /* decrease pointer value */ - if ((p >= 0) && (p < MEMSIZE)) { - mem[p]--; - } else { - VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); - return 1; - } - break; - case '.': /* output pointer value */ - if ((p >= 0) && (p < MEMSIZE)) { - fprintf (out, "%c", mem[p]); - } else { - VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); - return 1; - } - break; - case ',': /* read a byte and store it in memory */ - if ((p >= 0) && (p < MEMSIZE)) { - mem[p] = buffer[++i]; - } else { - VERBOSE (ERROR, fprintf (stderr, "%s: invalid address (%d)\n", progname, p)); - return 1; - } - break; - case '[': /* jump to right bracket if pointer is set to 0 */ - if (mem[p] == 0) { - int bracket = 1; - while ((++i < nb) && (bracket > 0)) { - bracket += (buffer[i] == '[') ? +1 : (buffer[i] == ']') ? -1 :0; - } - if (bracket) { - VERBOSE (ERROR, fprintf (stderr, "%s: brace not closed\n", progname)); - return 1; - } - } else { - return process (buffer + i + 1, nb - i - 1, out); - } - break; - case ']': /* jump to left bracket if pointer is different to 0 */ - if (mem[p] != 0) { - i = -1; - } - break; - case '\n': - case '\r': - break; - default: - 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")); - - } - - return 0; -} - // test: bf.exe -h // test: bf.exe -h | awk '/usage:/ { rc=1 } END { exit (1-rc) }' // test: bf.exe -_ 2> /dev/null | awk 'END { if (NR == 0) { exit(0) } else exit (1) }' -- 2.30.2