// // Created by cfif on 12.12.22. // #include "string.h" #include "inttypes.h" //#include "stream.h" #include "httpd_base_func.h" #include "stdio.h" #include "AsciiStringParsingUtils.h" int extract_mac_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) { char *pair; char *equals; int loop; /* If we have no parameters at all, return immediately. */ if (!params || (params[0] == '\0')) { return (0); } /* Get a pointer to our first parameter */ pair = params; /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the * remainder (if any) */ for (loop = 0; (loop < params_max) && pair; loop++) { /* Save the name of the parameter */ param_names[loop] = pair; /* Remember the start of this name=value pair */ equals = pair; /* Find the start of the next name=value pair and replace the delimiter * with a 0 to terminate the previous pair string. */ pair = strchr(pair, ':'); if (pair) { *pair = '\0'; pair++; } else { /* We didn't find a new parameter so find the end of the URI and * replace the space with a '\0' */ pair = strchr(equals, ' '); if (pair) { *pair = '\0'; } /* Revert to NULL so that we exit the loop as expected. */ pair = NULL; } /* Now find the '=' in the previous pair, replace it with '\0' and save * the parameter value string. */ equals = strchr(equals, '.'); if (equals) { *equals = '\0'; param_vals[loop] = equals + 1; } else { param_vals[loop] = NULL; } } return loop; } int extract_ip_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) { char *pair; char *equals; int loop; /* If we have no parameters at all, return immediately. */ if (!params || (params[0] == '\0')) { return (0); } /* Get a pointer to our first parameter */ pair = params; /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the * remainder (if any) */ for (loop = 0; (loop < params_max) && pair; loop++) { /* Save the name of the parameter */ param_names[loop] = pair; /* Remember the start of this name=value pair */ equals = pair; /* Find the start of the next name=value pair and replace the delimiter * with a 0 to terminate the previous pair string. */ pair = strchr(pair, '.'); if (pair) { *pair = '\0'; pair++; } else { /* We didn't find a new parameter so find the end of the URI and * replace the space with a '\0' */ pair = strchr(equals, ' '); if (pair) { *pair = '\0'; } /* Revert to NULL so that we exit the loop as expected. */ pair = NULL; } /* Now find the '=' in the previous pair, replace it with '\0' and save * the parameter value string. */ equals = strchr(equals, '.'); if (equals) { *equals = '\0'; param_vals[loop] = equals + 1; } else { param_vals[loop] = NULL; } } return loop; } int extract_grp_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) { char *pair; char *equals; int loop; /* If we have no parameters at all, return immediately. */ if (!params || (params[0] == '\0')) { return (0); } /* Get a pointer to our first parameter */ pair = params; /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the * remainder (if any) */ for (loop = 0; (loop < params_max) && pair; loop++) { /* Save the name of the parameter */ param_names[loop] = pair; /* Remember the start of this name=value pair */ equals = pair; /* Find the start of the next name=value pair and replace the delimiter * with a 0 to terminate the previous pair string. */ pair = strchr(pair, ','); if (pair) { *pair = '\0'; pair++; } else { /* We didn't find a new parameter so find the end of the URI and * replace the space with a '\0' */ pair = strchr(equals, ' '); if (pair) { *pair = '\0'; } /* Revert to NULL so that we exit the loop as expected. */ pair = NULL; } /* Now find the '=' in the previous pair, replace it with '\0' and save * the parameter value string. */ equals = strchr(equals, ','); if (equals) { *equals = '\0'; param_vals[loop] = equals + 1; } else { param_vals[loop] = NULL; } } return loop; } int extract_path_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) { char *pair; char *equals; int loop; /* If we have no parameters at all, return immediately. */ if (!params || (params[0] == '\0')) { return (0); } /* Get a pointer to our first parameter */ pair = params; /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the * remainder (if any) */ for (loop = 0; (loop < params_max) && pair; loop++) { /* Save the name of the parameter */ param_names[loop] = pair; /* Remember the start of this name=value pair */ equals = pair; /* Find the start of the next name=value pair and replace the delimiter * with a 0 to terminate the previous pair string. */ pair = strchr(pair, '/'); if (pair) { *pair = '\0'; pair++; } else { /* We didn't find a new parameter so find the end of the URI and * replace the space with a '\0' */ pair = strchr(equals, ' '); if (pair) { *pair = '\0'; } /* Revert to NULL so that we exit the loop as expected. */ pair = NULL; } /* Now find the '=' in the previous pair, replace it with '\0' and save * the parameter value string. */ equals = strchr(equals, '/'); if (equals) { *equals = '\0'; param_vals[loop] = equals + 1; } else { param_vals[loop] = NULL; } } return loop; } int extract_uri_ex_parameters(char *params, char *param_names[], char *param_vals[], int params_max) { char *pair; char *equals; int loop; /* If we have no parameters at all, return immediately. */ if (!params || (params[0] == '\0')) { return (0); } /* Get a pointer to our first parameter */ pair = params; /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the * remainder (if any) */ for (loop = 0; (loop < params_max) && pair; loop++) { /* Save the name of the parameter */ param_names[loop] = pair; /* Remember the start of this name=value pair */ equals = pair; /* Find the start of the next name=value pair and replace the delimiter * with a 0 to terminate the previous pair string. */ pair = strchr(pair, '&'); if (pair) { *pair = '\0'; pair++; } else { /* We didn't find a new parameter so find the end of the URI and * replace the space with a '\0' */ pair = strchr(equals, ' '); if (pair) { *pair = '\0'; } /* Revert to NULL so that we exit the loop as expected. */ pair = NULL; } /* Now find the '=' in the previous pair, replace it with '\0' and save * the parameter value string. */ equals = strchr(equals, '='); if (equals) { *equals = '\0'; param_vals[loop] = equals + 1; } else { param_vals[loop] = NULL; } } return loop; } int extract_utf8_parameters(char *inBuf, char *outBuf, int maxlen) { unsigned char *p; uint8_t n; int count = 0; for (p = (unsigned char *) inBuf; *p; ++p) { if (*p == '%') { // if (debug_scanf(p + 1, "%x", &n)) { // ' n = iAsciiStringParseHexByte(p + 1); // if (scanf(p + 1, "%x", &n)) { if (n != 0x27) { outBuf[count] = n; ++count; } p += 2; // } } else { outBuf[count] = *p; ++count; if (count >= maxlen) break; } } outBuf[count] = '\0'; return count; } void StrToStr(char *str1, char *str2) { while (*str1 == '0') ++str1; if (strlen(str1) == 0) { strcpy(str2, "0"); } else { strcpy(str2, str1); } } void string2hexString(char *input, int size, char *output) { int loop; int i; i = 0; loop = 0; while (input[loop] != '\0') { debug_sprintf((char *) (output + i), size, "%02X", input[loop]); loop += 1; i += 2; } output[i++] = '\0'; } // mapping of ASCII characters to hex values const uint8_t hashmap[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // !"#$%&' 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ()*+,-./ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, // 01234567 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 89:;<=>? 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, // @ABCDEFG 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // HIJKLMNO 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // PQRSTUVW 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // XYZ[\]^_ 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, // `abcdefg 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // hijklmno 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // pqrstuvw 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // xyz{|}~. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // ........ }; uint8_t HexToData(char *str, uint8_t *bytes) { uint8_t pos; uint8_t idx0; uint8_t idx1; for (pos = 0; ((pos < (strlen(str))) && (pos < strlen(str))); pos += 2) { idx0 = (uint8_t) str[pos + 0]; idx1 = (uint8_t) str[pos + 1]; bytes[pos / 2] = (uint8_t) (hashmap[idx0] << 4) | hashmap[idx1]; } bytes[pos / 2] = 0; return strlen(str) / 2; }