mmlib/mmat.*:
authorMatthew Mondor <mmondor@pulsar-zone.net>
Sun, 14 Apr 2019 15:12:47 +0000 (15:12 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Sun, 14 Apr 2019 15:12:47 +0000 (15:12 +0000)
- Add optional user data pointer to context
- Remove internal handling of registers array, leave it to user
  code which may also chose the wanted integer type, etc.

mmsoftware/mmlib/mmat.c
mmsoftware/mmlib/mmat.h

index 6b6c6af..16074f8 100644 (file)
@@ -60,27 +60,27 @@ static const char * const at_type_strings[AT_MAX] = {
 
 
 void
-at_ctx_init(at_ctx_t *ctx, char *buf, char *buf2, size_t bufmax,
-    char *lcmdbuf, size_t lcmdbufmax, int *regs, int regsmax,
-    void (*eval)(at_ctx_t *), void (*setreg)(at_ctx_t *))
+at_ctx_init(at_ctx_t *ctx, char *buf, char *bufbak, size_t bufmax,
+    char *lcmdbuf, size_t lcmdbufmax, int regsmax,
+    void (*eval)(at_ctx_t *), void (*setreg)(at_ctx_t *),
+    void *udata)
 {
 
        ctx->buf = buf;
-       ctx->buf2 = buf2;
-       ctx->lcmd = NULL;
-       ctx->bufmax = bufmax;
        *ctx->buf = '\0';
+       ctx->bufbak = bufbak;
+       ctx->bufmax = bufmax;
        ctx->bufn = 0;
        ctx->lcmd = lcmdbuf;
        *ctx->lcmd = '\0';
        ctx->lcmdmax = lcmdbufmax;
        ctx->reg = ctx->val = 0;
-       ctx->regs = regs;
        ctx->regsmax = regsmax;
        ctx->cmd = -1;
        ctx->cmdtype = AT_BASIC;
        ctx->eval = eval;
        ctx->setreg = setreg;
+       ctx->udata = udata;
 }
 
 /*
@@ -98,11 +98,11 @@ at_char(at_ctx_t *ctx, char c)
                bool lastcomm = false;
 
                /* Repeat last command (A/)? */
-               if (ctx->buf2 != NULL && *ctx->buf2 != '\0' &&
+               if (ctx->bufbak != NULL && *ctx->bufbak != '\0' &&
                    ctx->bufn == 2 && ctx->buf[0] == 'A' &&
                    ctx->buf[1] == '/') {
                        lastcomm = true;
-                       (void)memcpy(ctx->buf, ctx->buf2, ctx->bufmax);
+                       (void)memcpy(ctx->buf, ctx->bufbak, ctx->bufmax);
                        ctx->bufn = strlen(ctx->buf);
                }
 
@@ -110,14 +110,14 @@ at_char(at_ctx_t *ctx, char c)
                if (ctx->bufn > 1 && ctx->buf[0] == 'A' && ctx->buf[1] == 'T') {
                        ctx->buf[ctx->bufn] = '\0';
                        /* Buffer for last command request */
-                       if (!lastcomm && ctx->buf2 != NULL)
-                               (void)memcpy(ctx->buf2, ctx->buf,
+                       if (!lastcomm && ctx->bufbak != NULL)
+                               (void)memcpy(ctx->bufbak, ctx->buf,
                                    ctx->bufmax);
                        at_parse(ctx);
                }
 
                /* Reset line, no point in clearing if using last command */
-               if (ctx->buf2 == NULL)
+               if (ctx->bufbak == NULL)
                        (void)memset(ctx->buf, '\0', ctx->bufmax);
                ctx->bufn = 0;
                return;
@@ -149,14 +149,14 @@ static void
 at_parse(at_ctx_t *ctx)
 {
        const char *cptr = &ctx->buf[2];
-       int type;
+       int type, lcmdn;
        bool longcmd;
 
 next:
        ctx->cmd = -1;
        ctx->cmdtype = type = AT_BASIC;
        *ctx->lcmd = '\0';
-       ctx->lcmdn = 0;
+       lcmdn = 0;
        longcmd = false;
 
        for (; *cptr != '\0'; cptr++) {
@@ -195,7 +195,7 @@ next:
 
                                cptr++;
                                if ((val = at_parse_uint(ctx, &cptr, true)) != -1) {
-                                       ctx->regs[ctx->reg] = ctx->val = val;
+                                       ctx->val = val;
                                        ctx->setreg(ctx);
                                }
                                continue;
@@ -203,15 +203,15 @@ next:
                        /* Special dial command supports parameters */
                        if (*cptr == 'D' && !longcmd) {
                                ctx->lcmd[0] = 'D';
-                               ctx->lcmdn = 1;
+                               lcmdn = 1;
                                longcmd = true;
                                continue;
                        }
                }
                /* If a long command (ATD, AT+ or AT#) EOL delimits */
                if (longcmd) {
-                       if (ctx->lcmdn < ctx->lcmdmax)
-                               ctx->lcmd[ctx->lcmdn++] = *cptr;
+                       if (lcmdn < ctx->lcmdmax)
+                               ctx->lcmd[lcmdn++] = *cptr;
                        continue;
                }
                /* Single-letter command, optional numeric value */
@@ -231,8 +231,8 @@ next:
                }
        }
        /* End of line but long command */
-       if (longcmd && ctx->lcmdn > 0) {
-               ctx->lcmd[ctx->lcmdn] = '\0';
+       if (longcmd && lcmdn > 0) {
+               ctx->lcmd[lcmdn] = '\0';
                ctx->cmd = -1;
                ctx->cmdtype = type;
                ctx->eval(ctx);
@@ -274,9 +274,8 @@ static void ateval(at_ctx_t *);
 static void    atsetreg(at_ctx_t *);
 
 static at_ctx_t atctx;
-static char atbuf[AT_BUF_MAX + 1], atbuf2[AT_BUF_MAX + 1],
+static char atbuf[AT_BUF_MAX + 1], atbufbak[AT_BUF_MAX + 1],
     atlcmd[AT_LCMD_MAX + 1];
-static int atregs[AT_REG_MAX];
 
 static void
 ateval(at_ctx_t *ctx)
@@ -302,8 +301,8 @@ int
 main(void)
 {
 
-       at_ctx_init(&atctx, atbuf, atbuf2, AT_BUF_MAX, atlcmd, AT_LCMD_MAX,
-           atregs, AT_REG_MAX, ateval, atsetreg);
+       at_ctx_init(&atctx, atbuf, atbufbak, AT_BUF_MAX, atlcmd, AT_LCMD_MAX,
+           AT_REG_MAX, ateval, atsetreg, NULL);
        for (;;) {
                int c;
 
index 7142d2f..a6fbce0 100644 (file)
@@ -52,16 +52,18 @@ enum at_type {
 
 typedef struct at_ctx at_ctx_t;
 struct at_ctx {
-       char    *buf, *buf2, *lcmd;
+       char    *buf, *bufbak, *lcmd;
        size_t  bufmax, lcmdmax;
-       int     bufn, lcmdn, reg, val, *regs, regsmax, cmd, cmdtype;
+       int     bufn, reg, val, regsmax, cmd, cmdtype;
        void    (*eval)(at_ctx_t *);
        void    (*setreg)(at_ctx_t *);
+       void    *udata;
 };
 
 extern void            at_ctx_init(at_ctx_t *, char *, char *, size_t,
-                           char *, size_t, int *, int,
-                           void (*)(at_ctx_t *), void (*)(at_ctx_t *));
+                           char *, size_t, int,
+                           void (*)(at_ctx_t *), void (*)(at_ctx_t *),
+                           void *);
 extern void            at_char(at_ctx_t *, char);
 extern const char      *at_type_str(int);