Author | Jakob Wakeling <[email protected]> |
Date | 2021-08-18 04:25:09 |
Commit | 35b4ead3ce7badaba4c81b493930f45a51eec9a7 |
Parent | 8636cc60be5f514cf5ef96e1d310df725cdb3d52 |
Add tape length flag
At present, increasing the tape length too far results in a segfault
Diffstat
M | src/obfi.c | | | 18 | +++++++++++++----- |
1 files changed, 13 insertions, 5 deletions
diff --git a/src/obfi.c b/src/obfi.c index 7ed0754..6cbaa1f 100644 --- a/src/obfi.c +++ b/src/obfi.c @@ -39,14 +39,14 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE SOFTWARE. #include <stdlib.h> #include <string.h> -#define TAPELEN 30000 - static struct lop lops[] = { { "help", ARG_NUL, 256 }, { "version", ARG_NUL, 257 }, { NULL, 0, 0 } }; +static size_t l = 30000; + static inline int cmp(const char *s1, const char *s2); static inline int run(const char *b, const long *c); @@ -54,8 +54,16 @@ static void hlp(void); static void ver(void); int main(int ac, char *av[]) { A0 = av[0]; - struct opt opt = OPTGET_INIT; opt.str = ""; opt.lops = lops; + struct opt opt = OPTGET_INIT; opt.str = "l:"; opt.lops = lops; for (int o; (o = optget(&opt, av, 1)) != -1;) switch (o) { + case 'l': { + register char *s = opt.arg; register int c; + for (l = 0; *s >= '0' && *s <= '9'; ++s) { c = *s - '0'; + if (l > (SIZE_MAX - c) / 10) { break; } l = l * 10 + c; + } + + if (*s) { error(1, "%s: invalid tape length", opt.arg); } break; + } case 256: { hlp(); return 0; } case 257: { ver(); return 0; } default: { return 1; } @@ -153,8 +161,8 @@ static inline int cmp(const char *s1, const char *s2) { /* Execute an array of Brainfuck instructions */ static inline int run(const char *fb, const long *fc) { - uint_fast8_t *M = calloc(TAPELEN, sizeof (*M)), *p = M; - if (!M) { return 1; } + uint8_t *M = calloc(l, sizeof (*M)), *p = M; + if (!M) { error(1, "%s", serr()); } // Execute each optimised Brainfuck instruction for (size_t i = 0; fb[i]; ++i) switch (fb[i]) {