123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- /* Copyright (C) 2016 Jeremiah Orians
- * This file is part of M2-Planet.
- *
- * M2-Planet 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.
- *
- * M2-Planet 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 M2-Planet. If not, see <http://www.gnu.org/licenses/>.
- */
- #include <stdio.h>
- #include <stdlib.h>
- #define TRUE 1
- #define FALSE 0
- void require(int bool, char* error)
- {
- if(!bool)
- {
- fputs(error, stderr);
- exit(EXIT_FAILURE);
- }
- }
- int match(char* a, char* b)
- {
- if((NULL == a) && (NULL == b)) return TRUE;
- if(NULL == a) return FALSE;
- if(NULL == b) return FALSE;
- int i = -1;
- do
- {
- i = i + 1;
- if(a[i] != b[i])
- {
- return FALSE;
- }
- } while((0 != a[i]) && (0 !=b[i]));
- return TRUE;
- }
- int in_set(int c, char* s)
- {
- /* NULL set is always false */
- if(NULL == s) return FALSE;
- while(0 != s[0])
- {
- if(c == s[0]) return TRUE;
- s = s + 1;
- }
- return FALSE;
- }
- /* INTERNAL ONLY */
- int __index_number(char* s, char c)
- {
- int i = 0;
- while(s[i] != c)
- {
- i = i + 1;
- if(0 == s[i]) return -1;
- }
- return i;
- }
- /* INTERNAL ONLY */
- int __toupper(int c)
- {
- if(in_set(c, "abcdefghijklmnopqrstuvwxyz")) return (c & 0xDF);
- return c;
- }
- /* INTERNAL ONLY */
- int __set_reader(char* set, int mult, char* input)
- {
- int n = 0;
- int i = 0;
- int hold;
- int negative_p = FALSE;
- if(input[0] == '-')
- {
- negative_p = TRUE;
- i = i + 1;
- }
- while(in_set(input[i], set))
- {
- if('_' == input[i])
- {
- i = i + 1;
- continue;
- }
- n = n * mult;
- hold = __index_number(set, __toupper(input[i]));
- /* Input managed to change between in_set and index_number */
- if(-1 == hold) return 0;
- n = n + hold;
- i = i + 1;
- }
- /* loop exited before NULL and thus invalid input */
- if(0 != input[i]) return 0;
- if(negative_p)
- {
- n = 0 - n;
- }
- return n;
- }
- int strtoint(char *a)
- {
- int result = 0;
- /* If NULL string */
- if(0 == a[0])
- {
- result = 0;
- }
- /* Deal with binary */
- else if ('0' == a[0] && 'b' == a[1])
- {
- result = __set_reader("01_", 2, a+2);
- }
- /* Deal with hex */
- else if ('0' == a[0] && 'x' == a[1])
- {
- result = __set_reader("0123456789ABCDEFabcdef_", 16, a+2);
- }
- /* Deal with octal */
- else if('0' == a[0])
- {
- result = __set_reader("01234567_", 8, a+1);
- }
- /* Deal with decimal */
- else
- {
- result = __set_reader("0123456789_", 10, a);
- }
- /* Deal with sign extension for 64bit hosts */
- if(0 != (0x80000000 & result)) result = (0xFFFFFFFF << 31) | result;
- return result;
- }
- char* int2str(int x, int base, int signed_p)
- {
- require(1 < base, "int2str doesn't support a base less than 2\n");
- require(37 > base, "int2str doesn't support a base more than 36\n");
- /* Be overly conservative and save space for 32binary digits and padding null */
- char* p = calloc(34, sizeof(char));
- /* if calloc fails return null to let calling code deal with it */
- if(NULL == p) return p;
- p = p + 32;
- unsigned i;
- int sign_p = FALSE;
- char* table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
- if(signed_p && (10 == base) && (0 != (x & 0x80000000)))
- {
- /* Truncate to 31bits */
- i = -x & 0x7FFFFFFF;
- if(0 == i) return "-2147483648";
- sign_p = TRUE;
- } /* Truncate to 32bits */
- else i = x & (0x7FFFFFFF | (1 << 31));
- do
- {
- p[0] = table[i % base];
- p = p - 1;
- i = i / base;
- } while(0 < i);
- if(sign_p)
- {
- p[0] = '-';
- p = p - 1;
- }
- return p + 1;
- }
|