From b0326fb63170801353cbc4d53b80846381de82f4 Mon Sep 17 00:00:00 2001 From: Jan Breuer <jan.breuer@jaybee.cz> Date: 周五, 08 11月 2013 02:14:38 +0800 Subject: [PATCH] Implement compose compound command functionality --- libscpi/src/utils.c | 82 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 78 insertions(+), 4 deletions(-) diff --git a/libscpi/src/utils.c b/libscpi/src/utils.c index 5498cf2..6a41e54 100644 --- a/libscpi/src/utils.c +++ b/libscpi/src/utils.c @@ -54,7 +54,7 @@ * @param set * @return */ -char * strnpbrk(const char *str, size_t size, const char *set) { +const char * strnpbrk(const char *str, size_t size, const char *set) { const char *scanp; long c, sc; const char * strend = str + size; @@ -62,7 +62,7 @@ while ((strend != str) && ((c = *str++) != 0)) { for (scanp = set; (sc = *scanp++) != '\0';) if (sc == c) - return ((char *) (str - 1)); + return str - 1; } return (NULL); } @@ -401,7 +401,7 @@ */ size_t patternSeparatorPos(const char * pattern, size_t len) { - char * separator = strnpbrk(pattern, len, "?:[]"); + const char * separator = strnpbrk(pattern, len, "?:[]"); if (separator == NULL) { return len; } else { @@ -416,7 +416,7 @@ * @return position of separator or len */ size_t cmdSeparatorPos(const char * cmd, size_t len) { - char * separator = strnpbrk(cmd, len, ":?"); + const char * separator = strnpbrk(cmd, len, ":?"); size_t result; if (separator == NULL) { result = len; @@ -573,6 +573,80 @@ return result; } +/** + * Compose command from previsou command anc current command + * + * @param ptr_prev pointer to previous command + * @param len_prev length of previous command + * @param pptr pointer to pointer of current command + * @param plen pointer to length of current command + * + * ptr_prev and ptr should be in the same memory buffer + * + * Function will add part of previous command prior to ptr_prev + * + * char * cmd = "meas:volt:dc?;ac?" + * char * ptr_prev = cmd; + * size_t len_prev = 13; + * char * ptr = cmd + 14; + * size_t len = 3; + * + * composeCompoundCommand(ptr_prev, len_prev, &ptr, &len); + * + * after calling this + * + * + * + */ +bool_t composeCompoundCommand(char * ptr_prev, size_t len_prev, + char ** pptr, size_t * plen) { + char * ptr; + size_t len; + size_t i; + + /* Invalid input */ + if (pptr == NULL || plen == NULL) + return FALSE; + + /* no previous command - nothing to do*/ + if (ptr_prev == NULL || len_prev == 0) + return TRUE; + + ptr = *pptr; + len = *plen; + + /* No current command */ + if (len == 0 || ptr == NULL) + return FALSE; + + /* Common command or command root - nothing to do */ + if (ptr[0] == '*' || ptr[0] == ':') + return TRUE; + + /* Previsou command was common command - nothing to do */ + if (ptr_prev[0] == '*') + return TRUE; + + /* Find last occurence of ':' */ + for (i = len_prev; i > 0; i--) { + if (ptr_prev[i-1] == ':') { + break; + } + } + + /* Previous command was simple command - nothing to do*/ + if (i == 0) + return TRUE; + + ptr -= i; + len += i; + memmove(ptr, ptr_prev, i); + *plen = len; + *pptr = ptr; + return TRUE; +} + + #if !HAVE_STRNLEN /* use FreeBSD strnlen */ -- Gitblit v1.9.1