aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--brainfuck.c1084
1 files changed, 542 insertions, 542 deletions
diff --git a/brainfuck.c b/brainfuck.c
index d62c2a9..69dae83 100644
--- a/brainfuck.c
+++ b/brainfuck.c
@@ -47,717 +47,717 @@ unsigned int sp = 0;
char commands[] = "+-<>,.[]cioux";
void
-read_code()
+read_code ()
{
- int allocated, n, c, comment;
+ int allocated, n, c, comment;
- allocated = 1000;
- n = 0;
+ allocated = 1000;
+ n = 0;
- code = (char *)malloc(allocated * sizeof(char));
- comment = 0;
- while (EOF != (c = getc(prog)))
+ code = (char *) malloc (allocated * sizeof (char));
+ comment = 0;
+ while (EOF != (c = getc (prog)))
{
- if (c == ';') /* end of code */
- break;
- else if (c == '#')
- comment = 1;
- else if (c == '\n' || c == '\r')
- comment = 0;
+ if (c == ';') /* end of code */
+ break;
+ else if (c == '#')
+ comment = 1;
+ else if (c == '\n' || c == '\r')
+ comment = 0;
- if (comment || (NULL == strchr(commands, c)))
- continue;
+ if (comment || (NULL == strchr (commands, c)))
+ continue;
- if (n >= allocated)
+ if (n >= allocated)
{
- allocated <<= 1;
- code = (char *)realloc(code, allocated * sizeof(char));
+ allocated <<= 1;
+ code = (char *) realloc (code, allocated * sizeof (char));
}
- code[n++] = (char)c;
+ code[n++] = (char) c;
}
- if (n >= allocated)
+ if (n >= allocated)
{
- allocated *= 2;
- code = (char *)realloc(code, allocated * sizeof(char));
+ allocated *= 2;
+ code = (char *) realloc (code, allocated * sizeof (char));
}
- code[n++] = '\0';
+ code[n++] = '\0';
}
void
-init_data()
+init_data ()
{
- data = (DATATYPE *) calloc(data_size, sizeof(DATATYPE));
+ data = (DATATYPE *) calloc (data_size, sizeof (DATATYPE));
}
void
-init_stack()
+init_stack ()
{
- stack = (unsigned int *)malloc(stack_size);
+ stack = (unsigned int *) malloc (stack_size);
}
int
-inc_dp()
+inc_dp ()
{
- if (dp < data_size)
+ if (dp < data_size)
{
- ++dp;
- if (dp > max_dp)
- max_dp = dp;
- return 1;
+ ++dp;
+ if (dp > max_dp)
+ max_dp = dp;
+ return 1;
}
- else
+ else
{
- fprintf(stderr, "Data overflow\n");
- return 0;
+ fprintf (stderr, "Data overflow\n");
+ return 0;
}
}
void
-dec_dp()
+dec_dp ()
{
- if (dp > 0)
- --dp;
- else
- fprintf(stderr, "Data underflow\n");
+ if (dp > 0)
+ --dp;
+ else
+ fprintf (stderr, "Data underflow\n");
}
void
-push_cp()
+push_cp ()
{
- if (sp < stack_size)
- stack[sp++] = cp;
- else
- fprintf(stderr, "Stack overflow\n");
+ if (sp < stack_size)
+ stack[sp++] = cp;
+ else
+ fprintf (stderr, "Stack overflow\n");
}
void
-pop_cp()
+pop_cp ()
{
- if (sp > 0)
- cp = stack[--sp];
- else
- fprintf(stderr, "Stack underflow\n");
+ if (sp > 0)
+ cp = stack[--sp];
+ else
+ fprintf (stderr, "Stack underflow\n");
}
int
-skip()
+skip ()
{
- int ob = 0;
+ int ob = 0;
- while (code[cp] != '\0')
+ while (code[cp] != '\0')
{
- switch (code[cp])
+ switch (code[cp])
{
- case '[':
- ++ob;
- break;
- case ']':
- --ob;
- if (0 == ob)
- return 1;
+ case '[':
+ ++ob;
+ break;
+ case ']':
+ --ob;
+ if (0 == ob)
+ return 1;
}
- ++cp;
+ ++cp;
}
- return 0;
+ return 0;
}
void
-input()
+input ()
{
- switch (fmt)
+ switch (fmt)
{
- case 'i':
- scanf(format, (signed int *)&(data[dp]));
- break;
- case 'u':
- scanf(format, (unsigned int *)&(data[dp]));
- break;
- case 'c':
- scanf(format, (char *)&(data[dp]));
- break;
- case 'o':
- scanf(format, (unsigned int *)&(data[dp]));
- break;
- case 'x':
- scanf(format, (unsigned int *)&(data[dp]));
- break;
+ case 'i':
+ scanf (format, (signed int *) &(data[dp]));
+ break;
+ case 'u':
+ scanf (format, (unsigned int *) &(data[dp]));
+ break;
+ case 'c':
+ scanf (format, (char *) &(data[dp]));
+ break;
+ case 'o':
+ scanf (format, (unsigned int *) &(data[dp]));
+ break;
+ case 'x':
+ scanf (format, (unsigned int *) &(data[dp]));
+ break;
}
}
void
-print_data()
+print_data ()
{
- unsigned int i;
+ unsigned int i;
- for (i = 0; i < dp; i++)
+ for (i = 0; i < dp; i++)
{
- printf(" ");
- printf(format, data[i]);
+ printf (" ");
+ printf (format, data[i]);
}
- printf(" [");
- printf(format, data[dp]);
- printf("]");
+ printf (" [");
+ printf (format, data[dp]);
+ printf ("]");
- for (i = dp + 1; i <= max_dp; i++)
+ for (i = dp + 1; i <= max_dp; i++)
{
- printf(" ");
- printf(format, data[i]);
+ printf (" ");
+ printf (format, data[i]);
}
- printf("\n");
+ printf ("\n");
}
void
-switch_format()
+switch_format ()
{
- switch (fmt)
+ switch (fmt)
{
- case 'i':
- sprintf(format, "%%%c", fmt);
- break;
- case 'u':
- sprintf(format, "%%%c", fmt);
- break;
- case 'c':
- sprintf(format, "%%%c", fmt);
- break;
- case 'o':
- sprintf(format, "0%%%c", fmt);
- break;
- case 'x':
- sprintf(format, "0x%%%c", fmt);
- break;
+ case 'i':
+ sprintf (format, "%%%c", fmt);
+ break;
+ case 'u':
+ sprintf (format, "%%%c", fmt);
+ break;
+ case 'c':
+ sprintf (format, "%%%c", fmt);
+ break;
+ case 'o':
+ sprintf (format, "0%%%c", fmt);
+ break;
+ case 'x':
+ sprintf (format, "0x%%%c", fmt);
+ break;
}
}
void
-run_code()
+run_code ()
{
- char cmd;
+ char cmd;
- unsigned int d;
+ unsigned int d;
- while (0 != (cmd = code[cp]))
+ while (0 != (cmd = code[cp]))
{
- switch (cmd)
+ switch (cmd)
{
- case '[':
- if (data[dp])
- {
- push_cp();
- ++cp;
- }
- else
- {
- skip();
- ++cp;
- }
- break;
- case ']':
- pop_cp();
- break;
- case 'Z':
- data[dp] = 0;
- ++cp;
- break;
- case 'I': /* I23 -> add 22 to the current cell */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- (data[dp]) += (DATATYPE) d;
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case 'D': /* D23 -> subtract 22 from the current cell */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- (data[dp]) -= (DATATYPE) d;
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case '+':
- ++(data[dp]);
- ++cp;
- break;
- case '-':
- --(data[dp]);
- ++cp;
- break;
- case 'R': /* R3 -> move right by 3 cells */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- dp += d;
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case 'L': /* L2 -> move left by 2 cells */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- dp -= d;
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case '>':
- inc_dp();
- ++cp;
- break;
- case '<':
- dec_dp();
- ++cp;
- break;
- case ',':
- input();
+ case '[':
+ if (data[dp])
+ {
+ push_cp ();
++cp;
- break;
- case '.':
- if (!trace)
- {
- printf(format, data[dp]);
- if (fmt != 'c')
- printf(" ");
- }
- ++cp;
- break;
- case 'i':
- case 'u':
- case 'c':
- case 'o':
- case 'x':
- fmt = cmd;
- switch_format();
- ++cp;
- break;
- default:
+ }
+ else
+ {
+ skip ();
++cp;
+ }
+ break;
+ case ']':
+ pop_cp ();
+ break;
+ case 'Z':
+ data[dp] = 0;
+ ++cp;
+ break;
+ case 'I': /* I23 -> add 22 to the current cell */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ (data[dp]) += (DATATYPE) d;
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case 'D': /* D23 -> subtract 22 from the current cell */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ (data[dp]) -= (DATATYPE) d;
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case '+':
+ ++(data[dp]);
+ ++cp;
+ break;
+ case '-':
+ --(data[dp]);
+ ++cp;
+ break;
+ case 'R': /* R3 -> move right by 3 cells */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ dp += d;
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case 'L': /* L2 -> move left by 2 cells */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ dp -= d;
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case '>':
+ inc_dp ();
+ ++cp;
+ break;
+ case '<':
+ dec_dp ();
+ ++cp;
+ break;
+ case ',':
+ input ();
+ ++cp;
+ break;
+ case '.':
+ if (!trace)
+ {
+ printf (format, data[dp]);
+ if (fmt != 'c')
+ printf (" ");
+ }
+ ++cp;
+ break;
+ case 'i':
+ case 'u':
+ case 'c':
+ case 'o':
+ case 'x':
+ fmt = cmd;
+ switch_format ();
+ ++cp;
+ break;
+ default:
+ ++cp;
}
- if (trace && cmd != ' ')
+ if (trace && cmd != ' ')
{
- fprintf(stderr, "%c:", cmd);
- print_data();
+ fprintf (stderr, "%c:", cmd);
+ print_data ();
}
}
}
void
-optimize_code()
+optimize_code ()
{
- char *new_code, *substr;
+ char *new_code, *substr;
- unsigned int i, j, k;
+ unsigned int i, j, k;
- DATATYPE d;
+ DATATYPE d;
- char tmp[64], cmd;
+ char tmp[64], cmd;
- new_code = calloc(strlen(code) + 1, sizeof(char));
+ new_code = calloc (strlen (code) + 1, sizeof (char));
- i = j = 0;
- while (0 != (cmd = code[i]))
+ i = j = 0;
+ while (0 != (cmd = code[i]))
{
- switch (cmd)
+ switch (cmd)
{
- case '+':
- case '-': /* compress ++--+---+... */
- d = 0;
- while (0 != (cmd = code[i]))
- {
- if (cmd == '+')
- ++d;
- else if (cmd == '-')
- --d;
- else
- break;
- ++i;
- }
- if (d == 1)
- new_code[j++] = '+';
- else if (d == -1)
- new_code[j++] = '-';
- else if (d != 0)
- {
- if (d < 0)
- sprintf(tmp, "D%u", -d);
- else
- sprintf(tmp, "I%u", d);
- k = 0;
- while (tmp[k])
- new_code[j++] = tmp[k++];
- }
- break;
- case '>':
- case '<': /* compress >><<>>>>> */
- d = 0;
- while (0 != (cmd = code[i]))
- {
- if (cmd == '>')
- ++d;
- else if (cmd == '<')
- --d;
- else
- break;
- ++i;
- }
- if (d == 1)
- new_code[j++] = '>';
- else if (d == -1)
- new_code[j++] = '<';
- else if (d != 0)
- {
- if (d < 0)
- sprintf(tmp, "L%u", -d); /* move left by d */
- else
- sprintf(tmp, "R%u", d); /* move right by d */
- k = 0;
- while (tmp[k])
- new_code[j++] = tmp[k++];
- }
- break;
- default:
- new_code[j++] = code[i++];
+ case '+':
+ case '-': /* compress ++--+---+... */
+ d = 0;
+ while (0 != (cmd = code[i]))
+ {
+ if (cmd == '+')
+ ++d;
+ else if (cmd == '-')
+ --d;
+ else
+ break;
+ ++i;
+ }
+ if (d == 1)
+ new_code[j++] = '+';
+ else if (d == -1)
+ new_code[j++] = '-';
+ else if (d != 0)
+ {
+ if (d < 0)
+ sprintf (tmp, "D%u", -d);
+ else
+ sprintf (tmp, "I%u", d);
+ k = 0;
+ while (tmp[k])
+ new_code[j++] = tmp[k++];
+ }
+ break;
+ case '>':
+ case '<': /* compress >><<>>>>> */
+ d = 0;
+ while (0 != (cmd = code[i]))
+ {
+ if (cmd == '>')
+ ++d;
+ else if (cmd == '<')
+ --d;
+ else
+ break;
+ ++i;
+ }
+ if (d == 1)
+ new_code[j++] = '>';
+ else if (d == -1)
+ new_code[j++] = '<';
+ else if (d != 0)
+ {
+ if (d < 0)
+ sprintf (tmp, "L%u", -d); /* move left by d */
+ else
+ sprintf (tmp, "R%u", d); /* move right by d */
+ k = 0;
+ while (tmp[k])
+ new_code[j++] = tmp[k++];
+ }
+ break;
+ default:
+ new_code[j++] = code[i++];
}
}
- /*
- * FIXME valid while we use finite integers
- */
- substr = new_code;
- while (NULL != (substr = strstr(substr, "[-]")))
+ /*
+ * FIXME valid while we use finite integers
+ */
+ substr = new_code;
+ while (NULL != (substr = strstr (substr, "[-]")))
{
- strncpy(substr, "Z ", 3); /* [-] set current cell to 0 */
+ strncpy (substr, "Z ", 3); /* [-] set current cell to 0 */
}
- substr = new_code;
- while (NULL != (substr = strstr(substr, "[+]")))
+ substr = new_code;
+ while (NULL != (substr = strstr (substr, "[+]")))
{
- strncpy(substr, "Z ", 3); /* [-] set current cell to 0 */
+ strncpy (substr, "Z ", 3); /* [-] set current cell to 0 */
}
- free(code);
- code = new_code;
+ free (code);
+ code = new_code;
}
void
-bf2c()
+bf2c ()
{
- char cmd;
+ char cmd;
- unsigned int d;
+ unsigned int d;
- printf("#include <stdlib.h>\n#include <stdio.h>\n\n");
- printf("%s data[%u];\n", DATATYPE_STR, data_size);
- printf("unsigned int dp = 0;\n\n");
- printf("int main()\n{\n");
+ printf ("#include <stdlib.h>\n#include <stdio.h>\n\n");
+ printf ("%s data[%u];\n", DATATYPE_STR, data_size);
+ printf ("unsigned int dp = 0;\n\n");
+ printf ("int main()\n{\n");
- while ('\0' != (cmd = code[cp]))
+ while ('\0' != (cmd = code[cp]))
{
- switch (cmd)
+ switch (cmd)
{
- case 'Z':
- printf("data[dp] = 0;\n");
- ++cp;
- break;
- case '[':
- printf("while (data[dp])\n{\n");
- ++cp;
- break;
- case ']':
- printf("}\n");
- ++cp;
- break;
- case 'I': /* I23 -> add 22 to the current cell */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- printf("data[dp] += %u;\n", d);
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case 'D': /* D23 -> subtract 22 from the current cell */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- printf("data[dp] -= %u;\n", d);
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case '+':
- printf("++(data[dp]);\n");
- ++cp;
- break;
- case '-':
- printf("--(data[dp]);\n");
- ++cp;
- break;
- case 'R': /* R3 -> move right by 3 cells */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- printf("dp += %u;\n", d);
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case 'L': /* L2 -> move left by 2 cells */
- ++cp;
- sscanf(&(code[cp]), "%u", &d);
- printf("dp -= %u;\n", d);
- while (code[cp] >= '0' && code[cp] <= '9')
- ++cp; /* skip digits */
- break;
- case '>':
- printf("++dp;\n");
- ++cp;
+ case 'Z':
+ printf ("data[dp] = 0;\n");
+ ++cp;
+ break;
+ case '[':
+ printf ("while (data[dp])\n{\n");
+ ++cp;
+ break;
+ case ']':
+ printf ("}\n");
+ ++cp;
+ break;
+ case 'I': /* I23 -> add 22 to the current cell */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ printf ("data[dp] += %u;\n", d);
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case 'D': /* D23 -> subtract 22 from the current cell */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ printf ("data[dp] -= %u;\n", d);
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case '+':
+ printf ("++(data[dp]);\n");
+ ++cp;
+ break;
+ case '-':
+ printf ("--(data[dp]);\n");
+ ++cp;
+ break;
+ case 'R': /* R3 -> move right by 3 cells */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ printf ("dp += %u;\n", d);
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case 'L': /* L2 -> move left by 2 cells */
+ ++cp;
+ sscanf (&(code[cp]), "%u", &d);
+ printf ("dp -= %u;\n", d);
+ while (code[cp] >= '0' && code[cp] <= '9')
+ ++cp; /* skip digits */
+ break;
+ case '>':
+ printf ("++dp;\n");
+ ++cp;
+ break;
+ case '<':
+ printf ("--dp;\n");
+ ++cp;
+ break;
+ case ',':
+ switch (fmt)
+ {
+ case 'i':
+ printf ("scanf(\"%s\", (signed int *)&(data[dp]));\n", format);
break;
- case '<':
- printf("--dp;\n");
- ++cp;
+ case 'u':
+ printf ("scanf(\"%s\", (unsigned int *)&(data[dp]));\n",
+ format);
break;
- case ',':
- switch (fmt)
- {
- case 'i':
- printf("scanf(\"%s\", (signed int *)&(data[dp]));\n",
- format);
- break;
- case 'u':
- printf("scanf(\"%s\", (unsigned int *)&(data[dp]));\n",
- format);
- break;
- case 'c':
- printf("scanf(\"%s\", (char *)&(data[dp]));\n", format);
- break;
- case 'o':
- printf("scanf(\"%s\", (unsigned int *)&(data[dp]));\n",
- format);
- break;
- case 'x':
- printf("scanf(\"%s\", (unsigned int *)&(data[dp]));\n",
- format);
- break;
- }
- ++cp;
+ case 'c':
+ printf ("scanf(\"%s\", (char *)&(data[dp]));\n", format);
break;
- case '.':
- if (fmt == 'c')
- printf("printf(\"%s\", data[dp]);\n", format);
- else
- printf("printf(\"%s \", data[dp]);\n", format);
- ++cp;
+ case 'o':
+ printf ("scanf(\"%s\", (unsigned int *)&(data[dp]));\n",
+ format);
break;
- case 'i':
- case 'u':
- case 'c':
- case 'o':
- case 'x':
- fmt = cmd;
- switch_format();
- ++cp;
+ case 'x':
+ printf ("scanf(\"%s\", (unsigned int *)&(data[dp]));\n",
+ format);
break;
- default:
- ++cp;
+ }
+ ++cp;
+ break;
+ case '.':
+ if (fmt == 'c')
+ printf ("printf(\"%s\", data[dp]);\n", format);
+ else
+ printf ("printf(\"%s \", data[dp]);\n", format);
+ ++cp;
+ break;
+ case 'i':
+ case 'u':
+ case 'c':
+ case 'o':
+ case 'x':
+ fmt = cmd;
+ switch_format ();
+ ++cp;
+ break;
+ default:
+ ++cp;
}
}
- printf("exit(EXIT_SUCCESS);\n}\n");
+ printf ("exit(EXIT_SUCCESS);\n}\n");
}
void
-bf2moo()
+bf2moo ()
{
- char cmd;
+ char cmd;
- while ('\0' != (cmd = code[cp]))
+ while ('\0' != (cmd = code[cp]))
{
- switch (cmd)
+ switch (cmd)
{
- case '+':
- printf("MoO");
- break;
- case '-':
- printf("MOo");
- break;
- case '>':
- printf("moO");
- break;
- case '<':
- printf("mOo");
- break;
- case '[':
- if (strncmp(code + cp, "[-]", 3) == 0)
- {
- printf("OOO");
- cp += 2;
- }
- else
- {
- printf("moo");
- }
- break;
- case ']':
- printf("MOO");
- break;
- case '.':
- printf("OOM");
- break;
- case ',':
- printf("oom");
- break;
- default:
- fprintf(stderr, "unknown character %c at %u\n", cmd, cp);
- break;
+ case '+':
+ printf ("MoO");
+ break;
+ case '-':
+ printf ("MOo");
+ break;
+ case '>':
+ printf ("moO");
+ break;
+ case '<':
+ printf ("mOo");
+ break;
+ case '[':
+ if (strncmp (code + cp, "[-]", 3) == 0)
+ {
+ printf ("OOO");
+ cp += 2;
+ }
+ else
+ {
+ printf ("moo");
+ }
+ break;
+ case ']':
+ printf ("MOO");
+ break;
+ case '.':
+ printf ("OOM");
+ break;
+ case ',':
+ printf ("oom");
+ break;
+ default:
+ fprintf (stderr, "unknown character %c at %u\n", cmd, cp);
+ break;
}
- ++cp;
+ ++cp;
}
- printf("\n");
+ printf ("\n");
}
void
-free_all()
+free_all ()
{
- if (code != NULL)
- free(code);
- if (data != NULL)
- free(data);
- if (stack != NULL)
- free(stack);
+ if (code != NULL)
+ free (code);
+ if (data != NULL)
+ free (data);
+ if (stack != NULL)
+ free (stack);
}
void
-usage(char *self)
+usage (char *self)
{
- printf("%s: Brainfuck programming language interpreter\n", self);
- printf("See <http://en.wikipedia.org/wiki/Brainfuck> for more details\n\n");
-
- printf("Usage: %s [options] [file]\n\n", self);
-
- printf("Size of each data cell is %lu byte(s)\n",
- (long unsigned int)sizeof(DATATYPE));
- printf("All data cells are zeros initially\n\n");
- printf("Options (defaults are in brackets):\n");
- printf(" -s num stack size (%u)\n", stack_size);
- printf(" -d num data size (%u)\n", data_size);
- printf(" -t trace execution for debugging\n");
- printf(" -O optimize code\n");
- printf(" -C translate into C (to stdout)\n");
- printf(" -p cow translate into Cow (to stdout)\n");
- printf("\n");
- printf("Formats for operators '.' and ',' (output and input):\n");
- printf
- (" -c, -i, -u, -o, -x char, signed int, unsigned int, octal, hexadecimal\n");
- printf
- (" octal number must be prepended by '0' (zero),\n");
- printf(" and hexadecimal - by '0x'\n");
- printf("Default i/o format -%c\n", fmt);
- printf("\n");
- printf(" -h this help message\n");
- printf("\n");
- printf(" file file to execute,\n");
- printf(" if omitted read stdin\n");
- printf("\n");
- printf("Standard operators: <>+-[].,\n");
- printf("Extensions:\n");
- printf
- (" ciuox - change i/o format (same as -c & others above)\n");
- printf(" ; - end of code (useful when reading stdin)\n");
- printf
- (" # - comment to the end of line (useful when reading files)\n");
- printf("\n");
- printf("Examples:\n");
- printf(" echo '+++[.-]' | %s # count down from 3 to 1\n", self);
- printf(" echo ',+++.;5' | %s # shows 8\n", self);
- printf(" echo ',>,<[->+<]>.;4 5' | %s # shows 4+5=9\n", self);
- printf(" echo 'c,u.;h' | %s # shows 104 (ASCII code for 'h')\n", self);
- printf(" echo ', [-[->+<]>];4' | %s -t # move data pointer by 4 \n", self);
- printf
- (" echo ',>,< [> [->+<] < -[->+<]> ]; 3 7' | %s -t # move '7' by 3 \n\n",
- self);
-
- exit(EXIT_SUCCESS);
+ printf ("%s: Brainfuck programming language interpreter\n", self);
+ printf
+ ("See <http://en.wikipedia.org/wiki/Brainfuck> for more details\n\n");
+
+ printf ("Usage: %s [options] [file]\n\n", self);
+
+ printf ("Size of each data cell is %lu byte(s)\n",
+ (long unsigned int) sizeof (DATATYPE));
+ printf ("All data cells are zeros initially\n\n");
+ printf ("Options (defaults are in brackets):\n");
+ printf (" -s num stack size (%u)\n", stack_size);
+ printf (" -d num data size (%u)\n", data_size);
+ printf (" -t trace execution for debugging\n");
+ printf (" -O optimize code\n");
+ printf (" -C translate into C (to stdout)\n");
+ printf (" -p cow translate into Cow (to stdout)\n");
+ printf ("\n");
+ printf ("Formats for operators '.' and ',' (output and input):\n");
+ printf
+ (" -c, -i, -u, -o, -x char, signed int, unsigned int, octal, hexadecimal\n");
+ printf
+ (" octal number must be prepended by '0' (zero),\n");
+ printf (" and hexadecimal - by '0x'\n");
+ printf ("Default i/o format -%c\n", fmt);
+ printf ("\n");
+ printf (" -h this help message\n");
+ printf ("\n");
+ printf (" file file to execute,\n");
+ printf (" if omitted read stdin\n");
+ printf ("\n");
+ printf ("Standard operators: <>+-[].,\n");
+ printf ("Extensions:\n");
+ printf
+ (" ciuox - change i/o format (same as -c & others above)\n");
+ printf (" ; - end of code (useful when reading stdin)\n");
+ printf
+ (" # - comment to the end of line (useful when reading files)\n");
+ printf ("\n");
+ printf ("Examples:\n");
+ printf (" echo '+++[.-]' | %s # count down from 3 to 1\n", self);
+ printf (" echo ',+++.;5' | %s # shows 8\n", self);
+ printf (" echo ',>,<[->+<]>.;4 5' | %s # shows 4+5=9\n", self);
+ printf (" echo 'c,u.;h' | %s # shows 104 (ASCII code for 'h')\n", self);
+ printf (" echo ', [-[->+<]>];4' | %s -t # move data pointer by 4 \n", self);
+ printf
+ (" echo ',>,< [> [->+<] < -[->+<]> ]; 3 7' | %s -t # move '7' by 3 \n\n",
+ self);
+
+ exit (EXIT_SUCCESS);
}
int
-main(int argc, char **argv)
+main (int argc, char **argv)
{
- char *filename;
+ char *filename;
- char *self = argv[0];
+ char *self = argv[0];
- int opt;
+ int opt;
- while (-1 != (opt = getopt(argc, argv, "p:OCts:d:h?iucox")))
+ while (-1 != (opt = getopt (argc, argv, "p:OCts:d:h?iucox")))
{
- switch (opt)
+ switch (opt)
{
- case 'p':
- print_as = optarg;
- break;
- case 's':
- sscanf(optarg, "%u", &stack_size);
- break;
- case 'd':
- sscanf(optarg, "%u", &data_size);
- break;
- case 't':
- trace = 1;
- break;
- case 'C':
- compile = 1;
- break;
- case 'O':
- optimize = 1;
- break;
- case 'i':
- case 'u':
- case 'c':
- case 'o':
- case 'x':
- fmt = opt;
- switch_format();
- break;
- default:
- usage(self);
+ case 'p':
+ print_as = optarg;
+ break;
+ case 's':
+ sscanf (optarg, "%u", &stack_size);
+ break;
+ case 'd':
+ sscanf (optarg, "%u", &data_size);
+ break;
+ case 't':
+ trace = 1;
+ break;
+ case 'C':
+ compile = 1;
+ break;
+ case 'O':
+ optimize = 1;
+ break;
+ case 'i':
+ case 'u':
+ case 'c':
+ case 'o':
+ case 'x':
+ fmt = opt;
+ switch_format ();
+ break;
+ default:
+ usage (self);
}
}
- if (optind < argc)
+ if (optind < argc)
{
- filename = argv[optind];
- if (NULL == (prog = fopen(filename, "r")))
+ filename = argv[optind];
+ if (NULL == (prog = fopen (filename, "r")))
{
- fprintf(stderr, "%s: open '%s': %s\n", self, filename,
- strerror(errno));
- exit(EXIT_FAILURE);
+ fprintf (stderr, "%s: open '%s': %s\n", self, filename,
+ strerror (errno));
+ exit (EXIT_FAILURE);
}
}
- else
+ else
{
- prog = stdin;
+ prog = stdin;
}
- read_code();
+ read_code ();
- if (prog != stdin)
- fclose(prog);
+ if (prog != stdin)
+ fclose (prog);
- if (optimize)
- optimize_code();
+ if (optimize)
+ optimize_code ();
- if (compile)
+ if (compile)
{
- bf2c();
+ bf2c ();
}
- else if (print_as != NULL)
+ else if (print_as != NULL)
{
- if (strcmp(print_as, "cow") == 0)
+ if (strcmp (print_as, "cow") == 0)
{
- bf2moo();
+ bf2moo ();
}
- else
+ else
{
- fprintf(stderr, "Unknown argument to -p: %s\n", print_as);
+ fprintf (stderr, "Unknown argument to -p: %s\n", print_as);
}
}
- else
+ else
{
- init_data();
- init_stack();
- run_code();
+ init_data ();
+ init_stack ();
+ run_code ();
}
- free_all();
- return EXIT_SUCCESS;
+ free_all ();
+ return EXIT_SUCCESS;
}