//Unless what else is individually marked, all code in this file is //Copyright 2015 <>< Charles Lohr Under the MIT/x11 License, NewBSD License or // ColorChord License. You Choose. #include "mystuff.h" const char * enctypes[6] = { "open", "wep", "wpa", "wpa2", "wpa_wpa2", 0 }; char generic_print_buffer[384]; char generic_buffer[1500]; char * generic_ptr; int32 my_atoi( const char * in ) { int positive = 1; //1 if negative. int hit = 0; int val = 0; while( *in && hit < 11 ) { if( *in == '-' ) { if( positive == -1 ) return val*positive; positive = -1; } else if( *in >= '0' && *in <= '9' ) { val *= 10; val += *in - '0'; hit++; } else if (!hit && ( *in == ' ' || *in == '\t' ) ) { //okay } else { //bad. return val*positive; } in++; } return val*positive; } void Uint32To10Str( char * out, uint32 dat ) { int tens = 1000000000; int val; int place = 0; while( tens > 1 ) { if( dat/tens ) break; tens/=10; } while( tens ) { val = dat/tens; dat -= val*tens; tens /= 10; out[place++] = val + '0'; } out[place] = 0; } char tohex1( uint8_t i ) { i = i&0x0f; return (i<10)?('0'+i):('a'-10+i); } void ICACHE_FLASH_ATTR EndTCPWrite( struct espconn * conn ) { if(generic_ptr!=generic_buffer) espconn_sent(conn,generic_buffer,generic_ptr-generic_buffer); } void PushString( const char * buffer ) { char c; while( c = *(buffer++) ) PushByte( c ); } void PushBlob( const uint8 * buffer, int len ) { int i; for( i = 0; i < len; i++ ) PushByte( buffer[i] ); } int8_t TCPCanSend( struct espconn * conn, int size ) { struct espconn_packet infoarg; sint8 r = espconn_get_packet_info(conn, &infoarg); if( infoarg.snd_buf_size >= size && infoarg.snd_queuelen > 0 ) return 1; else return 0; } int8_t ICACHE_FLASH_ATTR TCPDoneSend( struct espconn * conn ) { return conn->state == ESPCONN_CONNECT; } const char * ICACHE_FLASH_ATTR my_strchr( const char * st, char c ) { while( *st && *st != c ) st++; if( !*st ) return 0; return st; } int ICACHE_FLASH_ATTR ColonsToInts( const char * str, int32_t * vals, int max_quantity ) { int i; for( i = 0; i < max_quantity; i++ ) { const char * colon = my_strchr( str, ':' ); vals[i] = my_atoi( str ); if( !colon ) break; str = colon+1; } return i+1; } //from http://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c static const char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; static const int mod_table[] = {0, 2, 1}; void ICACHE_FLASH_ATTR my_base64_encode(const unsigned char *data, size_t input_length, uint8_t * encoded_data ) { int i, j; int output_length = 4 * ((input_length + 2) / 3); if( !encoded_data ) return; if( !data ) { encoded_data[0] = '='; encoded_data[1] = 0; return; } for (i = 0, j = 0; i < input_length; ) { uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0; uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0; uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F]; encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F]; } for (i = 0; i < mod_table[input_length % 3]; i++) encoded_data[output_length - 1 - i] = '='; encoded_data[j] = 0; }