mmlib/mmat.*: simplify long command processing, only allow them
authorMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 10 Apr 2019 18:49:55 +0000 (18:49 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Wed, 10 Apr 2019 18:49:55 +0000 (18:49 +0000)
as the last command on a line.  AT_V250 -> AT_LONG.  Let user code
specify long command buffer and size.

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

index 7d705ca..6b6c6af 100644 (file)
@@ -55,14 +55,14 @@ static const char * const at_type_strings[AT_MAX] = {
        "AT_EXTENDED",
        "AT_VENDOR1",
        "AT_VENDOR2",
-       "AT_V250"
+       "AT_LONG"
 };
 
 
 void
 at_ctx_init(at_ctx_t *ctx, char *buf, char *buf2, size_t bufmax,
-    int *regs, int regsmax, void (*eval)(at_ctx_t *),
-    void (*setreg)(at_ctx_t *))
+    char *lcmdbuf, size_t lcmdbufmax, int *regs, int regsmax,
+    void (*eval)(at_ctx_t *), void (*setreg)(at_ctx_t *))
 {
 
        ctx->buf = buf;
@@ -71,6 +71,9 @@ at_ctx_init(at_ctx_t *ctx, char *buf, char *buf2, size_t bufmax,
        ctx->bufmax = bufmax;
        *ctx->buf = '\0';
        ctx->bufn = 0;
+       ctx->lcmd = lcmdbuf;
+       *ctx->lcmd = '\0';
+       ctx->lcmdmax = lcmdbufmax;
        ctx->reg = ctx->val = 0;
        ctx->regs = regs;
        ctx->regsmax = regsmax;
@@ -146,18 +149,15 @@ static void
 at_parse(at_ctx_t *ctx)
 {
        const char *cptr = &ctx->buf[2];
-       char lcmd[AT_LCMD_MAX + 1];
-       size_t lcmdn;
        int type;
        bool longcmd;
 
 next:
        ctx->cmd = -1;
        ctx->cmdtype = type = AT_BASIC;
-       ctx->lcmd = NULL;
-       *lcmd = '\0';
+       *ctx->lcmd = '\0';
+       ctx->lcmdn = 0;
        longcmd = false;
-       lcmdn = 0;
 
        for (; *cptr != '\0'; cptr++) {
                /* Switch command type accordingly */
@@ -174,7 +174,7 @@ next:
                        continue;
                }
                if (*cptr == '+' || *cptr == '#') {
-                       type = AT_V250;
+                       type = AT_LONG;
                        longcmd = true;
                        continue;
                }
@@ -202,38 +202,24 @@ next:
                        }
                        /* Special dial command supports parameters */
                        if (*cptr == 'D' && !longcmd) {
-                               lcmd[0] = 'D';
-                               lcmdn = 1;
+                               ctx->lcmd[0] = 'D';
+                               ctx->lcmdn = 1;
                                longcmd = true;
                                continue;
                        }
                }
-               /* If a long command (ATD, AT+ or AT#) next command delimits */
+               /* If a long command (ATD, AT+ or AT#) EOL delimits */
                if (longcmd) {
-                       if ((*cptr == '-' || *cptr == '+' || *cptr == '*' ||
-                            *cptr == '#' || *cptr == ',' || *cptr == '.' ||
-                            *cptr == '=' || *cptr == '?' || *cptr == '"' ||
-                           isdigit((int)*cptr) ||
-                           (isalpha((int)*cptr) && isupper((int)*cptr))) &&
-                           lcmdn < AT_LCMD_MAX) {
-                               lcmd[lcmdn++] = *cptr;
-                               continue;
-                       } else if (lcmdn > 0) {
-                               /* XXX Redundancy with below */
-                               lcmd[lcmdn] = '\0';
-                               ctx->cmd = -1;
-                               ctx->lcmd = lcmd;
-                               ctx->cmdtype = type;
-                               ctx->eval(ctx);
-                               goto next;
-                       }
+                       if (ctx->lcmdn < ctx->lcmdmax)
+                               ctx->lcmd[ctx->lcmdn++] = *cptr;
+                       continue;
                }
                /* Single-letter command, optional numeric value */
                if (isalpha((int)*cptr) && isupper((int)*cptr)) {
                        int val;
 
                        ctx->cmd = *cptr;
-                       ctx->lcmd = NULL;
+                       *ctx->lcmd = '\0';
                        ctx->cmdtype = type;
                        cptr++;
                        if ((val = at_parse_uint(ctx, &cptr, false)) != -1)
@@ -244,12 +230,10 @@ next:
                        goto next;
                }
        }
-       /* End of line but long command remnant */
-       /* XXX Redundancy with above */
-       if (longcmd && lcmdn > 0) {
-               lcmd[lcmdn] = '\0';
+       /* End of line but long command */
+       if (longcmd && ctx->lcmdn > 0) {
+               ctx->lcmd[ctx->lcmdn] = '\0';
                ctx->cmd = -1;
-               ctx->lcmd = lcmd;
                ctx->cmdtype = type;
                ctx->eval(ctx);
        }
@@ -283,13 +267,15 @@ at_parse_uint(at_ctx_t *ctx, const char **cptr, bool rewind)
 
 #define AT_BUF_MAX     255
 #define AT_REG_MAX     32
+#define AT_LCMD_MAX    128
 
 int            main(void);
 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], atbuf2[AT_BUF_MAX + 1],
+    atlcmd[AT_LCMD_MAX + 1];
 static int atregs[AT_REG_MAX];
 
 static void
@@ -299,7 +285,7 @@ ateval(at_ctx_t *ctx)
        if (ctx->cmd != -1) {
                (void)printf("eval(type=%s, cmd=%c, val=%d)\n",
                    at_type_str(ctx->cmdtype), ctx->cmd, ctx->val);
-       } else if (ctx->lcmd != NULL) {
+       } else if (ctx->lcmd != NULL && *ctx->lcmd != '\0') {
                (void)printf("eval(type=%s, lcmd=%s)\n",
                    at_type_str(ctx->cmdtype), ctx->lcmd);
        }
@@ -316,8 +302,8 @@ int
 main(void)
 {
 
-       at_ctx_init(&atctx, atbuf, atbuf2, AT_BUF_MAX, atregs, AT_REG_MAX,
-           ateval, atsetreg);
+       at_ctx_init(&atctx, atbuf, atbuf2, AT_BUF_MAX, atlcmd, AT_LCMD_MAX,
+           atregs, AT_REG_MAX, ateval, atsetreg);
        for (;;) {
                int c;
 
index 24797dc..7142d2f 100644 (file)
 #include <stdint.h>
 
 
-#define AT_LCMD_MAX    16
-
 enum at_type {
        AT_BASIC = 0,
        AT_EXTENDED,
        AT_VENDOR1,
        AT_VENDOR2,
-       AT_V250,
+       AT_LONG,
        AT_MAX
 };
 
 typedef struct at_ctx at_ctx_t;
 struct at_ctx {
        char    *buf, *buf2, *lcmd;
-       size_t  bufmax;
-       int     bufn, reg, val, *regs, regsmax, cmd, cmdtype;
+       size_t  bufmax, lcmdmax;
+       int     bufn, lcmdn, reg, val, *regs, regsmax, cmd, cmdtype;
        void    (*eval)(at_ctx_t *);
        void    (*setreg)(at_ctx_t *);
 };
 
-extern void            at_ctx_init(at_ctx_t *, char *, char *, size_t, int *, int,
+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 *));
 extern void            at_char(at_ctx_t *, char);
 extern const char      *at_type_str(int);