websocket: move ws example to examples folder (#5875)
							parent
							
								
									303b65c0b9
								
							
						
					
					
						commit
						6dbc143d67
					
				|  | @ -8,10 +8,6 @@ const ( | |||
| 	eb = eventbus.new() | ||||
| ) | ||||
| 
 | ||||
| #flag -I @VROOT/vlib/net/websocket/examples | ||||
| #include "utf8.h" | ||||
| fn C.utf8_validate_str() bool | ||||
| 
 | ||||
| fn main() { | ||||
| 	// println(sss)
 | ||||
| 	/* | ||||
|  | @ -1,166 +0,0 @@ | |||
| /*
 | ||||
|    Copyright (c) 2015, Andreas Fett | ||||
|    All rights reserved. | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions are met: | ||||
|    * Redistributions of source code must retain the above copyright notice, this | ||||
|      list of conditions and the following disclaimer. | ||||
|    * Redistributions in binary form must reproduce the above copyright notice, | ||||
|      this list of conditions and the following disclaimer in the documentation | ||||
|      and/or other materials provided with the distribution. | ||||
|    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||||
|    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||||
|    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|    DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
|    FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|    DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
|    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
|    CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
|    OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
|    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | ||||
| 
 | ||||
| #include <assert.h> | ||||
| 
 | ||||
| typedef int utf8_state; | ||||
| 
 | ||||
| static utf8_state next_state(utf8_state, unsigned char); | ||||
| 
 | ||||
| // Public API see utf8-validate.h for docs of the following function
 | ||||
| 
 | ||||
| bool utf8_validate(utf8_state *const state, int c) | ||||
| { | ||||
| 	assert(state); | ||||
| 	return (*state = next_state(*state, c)) != -1; | ||||
| } | ||||
| 
 | ||||
| bool utf8_validate_some(utf8_state *const state, const void * const src, size_t len) | ||||
| { | ||||
| 	assert(state); | ||||
| 	assert(src); | ||||
| 	for (size_t i = 0; i < len; ++i) { | ||||
| 		*state = next_state(*state, *((unsigned char *)src + i)); | ||||
| 		if (*state == -1) { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| bool utf8_validate_mem(const void * const src, size_t len) | ||||
| { | ||||
| 	assert(src); | ||||
| 	utf8_state state = 0; | ||||
| 	for (size_t i = 0; i < len; ++i) { | ||||
| 		state = next_state(state, *((unsigned char *)src + i)); | ||||
| 		if (state == -1) { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// detect unterminated sequence
 | ||||
| 	return state == 0; | ||||
| } | ||||
| 
 | ||||
| bool utf8_validate_str(const char * const str) | ||||
| { | ||||
| 	assert(str); | ||||
| 	utf8_state state = 0; | ||||
| 	for (size_t i = 0; str[i] != 0; ++i) { | ||||
| 		state = next_state(state, str[i]); | ||||
| 		if (state == -1) { | ||||
| 			return false; | ||||
| 		} | ||||
| 	} | ||||
| 	// detect unterminated sequence
 | ||||
| 	return state == 0; | ||||
| } | ||||
| 
 | ||||
| /* Private state engine
 | ||||
|  * | ||||
|  * The macros below assemble the cases for a switch statement | ||||
|  * matching the language of the ABNF grammar given in rfc3629. | ||||
|  * | ||||
|  * Each SEQ# macro adds the states to match a # char long sequence. | ||||
|  * | ||||
|  * The SEQ#_HELPERs all have a 'fall through' to the next sequence. | ||||
|  * for # > 1 this is an explicit goto | ||||
|  */ | ||||
| 
 | ||||
| #define SEQ_END(n) SEQ_ ## n ## _END | ||||
| 
 | ||||
| #define SEQ1_HELPER(s, r0)                                     \ | ||||
| case (s * 4) + 0: if (r0) return 0; goto SEQ_END(s);           \ | ||||
| SEQ_END(s): | ||||
| 
 | ||||
| #define SEQ2_HELPER(s, r0, r1)                                 \ | ||||
| case (s * 4) + 0: if (r0) { printf("ehe"); return (s * 4) + 1; } goto SEQ_END(s); \ | ||||
| case (s * 4) + 1: if (r1) return 0;           return -1;       \ | ||||
| SEQ_END(s): | ||||
| 
 | ||||
| #define SEQ3_HELPER(s, r0, r1, r2)                             \ | ||||
| case (s * 4) + 0: if (r0) return (s * 4) + 1; goto SEQ_END(s); \ | ||||
| case (s * 4) + 1: if (r1) return (s * 4) + 2; return -1;       \ | ||||
| case (s * 4) + 2: if (r2) return 0;           return -1;       \ | ||||
| SEQ_END(s): | ||||
| 
 | ||||
| #define SEQ4_HELPER(s, r0, r1, r2, r3)                         \ | ||||
| case (s * 4) + 0: if (r0) return (s * 4) + 1; goto SEQ_END(s); \ | ||||
| case (s * 4) + 1: if (r1) return (s * 4) + 2; return -1;       \ | ||||
| case (s * 4) + 2: if (r2) return (s * 4) + 3; return -1;       \ | ||||
| case (s * 4) + 3: if (r3) return 0;           return -1;       \ | ||||
| SEQ_END(s): | ||||
| 
 | ||||
| #define SEQ1(s, r0)             SEQ1_HELPER(s, r0) | ||||
| #define SEQ2(s, r0, r1)         SEQ2_HELPER(s, r0, r1) | ||||
| #define SEQ3(s, r0, r1, r2)     SEQ3_HELPER(s, r0, r1, r2) | ||||
| #define SEQ4(s, r0, r1, r2, r3) SEQ4_HELPER(s, r0, r1, r2, r3) | ||||
| 
 | ||||
| // Matcher macros
 | ||||
| 
 | ||||
| #define VALUE(v)     (c == v) | ||||
| #define RANGE(s, e)  (c >= s && c <= e) | ||||
| /* workaround for "-Wtype-limits" as c >= s is allways true for
 | ||||
|  * the unsigned char in the case of c == 0 */ | ||||
| #define EGNAR(s, e) ((c >= s + 1 && c <= e) || c == s) | ||||
| 
 | ||||
| /* from rfc3629
 | ||||
|  * | ||||
|  * UTF8-octets = *( UTF8-char ) | ||||
|  *    UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4 | ||||
|  *    UTF8-1      = %x00-7F | ||||
|  *    UTF8-2      = %xC2-DF UTF8-tail | ||||
|  *    UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) / | ||||
|  *                  %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail ) | ||||
|  *    UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) / | ||||
|  *                  %xF4 %x80-8F 2( UTF8-tail ) | ||||
|  *    UTF8-tail   = %x80-BF | ||||
|  */ | ||||
| 
 | ||||
| #define TAIL RANGE(0x80, 0xBF) | ||||
| 
 | ||||
| static inline utf8_state next_state(utf8_state state, unsigned char c) | ||||
| { | ||||
| 	printf("C: %d\n", c); | ||||
| 	switch (state) { | ||||
| 	SEQ1(0, EGNAR(0x00, 0x7F)) | ||||
| 	SEQ2(1, RANGE(0xC2, 0xDF), TAIL) | ||||
| 	SEQ3(2, VALUE(0xE0),       RANGE(0xA0, 0xBF), TAIL) | ||||
| 	SEQ3(3, RANGE(0xE1, 0xEC), TAIL,              TAIL) | ||||
| 	SEQ3(4, VALUE(0xED),       RANGE(0x80, 0x9F), TAIL) | ||||
| 	SEQ3(5, RANGE(0xEE, 0xEF), TAIL,              TAIL) | ||||
| 	SEQ4(6, VALUE(0xF0),       RANGE(0x90, 0xBF), TAIL, TAIL) | ||||
| 	SEQ4(7, RANGE(0xF1, 0xF3), TAIL,              TAIL, TAIL) | ||||
| 	SEQ4(8, VALUE(0xF4),       RANGE(0x80, 0x8F), TAIL, TAIL) | ||||
| 		// no sequence start matched
 | ||||
| 		break; | ||||
| 	default: | ||||
| 		/*
 | ||||
| 		 * This should not happen, unless you feed an error | ||||
| 		 * state or an uninitialized utf8_state to this function. | ||||
| 		 */ | ||||
| 		assert(false && "invalid utf8 state"); | ||||
| 	} | ||||
| 
 | ||||
| 	return -1; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue