mmlib/mmat: Minor optimizations
authorMatthew Mondor <mmondor@pulsar-zone.net>
Mon, 15 Apr 2019 01:54:24 +0000 (01:54 +0000)
committerMatthew Mondor <mmondor@pulsar-zone.net>
Mon, 15 Apr 2019 01:54:24 +0000 (01:54 +0000)
mmsoftware/mmlib/mmat.c
mmsoftware/mmlib/mmat.h

index cd5bba3..107a0c4 100644 (file)
@@ -34,7 +34,7 @@
  /*
   * Modem AT command set (Hayes style) parsing library
   * To compile test binary:
-  * cc -Wall -Os -I. -DTEST -o mmat mmat.c
+  * cc -Wall -g -Og -I. -DTEST -o mmat mmat.c
   */
 
 #include <mmat.h>
@@ -75,7 +75,7 @@ at_ctx_init(at_ctx_t *ctx, char *buf, char *bufbak, size_t bufmax,
        *ctx->buf = '\0';
        ctx->bufbak = bufbak;
        ctx->bufmax = bufmax;
-       ctx->bufn = 0;
+       ctx->bufn = ctx->bufbakn = 0;
        ctx->lcmd = lcmdbuf;
        *ctx->lcmd = '\0';
        ctx->lcmdmax = lcmdbufmax;
@@ -97,40 +97,38 @@ at_ctx_init(at_ctx_t *ctx, char *buf, char *bufbak, size_t bufmax,
 void
 at_char(at_ctx_t *ctx, char c)
 {
+       bool lastcomm = false;
 
-       /* Full line received? */
-       if (c == '\r') {
-               bool lastcomm = false;
-
-               /* Repeat last command (A/)? */
-               if (ctx->bufbak != NULL && *ctx->bufbak != '\0' &&
-                   ctx->bufn == 2 && ctx->buf[0] == 'A' &&
-                   ctx->buf[1] == '/') {
-                       lastcomm = true;
-                       (void)memcpy(ctx->buf, ctx->bufbak, ctx->bufmax);
-                       ctx->bufn = strlen(ctx->buf);
-               }
+       /* Fast path, queue new char */
+       if (c != '\r' && ctx->bufn < ctx->bufmax) {
+               ctx->buf[ctx->bufn++] = c;
+               return;
+       }
 
-               /* New AT command? */
-               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->bufbak != NULL)
-                               (void)memcpy(ctx->bufbak, ctx->buf,
-                                   ctx->bufmax);
-                       at_parse(ctx);
-               }
+       /* Full line received */
 
-               /* Reset line, no point in clearing if using last command */
-               if (ctx->bufbak == NULL)
-                       (void)memset(ctx->buf, '\0', ctx->bufmax);
-               ctx->bufn = 0;
-               return;
+       /* Repeat last command (A/)? */
+       if (ctx->bufbak != NULL && *ctx->bufbak != '\0' &&
+           ctx->bufn == 2 && ctx->buf[0] == 'A' && ctx->buf[1] == '/') {
+               lastcomm = true;
+               (void)memcpy(ctx->buf, ctx->bufbak, ctx->bufbakn);
+               ctx->bufn = ctx->bufbakn;
        }
 
-       /* Queue new char */
-       if (ctx->bufn < ctx->bufmax)
-               ctx->buf[ctx->bufn++] = c;
+       /* New AT command? */
+       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->bufbak != NULL) {
+                       (void)memcpy(ctx->bufbak, ctx->buf, ctx->bufn);
+                       ctx->bufbakn = ctx->bufn;
+               }
+               at_parse(ctx);
+       }
+
+       /* Reset line */
+       ctx->bufn = 0;
+       *ctx->buf = '\0';
 }
 
 const char *
index a6fbce0..652c36a 100644 (file)
@@ -54,7 +54,7 @@ typedef struct at_ctx at_ctx_t;
 struct at_ctx {
        char    *buf, *bufbak, *lcmd;
        size_t  bufmax, lcmdmax;
-       int     bufn, reg, val, regsmax, cmd, cmdtype;
+       int     bufn, bufbakn, reg, val, regsmax, cmd, cmdtype;
        void    (*eval)(at_ctx_t *);
        void    (*setreg)(at_ctx_t *);
        void    *udata;