From 6e9525f3f5b3631d40b1f62414e8fc6ec925c80d Mon Sep 17 00:00:00 2001 From: JAJames Date: Mon, 25 Jan 2016 17:51:19 -0500 Subject: [PATCH] Functions: * Implemented 'isOctal' to go with 'isDecimal' and 'isHex' * Implemented 'getHex', 'getDecimal', and 'getOctal' functions which are slightly more efficient than calling 'getBase' with a constant base input. * Improved how netmask_table is implemented. Removed some unused, dead, and inefficient code/functions. General cleanup and improvements, so my eyes don't bleed as much when looking at functions I implemented several years ago. --- .gitignore | 3 + Jupiter/ArrayList.h | 2 +- Jupiter/Database.cpp | 7 +- Jupiter/Functions.c | 846 ++++++++++---------------------------- Jupiter/Functions.h | 265 +++--------- Jupiter/IRC_Client.cpp | 2 +- Jupiter/String_Type_Imp.h | 38 +- Release/Jupiter.lib | Bin 304802 -> 299992 bytes 8 files changed, 309 insertions(+), 854 deletions(-) diff --git a/.gitignore b/.gitignore index 1bc915c..fd26a59 100644 --- a/.gitignore +++ b/.gitignore @@ -154,3 +154,6 @@ $RECYCLE.BIN/ # Mac desktop service store files .DS_Store + +# Visual Studio OpenDB +*.VC.opendb diff --git a/Jupiter/ArrayList.h b/Jupiter/ArrayList.h index 99d1302..1716b33 100644 --- a/Jupiter/ArrayList.h +++ b/Jupiter/ArrayList.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above diff --git a/Jupiter/Database.cpp b/Jupiter/Database.cpp index 9b0af93..2bde975 100644 --- a/Jupiter/Database.cpp +++ b/Jupiter/Database.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2015 Jessica James. + * Copyright (C) 2015-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -144,11 +144,6 @@ bool Jupiter::Database::append(const char *file, Jupiter::DataBuffer &data) return r; } -template T *get_ptr(T &in) -{ - return ∈ -} - bool Jupiter::Database::append(FILE *file, Jupiter::DataBuffer &data) { fwrite(std::addressof(data.size()), sizeof(size_t), 1, file); diff --git a/Jupiter/Functions.c b/Jupiter/Functions.c index d491631..f6c8d33 100644 --- a/Jupiter/Functions.c +++ b/Jupiter/Functions.c @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -16,622 +16,193 @@ * Written by Jessica James */ -#include // malloc #include // uintxx_t typedefs. -#include // fprintf and stderr #include // Used by getTime() -#include // toupper -#include // towupper +#include // isspace #include // pow #include "Functions.h" -// Little Endian -unsigned int getZeroByte(uint32_t *v) -{ - if ((*v & 0x000000FF) == 0) return 0; - if ((*v & 0x0000FF00) == 0) return 1; - if ((*v & 0x00FF0000) == 0) return 2; - if ((*v & 0xFF000000) == 0) return 3; - return 4; -} - -unsigned int getZeroByte2(uint64_t v) -{ - if ((v & 0x00000000000000FF) == 0) return 0; - if ((v & 0x000000000000FF00) == 0) return 1; - if ((v & 0x0000000000FF0000) == 0) return 2; - if ((v & 0x00000000FF000000) == 0) return 3; - if ((v & 0x000000FF00000000) == 0) return 4; - if ((v & 0x0000FF0000000000) == 0) return 5; - if ((v & 0x00FF000000000000) == 0) return 6; - if ((v & 0xFF00000000000000) == 0) return 7; - return 8; -} - -/* -// Big Endian -unsigned int getZeroByte(uint32_t v) -{ - if ((v & 0xFF000000) == 0) return 0; - if ((v & 0x00FF0000) == 0) return 1; - if ((v & 0x0000FF00) == 0) return 2; - if ((v & 0x000000FF) == 0) return 3; - return 4; -} - -unsigned int getZeroByte64(uint64_t v) -{ - if ((v & 0xFF00000000000000) == 0) return 0; - if ((v & 0x00FF000000000000) == 0) return 1; - if ((v & 0x0000FF0000000000) == 0) return 2; - if ((v & 0x000000FF00000000) == 0) return 3; - if ((v & 0x00000000FF000000) == 0) return 4; - if ((v & 0x0000000000FF0000) == 0) return 5; - if ((v & 0x000000000000FF00) == 0) return 6; - if ((v & 0x00000000000000FF) == 0) return 7; - return 8; -} -*/ - uint32_t getPowerTwo32(uint32_t v) { - v--; + --v; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; - v++; - return v; + return ++v; } uint64_t getPowerTwo64(uint64_t v) { - v--; + --v; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v |= v >> 32; - v++; - return v; -} - -#define STRLEN_WRAPPER(TYPE) \ - register const TYPE *s = str; \ - while (*s != 0) s++; \ - return s - str; - -size_t Jupiter_strlen(const char *str) -{ - STRLEN_WRAPPER(char) -} - -size_t Jupiter_wstrlen(const wchar_t *str) -{ - STRLEN_WRAPPER(wchar_t) -} - -size_t Jupiter_strlen8(const uint8_t *str) -{ - STRLEN_WRAPPER(uint8_t) -} - -size_t Jupiter_strlen16(const uint16_t *str) -{ - STRLEN_WRAPPER(uint16_t) -} - -size_t Jupiter_strlen32(const uint32_t *str) -{ - STRLEN_WRAPPER(uint32_t) -} - -size_t Jupiter_strlen64(const uint64_t *str) -{ - STRLEN_WRAPPER(uint64_t) -} - -size_t Jupiter_vstrlen(const void *str, size_t size) -{ - const char *s; - const char *s2; - switch (size) - { - case 0: - return 0; - case 1: - return Jupiter_strlen((const char *)str); - case 2: - return Jupiter_strlen16((const uint16_t *)str); - case 4: - return Jupiter_strlen32((const uint32_t *)str); - case 8: - return Jupiter_strlen64((const uint64_t *)str); - default: - s = (const char *)str; - s2 = s; - while ((unsigned)(s2 - s) != size) - { - s2 = s; - while ((unsigned)(s2 - s) > size) - { - if (*s2 != 0) break; - s2++; - } - s += size; - } - return (s - (const char *)str) / size; - } -} - -const char *stristr(const char *str1, const char *str2) -{ - size_t i; - size_t a; - for (i = 0; str1[i] != 0; i++) - { - if (toupper(str1[i]) == toupper(str2[0])) - { - a = 1; - while (str2[a] != 0) - { - if (toupper(str1[i + a]) != toupper(str2[a])) break; - a++; - } - if (str2[a] == 0) - { - return str1 + i; - } - } - } - return NULL; -} - -bool streql(const char *s1, const char *s2) -{ - if (s1 == s2) return true; - while (*s1 != 0 && *s1 == *s2) - { - s1++; - s2++; - } - return (*s1 == *s2); -} - -bool streqli(const char *s1, const char *s2) -{ - if (s1 == s2) return true; - while (*s1 != 0 && toupper(*s1) == toupper(*s2)) - { - s1++; - s2++; - } - if (*s1 == *s2) return true; - return false; -} - -bool wstreql(const wchar_t *s1, const wchar_t *s2) -{ - if (s1 == s2) return true; - while (*s1 != 0 && *s1 == *s2) - { - s1++; - s2++; - } - return (*s1 == *s2); + return ++v; } -bool wstreqli(const wchar_t *s1, const wchar_t *s2) +bool containsSymbol(const char *str, char c) { - if (s1 == s2) return true; - while (*s1 != 0 && towupper(*s1) == towupper(*s2)) + while (*str != 0) { - s1++; - s2++; + if (*str == c) + return true; + ++str; } - if (*s1 == *s2) return true; return false; } -bool strmatch(const char *f, const char *s) +char *getTime() { - while (*f != 0) - { - if (*f == '*') - { - f++; - while (*f == '?') - { - if (*s == 0) return false; - f++; - s++; - } - if (*f == 0) return true; - if (*f == '*') continue; - while (*f != *s) - { - if (*s == 0) return false; - s++; - } - } - else if (*f != '?' && *f != *s) return false; - f++; - s++; - } - return *s == 0; + return getTimeFormat("%a %b %d %H:%M:%S %Y %Z"); } -bool strmatchi(const char *f, const char *s) +char *getTimeFormat(const char *format) { - int fUpper; - while (*f != 0) - { - if (*f == '*') - { - f++; - while (*f == '?') - { - if (*s == 0) return false; - f++; - s++; - } - if (*f == 0) return true; - if (*f == '*') continue; - fUpper = toupper(*f); - while (fUpper != toupper(*s)) - { - if (*s == 0) return false; - s++; - } - } - else if (*f != '?' && toupper(*f) != toupper(*s)) return false; - f++; - s++; - } - return *s == 0; + time_t rawtime = time(0); + static char rtime[256]; + strftime(rtime, sizeof(rtime), format, localtime(&rawtime)); + return rtime; } -bool wstrmatch(const wchar_t *f, const wchar_t *s) -{ - while (*f != 0) - { - if (*f == L'*') - { - f++; - while (*f == L'?') - { - if (*s == 0) return false; - f++; - s++; - } - if (*f == 0) return true; - if (*f == L'*') continue; - while (*f != *s) - { - if (*s == 0) return false; - s++; - } - } - else if (*f != L'?' && *f != *s) return false; - f++; - s++; - } - return *s == 0; -} +/** Character to integer conversion table */ -bool wstrmatchi(const wchar_t *f, const wchar_t *s) +const unsigned char base_table[] = { - wint_t fUpper; - while (*f != 0) - { - if (*f == L'*') - { - f++; - while (*f == L'?') - { - if (*s == 0) return false; - f++; - s++; - } - if (*f == 0) return true; - if (*f == L'*') continue; - fUpper = towupper(*f); - while (fUpper != towupper(*s)) - { - if (*s == 0) return false; - s++; - } - } - else if (*f != L'?' && towupper(*f) != towupper(*s)) return false; - f++; - s++; - } - return *s == 0; -} + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 127, 127, 127, 127, 127, 127, + 127, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 127, 127, 127, 127, 127, + 127, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 127, 127, 127, 127, 127, -char *charToChar(const char *a, int b, int c) -{ - char *r = (char *) malloc(sizeof(char) * (c-b+1)); - if (r != NULL) - { - int i = 0; - while (b < c) - { - r[i] = a[b]; - i++; - b++; - } - r[i] = 0; - } - else fprintf(stderr, "ERROR: UNABLE TO ALLOCATE IN %s" ENDL, __FUNCTION__); - return r; -} + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127 +}; -wchar_t *wcharToChar(const wchar_t *a, int b, int c) +const signed char hexadecimal_table[] = { - wchar_t *r = (wchar_t *)malloc(sizeof(wchar_t)* (c - b + 1)); - if (r != NULL) - { - int i = 0; - while (b < c) - { - r[i] = a[b]; - i++; - b++; - } - r[i] = 0; - } - else fprintf(stderr, "ERROR: UNABLE TO ALLOCATE IN %s" ENDL, __FUNCTION__); - return r; -} + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -void trim(char *str) -{ - int p = 0; - int x = 0; - int i; - while (str[p] != 0) - { - if (str[p] == 10) - { - str[p] = 0; - } - else if (str[p] == 13) - { - str[p] = 0; - } - p++; - } - for (i = 0; i < p; i++) - { - if (str[i] != 0) - { - str[x] = str[i]; - x++; - } - } - str[x] = 0; -} + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; -char *getWord(const char *str, int w) +const signed char decimal_table[] = { - char *result; - int x = 0; - int y; - int i; - for (i = 0; i < w; x++) - { - if (str[x] == 0) return NULL; - if (str[x] == ' ') i++; - } - for (y = x; str[y] != ' ' && str[y] != 0; y++); - result = (char *) malloc(sizeof(char) * (y-x+1)); - if (result != NULL) - { - for (i = 0; x < y; i++) - { - result[i] = str[x]; - x++; - } - result[i] = 0; - } - else fprintf(stderr, "ERROR: UNABLE TO ALLOCATE IN %s" ENDL, __FUNCTION__); - return result; -} + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -unsigned int countSymbol(const char *str, char c) -{ - unsigned int result = 0; - while(*str != 0) - { - if (*str == c) result++; - str++; - } - return result; -} + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; -unsigned int wordCount(const char *str) +const signed char octal_table[] = { - unsigned int result = 0; - int i; - for (i = 0; str[i] != 0; i++) - { - if (str[i] == ' ') - { - if (i > 0) - { - if (str[i-1] > ' ') result++; - } - } - else if (str[i+1] < ' ') result++; - } - return result; -} + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -unsigned int countLines(const char *str) -{ - unsigned int r = 0; - while (*str != 0) - { - if ((*str == '\r' && *(str + 1) != '\n') || *str == '\n') r++; - str++; - } - return r; -} - -char *getLine(const char *str, unsigned int l) -{ - char *result; - unsigned int x = 0; - unsigned int y; - unsigned int i; - for (i = 0; i < l; x++) - { - if (str[x] == 0) break; - if (str[x] == '\n' || (str[x] == '\r' && str[x+1] != '\n')) i++; - } - for (y = x; str[y] != '\r' && str[y] != '\n' && str[y] != 0; y++);// if (str[y] == 0) break; - result = (char *) malloc(sizeof(char) * (y-x+1)); - if (result != NULL) - { - for (i = 0; x < y; i++) - { - result[i] = str[x]; - x++; - } - result[i] = 0; - } - else fprintf(stderr, "ERROR: UNABLE TO ALLOCATE IN %s" ENDL, __FUNCTION__); - return result; -} + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; -int findSymbol(const char *str, char c, int pos) -{ - int r = 0; - int a = 0; - while (str[r] != 0) - { - if (str[r] == c) - { - if (a == pos) return r; - a++; - } - r++; - } - return -1; -} +/** Single character functions */ -bool containsSymbol(const char *str, char c) +bool Jupiter_isBase(unsigned char chr, int base) { - int i; - for (i = 0; str[i] != 0; i++) if (str[i] == c) return true; - return false; + return base_table[chr] < base; } -char *makestr(const char *str) +bool Jupiter_isHex(unsigned char chr) { - char *r; - size_t len; - if (str == NULL) return NULL; - len = Jupiter_strlen(str); - r = (char *) malloc(sizeof(char) * (len + 1)); - if (r != NULL) - { - r[len] = 0; - while (len != 0) - { - len--; - r[len] = str[len]; - } - return r; - } - return NULL; + return hexadecimal_table[chr] != -1; } -char *getTime() +bool Jupiter_isDecimal(unsigned char chr) { - return getTimeFormat("%a %b %d %H:%M:%S %Y %Z"); + return decimal_table[chr] != -1; } -char *getTimeFormat(const char *format) +bool Jupiter_isOctal(unsigned char chr) { - time_t rawtime = time(0); - static char rtime[256]; - strftime(rtime, sizeof(rtime), format, localtime(&rawtime)); - return rtime; + return octal_table[chr] != -1; } -/** Character to integer conversion table */ - -const unsigned char baseTable[] = +int Jupiter_getBase(unsigned char chr, int base) { - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 127, 127, 127, 127, 127, 127, - 127, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 127, 127, 127, 127, 127, - 127, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 127, 127, 127, 127, 127, - - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, -}; - -/** Single character functions */ - -bool Jupiter_isBase(unsigned char c, int base) -{ - return baseTable[c] < base; + chr = base_table[chr]; + if (chr < base) + return chr; + return -1; } -bool Jupiter_isHex(unsigned char c) +int Jupiter_getHex(unsigned char chr) { - return Jupiter_isBase(c, 16); + return hexadecimal_table[chr]; } -bool Jupiter_isDecimal(unsigned char c) +int Jupiter_getDecimal(unsigned char chr) { - return Jupiter_isBase(c, 10); + return decimal_table[chr]; } -int Jupiter_getBase(unsigned char c, int base) +int Jupiter_getOctal(unsigned char chr) { - c = baseTable[c]; - if (c < base) return c; - return -1; + return octal_table[chr]; } /** Unsafe string converters */ int Jupiter_strtoi(const char *str, int base) { - while (isspace(*str)) str++; + while (isspace(*str)) + ++str; return Jupiter_strtoi_nospace(str, base); } long long Jupiter_strtoll(const char *str, int base) { - while (isspace(*str)) str++; + while (isspace(*str)) + ++str; return Jupiter_strtoll_nospace(str, base); } unsigned int Jupiter_strtoui(const char *str, int base) { - while (isspace(*str)) str++; + while (isspace(*str)) + ++str; return Jupiter_strtoui_nospace(str, base); } unsigned long long Jupiter_strtoull(const char *str, int base) { - while (isspace(*str)) str++; + while (isspace(*str)) + ++str; return Jupiter_strtoull_nospace(str, base); } double Jupiter_strtod(const char *str) { - while (isspace(*str)) str++; + while (isspace(*str)) + ++str; return Jupiter_strtod_nospace(str); } @@ -651,25 +222,27 @@ unsigned int Jupiter_strtoui_nospace(const char *str, int base) { unsigned int total = 0; int tval; - if (*str == '-') return Jupiter_strtoi_nospace(str, base); - if (*str == '+') str++; + if (*str == '-') + return Jupiter_strtoi_nospace(str, base); + + if (*str == '+') + ++str; if (base == 0) // Guess a base. { if (*str == '0') { - str++; - switch (*str) + switch (*++str) { case 'X': case 'x': - str++; + ++str; base = 16; break; case 'B': case 'b': - str++; + ++str; base = 2; break; default: @@ -683,15 +256,16 @@ unsigned int Jupiter_strtoui_nospace(const char *str, int base) { if (*str == '0') { - str++; - if (*str == 'x' || *str == 'X') str++; + ++str; + if (*str == 'x' || *str == 'X') + ++str; } } while ((tval = Jupiter_getBase(*str, base)) != -1) { total = base * total + tval; - str++; + ++str; } return total; @@ -701,25 +275,27 @@ unsigned long long Jupiter_strtoull_nospace(const char *str, int base) { unsigned long long total = 0; int tval; - if (*str == '-') return Jupiter_strtoi_nospace(str, base); - if (*str == '+') str++; + if (*str == '-') + return Jupiter_strtoi_nospace(str, base); + + if (*str == '+') + ++str; if (base == 0) // Guess a base. { if (*str == '0') { - str++; - switch (*str) + switch (*++str) { case 'X': case 'x': - str++; + ++str; base = 16; break; case 'B': case 'b': - str++; + ++str; base = 2; break; default: @@ -733,15 +309,16 @@ unsigned long long Jupiter_strtoull_nospace(const char *str, int base) { if (*str == '0') { - str++; - if (*str == 'x' || *str == 'X') str++; + ++str; + if (*str == 'x' || *str == 'X') + ++str; } } while ((tval = Jupiter_getBase(*str, base)) != -1) { total = base * total + tval; - str++; + ++str; } return total; @@ -754,23 +331,26 @@ double Jupiter_strtod_nospace(const char *str) double decimal = 0.0; int tval; - if (*str == '-') return -1 * Jupiter_strtod_nospace(++str); - if (*str == '+') str++; + if (*str == '-') + return -1 * Jupiter_strtod_nospace(++str); + + if (*str == '+') + ++str; while ((tval = Jupiter_getBase(*str, base)) != -1) { total = base * total + tval; - str++; + ++str; } if (*str == '.') { - str++; + ++str; tval = base; while ((decimal = Jupiter_getBase(*str, base)) != -1) { total = total + (decimal / tval); - str++; + ++str; tval = tval * base; } if (*str == 'e' || *str == 'E') @@ -785,57 +365,51 @@ double Jupiter_strtod_nospace(const char *str) int Jupiter_strtoi_s(const char *str, size_t length, int base) { while (length != 0 && isspace(*str)) - { - str++; - length--; - } + ++str, --length; + return Jupiter_strtoi_nospace_s(str, length, base); } long long Jupiter_strtoll_s(const char *str, size_t length, int base) { while (length != 0 && isspace(*str)) - { - str++; - length--; - } + ++str, --length; + return Jupiter_strtoll_nospace_s(str, length, base); } unsigned int Jupiter_strtoui_s(const char *str, size_t length, int base) { while (length != 0 && isspace(*str)) - { - str++; - length--; - } + ++str, --length; + return Jupiter_strtoui_nospace_s(str, length, base); } unsigned long long Jupiter_strtoull_s(const char *str, size_t length, int base) { while (length != 0 && isspace(*str)) - { - str++; - length--; - } + ++str, --length; + return Jupiter_strtoull_nospace_s(str, length, base); } double Jupiter_strtod_s(const char *str, size_t length) { while (length != 0 && isspace(*str)) - { - str++; - length--; - } + ++str, --length; + return Jupiter_strtod_nospace_s(str, length); } int Jupiter_strtoi_nospace_s(const char *str, size_t length, int base) { - if (length == 0) return 0; - if (*str != '-') return Jupiter_strtoui_nospace_s(str, length, base); + if (length == 0) + return 0; + + if (*str != '-') + return Jupiter_strtoui_nospace_s(str, length, base); + return -1 * Jupiter_strtoui_nospace_s(++str, --length, base); } @@ -843,35 +417,48 @@ unsigned int Jupiter_strtoui_nospace_s(const char *str, size_t length, int base) { unsigned int total = 0; int tval; - if (length == 0) return total; - if (*str == '-') return Jupiter_strtoi_nospace(str, base); + + if (length == 0) + return total; + + if (*str == '-') + return Jupiter_strtoi_nospace(str, base); if (*str == '+') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; } if (base == 0) // Guess a base. { if (*str == '0') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; switch (*str) { case 'X': case 'x': - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; base = 16; break; + case 'B': case 'b': - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; base = 2; break; + default: base = 8; break; @@ -883,12 +470,14 @@ unsigned int Jupiter_strtoui_nospace_s(const char *str, size_t length, int base) { if (*str == '0') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; if (*str == 'x' || *str == 'X') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; } } } @@ -896,8 +485,9 @@ unsigned int Jupiter_strtoui_nospace_s(const char *str, size_t length, int base) while ((tval = Jupiter_getBase(*str, base)) != -1) { total = base * total + tval; - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; } return total; @@ -914,33 +504,44 @@ unsigned long long Jupiter_strtoull_nospace_s(const char *str, size_t length, in { unsigned long long total = 0; int tval; - if (length == 0) return total; - if (*str == '-') return Jupiter_strtoi_nospace(str, base); + + if (length == 0) + return total; + + if (*str == '-') + return Jupiter_strtoi_nospace(str, base); if (*str == '+') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; } if (base == 0) // Guess a base. { if (*str == '0') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; switch (*str) { case 'X': case 'x': - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; base = 16; break; case 'B': case 'b': - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; base = 2; break; default: @@ -954,12 +555,16 @@ unsigned long long Jupiter_strtoull_nospace_s(const char *str, size_t length, in { if (*str == '0') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; if (*str == 'x' || *str == 'X') { - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + + ++str; } } } @@ -967,8 +572,9 @@ unsigned long long Jupiter_strtoull_nospace_s(const char *str, size_t length, in while ((tval = Jupiter_getBase(*str, base)) != -1) { total = base * total + tval; - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; } return total; @@ -981,31 +587,35 @@ double Jupiter_strtod_nospace_s(const char *str, size_t length) double decimal = 0.0; int tval; - if (length == 0) return 0; - if (*str == '-') return -1 * Jupiter_strtod_nospace_s(++str, --length); + if (length == 0) + return 0; + + if (*str == '-') + return -1 * Jupiter_strtod_nospace_s(++str, --length); + if (*str == '+') - { - str++; - length--; - } + ++str, --length; while ((tval = Jupiter_getBase(*str, base)) != -1) { total = base * total + tval; - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; } if (*str == '.') { - str++; - length--; + ++str; + --length; + tval = base; while (length != 0 && (decimal = Jupiter_getBase(*str, base)) != -1) { total = total + (decimal / tval); - if (--length == 0) return total; - str++; + if (--length == 0) + return total; + ++str; tval = tval * base; } if (*str == 'e' || *str == 'E') @@ -1030,17 +640,17 @@ const uint32_t bitmask_table[] = 0xFFFFFFFFU }; -const unsigned char *netmask_table[] = -{ - "\x00\x00\x00\x00", "\x80\x00\x00\x00", "\xC0\x00\x00\x00", "\xE0\x00\x00\x00", - "\xF0\x00\x00\x00", "\xF8\x00\x00\x00", "\xFC\x00\x00\x00", "\xFE\x00\x00\x00", - "\xFF\x00\x00\x00", "\xFF\x80\x00\x00", "\xFF\xC0\x00\x00", "\xFF\xE0\x00\x00", - "\xFF\xF0\x00\x00", "\xFF\xF8\x00\x00", "\xFF\xFC\x00\x00", "\xFF\xFE\x00\x00", - "\xFF\xFF\x00\x00", "\xFF\xFF\x80\x00", "\xFF\xFF\xC0\x00", "\xFF\xFF\xE0\x00", - "\xFF\xFF\xF0\x00", "\xFF\xFF\xF8\x00", "\xFF\xFF\xFC\x00", "\xFF\xFF\xFE\x00", - "\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x80", "\xFF\xFF\xFF\xC0", "\xFF\xFF\xFF\xE0", - "\xFF\xFF\xFF\xF0", "\xFF\xFF\xFF\xF8", "\xFF\xFF\xFF\xFC", "\xFF\xFF\xFF\xFE", - "\xFF\xFF\xFF\xFF" +const uint8_t netmask_table[][4] = +{ + { 0x00, 0x00, 0x00, 0x00 }, { 0x80, 0x00, 0x00, 0x00 }, { 0xC0, 0x00, 0x00, 0x00 }, { 0xE0, 0x00, 0x00, 0x00 }, + { 0xF0, 0x00, 0x00, 0x00 }, { 0xF8, 0x00, 0x00, 0x00 }, { 0xFC, 0x00, 0x00, 0x00 }, { 0xFE, 0x00, 0x00, 0x00 }, + { 0xFF, 0x00, 0x00, 0x00 }, { 0xFF, 0x80, 0x00, 0x00 }, { 0xFF, 0xC0, 0x00, 0x00 }, { 0xFF, 0xE0, 0x00, 0x00 }, + { 0xFF, 0xF0, 0x00, 0x00 }, { 0xFF, 0xF8, 0x00, 0x00 }, { 0xFF, 0xFC, 0x00, 0x00 }, { 0xFF, 0xFE, 0x00, 0x00 }, + { 0xFF, 0xFF, 0x00, 0x00 }, { 0xFF, 0xFF, 0x80, 0x00 }, { 0xFF, 0xFF, 0xC0, 0x00 }, { 0xFF, 0xFF, 0xE0, 0x00 }, + { 0xFF, 0xFF, 0xF0, 0x00 }, { 0xFF, 0xFF, 0xF8, 0x00 }, { 0xFF, 0xFF, 0xFC, 0x00 }, { 0xFF, 0xFF, 0xFE, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x80 }, { 0xFF, 0xFF, 0xFF, 0xC0 }, { 0xFF, 0xFF, 0xFF, 0xE0 }, + { 0xFF, 0xFF, 0xFF, 0xF0 }, { 0xFF, 0xFF, 0xFF, 0xF8 }, { 0xFF, 0xFF, 0xFF, 0xFC }, { 0xFF, 0xFF, 0xFF, 0xFE }, + { 0xFF, 0xFF, 0xFF, 0xFF } }; uint32_t Jupiter_prefix_length_to_bitmask(uint8_t prefix_length) diff --git a/Jupiter/Functions.h b/Jupiter/Functions.h index dd3bb5e..d19afa0 100644 --- a/Jupiter/Functions.h +++ b/Jupiter/Functions.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -74,7 +74,7 @@ namespace Jupiter * @return Pointer to the first instance of a character in str2 being in str1, or nullptr if there is none. */ template inline const T *strpbrk(const T *str1, const T *str2); - template inline const T *strpbrk(const T *str1, const T str2); + template inline const T *strpbrk(const T *str, const T element); /** * @brief Checks if two strings are equal. @@ -94,183 +94,6 @@ extern "C" #include #endif // __cplusplus -/** -* @brief Case insensitive version of strstr(). -* -* @param str1 String to be scanned. -* @param str2 String to be matched. -* @return Pointer to the first occurance of str2 in str1 if it exists, NULL otherwise. -*/ -JUPITER_API const char *stristr(const char *str1, const char *str2); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_strlen(const char *str); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_wstrlen(const wchar_t *str); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_strlen8(const uint8_t *str); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_strlen16(const uint16_t *str); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_strlen32(const uint32_t *str); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_strlen64(const uint64_t *str); - -/** -* @brief Returns the length of a C-style string. -* -* @param str C-style string to get the length of. -* @return Length of the C-style string. -*/ -JUPITER_API size_t Jupiter_vstrlen(const void *str, size_t size); - -/** -* @brief Checks if two strings are equal. This function is case-sensitive. -* -* @param str1 String to be compared. -* @param str2 String to be compared. -* @return True if the strings are equal, false otherwise. -*/ -JUPITER_API bool streql(const char *str1, const char *str2); -JUPITER_API bool wstreql(const wchar_t *str1, const wchar_t *str2); - -/** -* @brief Checks if two strings are equal. This function is not case-sensitive. -* -* @param str1 String to be compared. -* @param str2 String to be compared. -* @return True if the strings are equal, false otherwise. -*/ -JUPITER_API bool streqli(const char *str1, const char *str2); -JUPITER_API bool wstreqli(const wchar_t *str1, const wchar_t *str2); - -/** -* @brief Checks if a string matches a wildcard format. -* Note: Case sensitive. -* -* @param format Sring containing the wildcard format information. -* @param str2 String to be compared. -* @return True if the string matches the wildcard format, false otherwise. -*/ -JUPITER_API bool strmatch(const char *format, const char *str); -JUPITER_API bool wstrmatch(const wchar_t *format, const wchar_t *str); - -/** -* @brief Checks if a string matches a wildcard format. -* Note: Case insensitive. -* -* @param format Sring containing the wildcard format information. -* @param str2 String to be compared. -* @return True if the string matches the wildcard format, false otherwise. -*/ -JUPITER_API bool strmatchi(const char *format, const char *str); -JUPITER_API bool wstrmatchi(const wchar_t *format, const wchar_t *str); - -/** -* @brief Returns a copy of a substring. -* -* @param str String -* @param a String to be compared. -* @param b String to be compared. -* @return String containing the substring, or NULL on malloc failure. -*/ -JUPITER_API char *charToChar(const char *str, int a, int b); -JUPITER_API wchar_t *wcharToChar(const wchar_t *str, int a, int b); - -/** -* @brief Removes any carriage-returns (\r) and new lines (\n) from a string. -* -* @param str String to be trimed. -*/ -JUPITER_API void trim(char *str); - -/** -* @brief Returns a copy of a "word" from a string. -* -* @param str String to be parsed. -* @param w Position of the word, starting at 0. -* @return String containing the word on success, or NULL otherwise. -*/ -JUPITER_API char *getWord(const char *str, int w); - -/** -* @brief Returns the number of occurances of a given character. -* -* @param str String to be scanned. -* @param c Character to be counted. -* @return Total number of occurances of a character in a string. -*/ -JUPITER_API unsigned int countSymbol(const char *str, char c); - -/** -* @brief Returns the number of space-deliminated words in a string. -* -* @param str String to be scanned. -* @return Total number of space-deliminated words in a string. -*/ -JUPITER_API unsigned int wordCount(const char *str); - -/** -* @brief Returns the number of newlines in a string. -* -* @param str String to be scanned. -* @return Total number of newlines in a string. -*/ -JUPITER_API unsigned int countLines(const char *str); - -/** -* @brief Returns a substring in the form of a new String, -* -* @param str String to be scanned. -* @return String representing a single line of the input string on success, NULL otherwise. -*/ -JUPITER_API char *getLine(const char *str, unsigned int l); - -/** -* @brief Returns the position of the n'th occurance of a character in a string. -* -* @param str String to be scanned. -* @param c Character to find. -* @param n Position of the character to search for. -* @return Position of the n'th occurance of a character if it exists, -1 otherwise. -*/ -JUPITER_API int findSymbol(const char *str, char c, int n); - /** * @brief Checks if a character exists in a string. * @@ -279,14 +102,6 @@ JUPITER_API int findSymbol(const char *str, char c, int n); */ JUPITER_API bool containsSymbol(const char *str, char c); -/** -* @brief Creates a copy of a string. -* -* @param str String to copy. -* @return String containing a copy of the input string on success, NULL otherwise. -*/ -JUPITER_API char *makestr(const char *str); - /** * @brief Returns the current time in a string format. * This will vary depending on locale. @@ -332,7 +147,7 @@ JUPITER_API uint64_t getPowerTwo64(uint64_t number); * @param c Character to check. * @return True if the character is a hexadecimal digit, false otherwise. */ -JUPITER_API bool Jupiter_isBase(unsigned char c, int base); +JUPITER_API bool Jupiter_isBase(unsigned char chr, int base); /** * @brief Checks if a character is a hexadecimal digit character. (base 16) @@ -340,7 +155,7 @@ JUPITER_API bool Jupiter_isBase(unsigned char c, int base); * @param c Character to check. * @return True if the character is a hexadecimal digit, false otherwise. */ -JUPITER_API bool Jupiter_isHex(unsigned char c); +JUPITER_API bool Jupiter_isHex(unsigned char chr); /** * @brief Checks if a character is a decimal digit character. (base 10) @@ -348,7 +163,15 @@ JUPITER_API bool Jupiter_isHex(unsigned char c); * @param c Character to check. * @return True if the character is a decimal digit, false otherwise. */ -JUPITER_API bool Jupiter_isDecimal(unsigned char c); +JUPITER_API bool Jupiter_isDecimal(unsigned char chr); + +/** +* @brief Checks if a character is an octal digit character. (base 10) +* +* @param c Character to check. +* @return True if the character is a octal digit, false otherwise. +*/ +JUPITER_API bool Jupiter_isOctal(unsigned char chr); /** * @brief Fetches a character's represented integral value. @@ -358,7 +181,31 @@ JUPITER_API bool Jupiter_isDecimal(unsigned char c); * @param base Base of the representation. * @return A character's represented integral value on success, -1 otherwise. */ -JUPITER_API int Jupiter_getBase(unsigned char c, int base); +JUPITER_API int Jupiter_getBase(unsigned char chr, int base); + +/** +* @brief Fetches a hexadecimal character's represented integral value. (base 16) +* +* @param c Character to fetch value of. +* @return A character's represented integral value on success, -1 otherwise. +*/ +JUPITER_API int Jupiter_getHex(unsigned char chr); + +/** +* @brief Fetches a decimal character's represented integral value. (base 10) +* +* @param c Character to fetch value of. +* @return A character's represented integral value on success, -1 otherwise. +*/ +JUPITER_API int Jupiter_getDecimal(unsigned char chr); + +/** +* @brief Fetches a octal character's represented integral value. (base 8) +* +* @param c Character to fetch value of. +* @return A character's represented integral value on success, -1 otherwise. +*/ +JUPITER_API int Jupiter_getOctal(unsigned char chr); /** * @brief Interprets a string into an integer. @@ -474,20 +321,20 @@ JUPITER_API uint32_t Jupiter_prefix_length_to_netmask(uint8_t prefix_length); /** strlen implementation */ template inline size_t Jupiter::strlen(const T *str) { - register const T *s = str; - while (*s != 0) s++; + const T *s = str; + while (*s != 0) + ++s; return s - str; } /** strcpy implementation */ template inline T *Jupiter::strcpy(T *dest, const T *source) { - register T *d = dest; + T *d = dest; while (*source != 0) { *d = *source; - d++; - source++; + ++d, ++source; } *d = *source; return dest; @@ -499,7 +346,7 @@ template inline T *Jupiter::strcpy(T *dest, const T *source, size_t dest[length] = 0; while (length > 0) { - length--; + --length; dest[length] = source[length]; } return dest; @@ -513,32 +360,32 @@ template inline const T *Jupiter::strpbrk(const T *str1, const T *st s = str2; while (*s != 0) { - if (*str1 == *s) return str1; - s++; + if (*str1 == *s) + return str1; + ++s; } - str1++; + ++str1; } return nullptr; } -template inline const T *Jupiter::strpbrk(const T *str1, const T e) +template inline const T *Jupiter::strpbrk(const T *str, const T element) { - while (*str1 != 0) + while (*str != 0) { - if (*str1 == e) return str1; - str1++; + if (*str == element) + return str; + ++str; } return nullptr; } template inline bool Jupiter::streql(const T *str1, const T *str2) { - if (str1 == str2) return true; + if (str1 == str2) + return true; while (*str1 != 0 && *str1 == *str2) - { - str1++; - str2++; - } + ++str1, ++str2; return (*str1 == *str2); } diff --git a/Jupiter/IRC_Client.cpp b/Jupiter/IRC_Client.cpp index bbec229..dc4e6d4 100644 --- a/Jupiter/IRC_Client.cpp +++ b/Jupiter/IRC_Client.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above diff --git a/Jupiter/String_Type_Imp.h b/Jupiter/String_Type_Imp.h index 89da0c2..67043b2 100644 --- a/Jupiter/String_Type_Imp.h +++ b/Jupiter/String_Type_Imp.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014-2015 Jessica James. + * Copyright (C) 2014-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -187,24 +187,24 @@ template<> inline void Jupiter::String_Type::processEscapeSequences() case '1': case '2': case '3': - if (index + 1 != Jupiter::String_Type::length && Jupiter_isBase(this->get(index + 1), 8)) + if (index + 1 != Jupiter::String_Type::length && Jupiter_isOctal(this->get(index + 1))) { - if (index + 2 != Jupiter::String_Type::length && Jupiter_isBase(this->get(index + 2), 8)) - this->replace(index - 1, 4, static_cast(Jupiter_getBase(this->get(index), 8)) << 6 | static_cast(Jupiter_getBase(this->get(index + 1), 8)) << 3 | static_cast(Jupiter_getBase(this->get(index + 2), 8))); + if (index + 2 != Jupiter::String_Type::length && Jupiter_isOctal(this->get(index + 2))) + this->replace(index - 1, 4, static_cast(Jupiter_getOctal(this->get(index))) << 6 | static_cast(Jupiter_getOctal(this->get(index + 1))) << 3 | static_cast(Jupiter_getOctal(this->get(index + 2)))); else - this->replace(index - 1, 3, static_cast(Jupiter_getBase(this->get(index), 8)) << 3 | static_cast(Jupiter_getBase(this->get(index + 1), 8))); + this->replace(index - 1, 3, static_cast(Jupiter_getOctal(this->get(index))) << 3 | static_cast(Jupiter_getOctal(this->get(index + 1)))); } else - this->replace(index - 1, 2, static_cast(Jupiter_getBase(this->get(index), 8))); + this->replace(index - 1, 2, static_cast(Jupiter_getOctal(this->get(index)))); break; case '4': case '5': case '6': case '7': - if (index + 1 != Jupiter::String_Type::length && Jupiter_isBase(this->get(index + 1), 8)) - this->replace(index - 1, 3, static_cast(Jupiter_getBase(this->get(index), 8)) << 3 | static_cast(Jupiter_getBase(this->get(index + 1), 8))); + if (index + 1 != Jupiter::String_Type::length && Jupiter_isOctal(this->get(index + 1))) + this->replace(index - 1, 3, static_cast(Jupiter_getOctal(this->get(index))) << 3 | static_cast(Jupiter_getOctal(this->get(index + 1)))); else - this->replace(index - 1, 2, static_cast(Jupiter_getBase(this->get(index), 8))); + this->replace(index - 1, 2, static_cast(Jupiter_getOctal(this->get(index)))); break; case 'a': this->replace(index - 1, 2, '\a'); @@ -241,20 +241,20 @@ template<> inline void Jupiter::String_Type::processEscapeSequences() break; case 'x': if (Jupiter::String_Type::length >= index + 2 - && Jupiter_isBase(this->get(index + 1), 16) && Jupiter_isBase(this->get(index + 2), 16)) - this->replace(index - 1, 4, static_cast(Jupiter_getBase(this->get(index + 1), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 2), 16))); + && Jupiter_isHex(this->get(index + 1)) && Jupiter_isHex(this->get(index + 2))) + this->replace(index - 1, 4, static_cast(Jupiter_getHex(this->get(index + 1))) << 4 | static_cast(Jupiter_getHex(this->get(index + 2)))); break; case 'U': if (Jupiter::String_Type::length >= index + 8 - && Jupiter_isBase(this->get(index + 1), 16) && Jupiter_isBase(this->get(index + 2), 16) && Jupiter_isBase(this->get(index + 3), 16) && Jupiter_isBase(this->get(index + 4), 16) && Jupiter_isBase(this->get(index + 5), 16) && Jupiter_isBase(this->get(index + 6), 16) && Jupiter_isBase(this->get(index + 7), 16) && Jupiter_isBase(this->get(index + 8), 16)) + && Jupiter_isHex(this->get(index + 1)) && Jupiter_isHex(this->get(index + 2)) && Jupiter_isHex(this->get(index + 3)) && Jupiter_isHex(this->get(index + 4)) && Jupiter_isHex(this->get(index + 5)) && Jupiter_isHex(this->get(index + 6)) && Jupiter_isHex(this->get(index + 7)) && Jupiter_isHex(this->get(index + 8))) { - uint32_t codepoint = static_cast(Jupiter_getBase(this->get(index + 1), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 2), 16)); + uint32_t codepoint = static_cast(Jupiter_getHex(this->get(index + 1))) << 4 | static_cast(Jupiter_getHex(this->get(index + 2))); codepoint <<= 8; - codepoint |= static_cast(Jupiter_getBase(this->get(index + 3), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 4), 16)); + codepoint |= static_cast(Jupiter_getHex(this->get(index + 3))) << 4 | static_cast(Jupiter_getHex(this->get(index + 4))); codepoint <<= 8; - codepoint |= static_cast(Jupiter_getBase(this->get(index + 5), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 6), 16)); + codepoint |= static_cast(Jupiter_getHex(this->get(index + 5))) << 4 | static_cast(Jupiter_getHex(this->get(index + 6))); codepoint <<= 8; - codepoint |= static_cast(Jupiter_getBase(this->get(index + 7), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 8), 16)); + codepoint |= static_cast(Jupiter_getHex(this->get(index + 7))) << 4 | static_cast(Jupiter_getHex(this->get(index + 8))); if (codepoint <= 0x007F) this->replace(index - 1, 10, static_cast(codepoint)); else if (codepoint <= 0x07FF) @@ -288,11 +288,11 @@ template<> inline void Jupiter::String_Type::processEscapeSequences() break; case 'u': if (Jupiter::String_Type::length >= index + 4 - && Jupiter_isBase(this->get(index + 1), 16) && Jupiter_isBase(this->get(index + 2), 16) && Jupiter_isBase(this->get(index + 3), 16) && Jupiter_isBase(this->get(index + 4), 16)) + && Jupiter_isHex(this->get(index + 1)) && Jupiter_isHex(this->get(index + 2)) && Jupiter_isHex(this->get(index + 3)) && Jupiter_isHex(this->get(index + 4))) { - uint16_t codepoint = static_cast(Jupiter_getBase(this->get(index + 1), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 2), 16)); + uint16_t codepoint = static_cast(Jupiter_getHex(this->get(index + 1))) << 4 | static_cast(Jupiter_getHex(this->get(index + 2))); codepoint <<= 8; - codepoint |= static_cast(Jupiter_getBase(this->get(index + 3), 16)) << 4 | static_cast(Jupiter_getBase(this->get(index + 4), 16)); + codepoint |= static_cast(Jupiter_getHex(this->get(index + 3))) << 4 | static_cast(Jupiter_getHex(this->get(index + 4))); if (codepoint <= 0x007F) this->replace(index - 1, 6, static_cast(codepoint)); else if (codepoint <= 0x07FF) diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 8a5873af9cbf989e5e0d6b680380348d4ff7ac95..67f940e93bb916a30e958e1b2877d725a749411f 100644 GIT binary patch delta 36605 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

cuG+(Al?Jx@S}HbOR5JSI$9A70_849njQnQ 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

BBPk=Q)Q#H1HW*__O0cYr2JXnE$-&Wx3#h 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 YD$R=EP%R&z9zx;&C!)%L;lt_w1A#0uuK)l5