浏览代码

fix ak_get_prefixfield return and handle use

KNpTrue 6 年之前
父节点
当前提交
632c5bbbe8
共有 1 个文件被更改,包括 30 次插入15 次删除
  1. 30 15
      airkiss.c

+ 30 - 15
airkiss.c

@@ -10,17 +10,20 @@
 
 #include "airkiss.h"
 
-#include <string.h>
 #include <stdint.h>
 
 #ifdef AIRKISS_LOG_ENABLE
-#define AKLOG_D                     \
-    if (lc->cfg && lc->cfg->printf) \
-    lc->cfg->printf
+#define AKLOG_D(fmt, ...)  lc->cfg->printf(fmt, ##__VA_ARGS__)
 #else
 #define AKLOG_D(...)
 #endif
 
+#define NULL 0
+
+#define AKMEMCPY(dst, src, len) lc->cfg->memcpy(dst, src, len)
+#define AKMEMSET(ptr, value, len) lc->cfg->memset(ptr, value, len)
+#define AKMEMCMP(ptr1, ptr2, len) lc->cfg->memcmp(ptr1, ptr2, len)
+
 #define AKSTATE_WFG 0
 #define AKSTATE_WFM 1
 #define AKSTATE_WFP 2
@@ -143,7 +146,7 @@ static void akloc_reset(akloc_context_t *lc)
     const airkiss_config_t *cfg;
 
     cfg = lc->cfg;
-    memset(lc, 0, sizeof(*lc));
+    AKMEMSET(lc, 0, sizeof(*lc));
     lc->cfg = cfg;
 }
 
@@ -204,7 +207,7 @@ static int ak_magicfield_input(akcode_t *ac, uint16_t len)
 
 static int ak_get_prefixfield(akloc_context_t *lc, akcode_t *ac)
 {
-    int ret;
+    int ret = 1;
     uint8_t crc;
 
     lc->pwdlen = akinfo_getu8(&ac->val[0]);
@@ -270,7 +273,7 @@ static int ak_get_datafield(akloc_context_t *lc, akcode_t *ac)
     ret = ((airkiss_crc8(&tmp[1], n + 1) & 0x7F) == tmp[0]);
     if (ret)
     {
-        memcpy(&lc->data[pos], &tmp[2], n);
+        AKMEMCPY(&lc->data[pos], &tmp[2], n);
         lc->reclen += n;
         lc->seq[seqi] = 1;
 
@@ -313,7 +316,7 @@ static akcode_guide_t *ak_guide_getcode(akloc_context_t *lc, unsigned char *f)
         for (i = 0; i < sizeof(lc->uc.code1) / sizeof(lc->uc.code1[0]); i++)
         {
             /* 匹配地址 */
-            found = !memcmp(&sa, &ac->sa, sizeof(ac->sa));
+            found = !AKMEMCMP(&sa, &ac->sa, sizeof(ac->sa));
             if (found)
                 break;
             /* 记录权值最小的 */
@@ -393,7 +396,7 @@ static int ak_waitfor_guidefield(akloc_context_t *lc, uint8_t *f, uint16_t len)
         if (lc->state == AKSTATE_WFM)
         {
             lc->locked = ac->sa;
-            memset(&lc->uc, 0, sizeof(lc->uc));
+            AKMEMSET(&lc->uc, 0, sizeof(lc->uc));
             ret = AIRKISS_STATUS_CHANNEL_LOCKED;
         }
     }
@@ -588,11 +591,11 @@ static int ak_pendinput_mark(akloc_context_t *lc, uint8_t ind)
         }
 
         d[0] = ind;
-        memcpy(&d[1], &lc->data[pos], size);
+        AKMEMCPY(&d[1], &lc->data[pos], size);
         crc = airkiss_crc8((uint8_t*)d, size + 1) & 0x7f;
         if (crc == (pd->crc & 0x7f))
         {
-            memset(pd, 0, sizeof(*pd));
+            AKMEMSET(pd, 0, sizeof(*pd));
             lc->seq[ind] = 1;
             lc->reclen += size;
             ret = 1;
@@ -759,8 +762,8 @@ static int _dataconflict_crccheck(akloc_context_t *lc, akdatf_header_t* pd, uint
         int pos;
 
         pos = (pd->ind & 0x7f) * 4;
-        memcpy(&lc->data[pos], &d[1], size);
-        memset(pd, 0, sizeof(*pd));
+        AKMEMCPY(&lc->data[pos], &d[1], size);
+        AKMEMSET(pd, 0, sizeof(*pd));
         lc->seq[(uint8_t)d[0]] = 1;
         lc->reclen += size;
         ak_dataconflict_clear(lc, dpos);
@@ -1032,7 +1035,7 @@ static int ak_datainput_withwireseq(akloc_context_t *lc, uint8_t *f, uint16_t le
         {
             if (!ak_databody_input(lc, cur, ws, len))
             {
-                memset(&AKLOC_DFSEQ_CUR(lc), 0 , sizeof(*cur));
+                AKMEMSET(&AKLOC_DFSEQ_CUR(lc), 0 , sizeof(*cur));
             }
 
             if (lc->reclen == lc->prslen)
@@ -1116,7 +1119,7 @@ static int ak_sa_filter(akloc_context_t *lc, uint8_t *f)
         akaddr_t sa;
 
         akaddr_fromframe(&sa, f);
-        ret = memcmp(&lc->locked, &sa, sizeof(sa));
+        ret = AKMEMCMP(&lc->locked, &sa, sizeof(sa));
     }
 
     return ret;
@@ -1201,6 +1204,18 @@ int airkiss_init(airkiss_context_t *c, const airkiss_config_t *config)
 {
     akloc_context_t *lc = (akloc_context_t *)c;
 
+    if (!c
+        | !config
+        | !config->memcpy
+        | !config->memset
+        | !config->memcmp
+#ifdef AIRKISS_LOG_ENABLE
+        | !config->printf
+#endif /* AIRKISS_LOG_ENABLE */
+        )
+    {
+        return -1;
+    }
     lc->cfg = config;
     akloc_reset(lc);