/* * Miscellaneous functions and data structures for doing random things. */ /* * Copyright © 2016-2017 The TokTok team. * Copyright © 2013 Tox project. * * This file is part of Tox, the free peer to peer instant messenger. * * Tox is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Tox is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Tox. If not, see . */ #ifndef MISC_TOOLS_C #define MISC_TOOLS_C #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include //Sleep function (x = milliseconds) #ifndef c_sleep #if defined(_WIN32) || defined(__WIN32__) || defined (WIN32) #include #define c_sleep(x) Sleep(x) #else #include #define c_sleep(x) usleep(1000*(x)) #endif #endif #include "../toxcore/ccompat.h" // You are responsible for freeing the return value! uint8_t *hex_string_to_bin(const char *hex_string) { // byte is represented by exactly 2 hex digits, so lenth of binary string // is half of that of the hex one. only hex string with even length // valid. the more proper implementation would be to check if strlen(hex_string) // is odd and return error code if it is. we assume strlen is even. if it's not // then the last byte just won't be written in 'ret'. size_t i, len = strlen(hex_string) / 2; uint8_t *ret = (uint8_t *)malloc(len); const char *pos = hex_string; for (i = 0; i < len; ++i, pos += 2) { sscanf(pos, "%2hhx", &ret[i]); } return ret; } /* Reimplementation of strncasecmp() function from strings.h, as strings.h is * POSIX and not portable. Specifically it doesn't exist on MSVC. */ int tox_strncasecmp(const char *s1, const char *s2, size_t n) { while (n--) { int c1 = tolower(*(s1++)); int c2 = tolower(*(s2++)); if (c1 == '\0' || c2 == '\0' || c1 != c2) { return c1 - c2; } } return 0; } int cmdline_parsefor_ipv46(int argc, char **argv, uint8_t *ipv6enabled) { int argvoffset = 0, argi; for (argi = 1; argi < argc; argi++) { if (!tox_strncasecmp(argv[argi], "--ipv", 5)) { if (argv[argi][5] && !argv[argi][6]) { char c = argv[argi][5]; if (c == '4') { *ipv6enabled = 0; } else if (c == '6') { *ipv6enabled = 1; } else { printf("Invalid argument: %s. Try --ipv4 or --ipv6!\n", argv[argi]); return -1; } } else { printf("Invalid argument: %s. Try --ipv4 or --ipv6!\n", argv[argi]); return -1; } if (argvoffset != argi - 1) { printf("Argument must come first: %s.\n", argv[argi]); return -1; } argvoffset++; } } return argvoffset; } #endif // MISC_TOOLS_C