Some refactoring
							parent
							
								
									1052dd6244
								
							
						
					
					
						commit
						a13536d0c7
					
				
							
								
								
									
										69
									
								
								src/st/st.c
								
								
								
								
							
							
						
						
									
										69
									
								
								src/st/st.c
								
								
								
								
							|  | @ -308,67 +308,86 @@ char *safe_strdup(char *p_str) { | |||
|  * @return size of the decoded rune | ||||
|  */ | ||||
| size_t utf8decode(const char *p_char, Rune *p_rune, size_t p_char_len) { | ||||
|     size_t decoded_len, type; | ||||
|     Rune rune_decoded; | ||||
|     size_t decoded_len, type, i; | ||||
|     Rune decoded_rune; | ||||
| 
 | ||||
|     *p_rune = UTF_INVALID; | ||||
|     if (!p_char_len) // chr_len is 0, so just return 0
 | ||||
|     if (!p_char_len) // p_char_len is 0, so just return 0
 | ||||
|         return 0; | ||||
| 
 | ||||
|     rune_decoded = utf8decodebyte(p_char[0], &decoded_len); | ||||
|     decoded_rune = utf8decodebyte(p_char[0], &decoded_len); | ||||
|     if (!BETWEEN(decoded_len, 1, UTF_SIZE)) | ||||
|         return 1; | ||||
| 
 | ||||
|     size_t i, j; | ||||
|     for (i = 1, j = 1; i < p_char_len && j < decoded_len; ++i, ++j) { | ||||
|         rune_decoded = (rune_decoded << 6) | utf8decodebyte(p_char[i], &type); | ||||
|     for (i = 1; i < p_char_len && i < decoded_len; ++i) { | ||||
|         decoded_rune = (decoded_rune << 6) | utf8decodebyte(p_char[i], &type); | ||||
| 
 | ||||
|         if (type != 0) | ||||
|             return j; | ||||
|             return i; | ||||
|     } | ||||
| 
 | ||||
|     if (j < decoded_len) | ||||
|     if (i < decoded_len) | ||||
|         return 0; | ||||
| 
 | ||||
|     *p_rune = rune_decoded; | ||||
|     *p_rune = decoded_rune; | ||||
|     utf8validate(p_rune, decoded_len); | ||||
| 
 | ||||
|     return decoded_len; | ||||
| } | ||||
| 
 | ||||
| Rune utf8decodebyte(char p_char, size_t *i) { | ||||
| 
 | ||||
|     for (*i = 0; *i < LEN(utfmask); ++(*i)) { | ||||
|         if (((uchar)p_char & utfmask[*i]) == utfbyte[*i]) | ||||
|             return (uchar)p_char & ~utfmask[*i]; | ||||
| /**
 | ||||
|  * Decode a single byte to UTF-8 | ||||
|  * | ||||
|  * @param p_char char to decode | ||||
|  * @param p_i counter used in internal for loop | ||||
|  * @return decoded rune | ||||
|  */ | ||||
| Rune utf8decodebyte(char p_char, size_t *p_i) { | ||||
|     for (*p_i = 0; *p_i < LEN(utfmask); ++(*p_i)) { | ||||
|         if (((uchar)p_char & utfmask[*p_i]) == utfbyte[*p_i]) | ||||
|             return (uchar)p_char & ~utfmask[*p_i]; | ||||
|     } | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| size_t utf8encode(Rune u, char *c) { | ||||
| /**
 | ||||
|  * Encode a UTF-8 rune | ||||
|  * | ||||
|  * @param p_rune rune to encode | ||||
|  * @param p_char char array to encode to | ||||
|  * @return  | ||||
|  */ | ||||
| size_t utf8encode(Rune p_rune, char *p_char) { | ||||
|     size_t len, i; | ||||
| 
 | ||||
|     len = utf8validate(&u, 0); | ||||
|     len = utf8validate(&p_rune, 0); | ||||
|     if (len > UTF_SIZE) | ||||
|         return 0; | ||||
| 
 | ||||
|     for (i = len - 1; i != 0; --i) { | ||||
|         c[i] = utf8encodebyte(u, 0); | ||||
|         u >>= 6; | ||||
|         p_char[i] = utf8encodebyte(p_rune, 0); | ||||
|         p_rune >>= 6; | ||||
|     } | ||||
|     c[0] = utf8encodebyte(u, len); | ||||
|     p_char[0] = utf8encodebyte(p_rune, len); | ||||
| 
 | ||||
|     return len; | ||||
| } | ||||
| 
 | ||||
| char utf8encodebyte(Rune u, size_t i) { return utfbyte[i] | (u & ~utfmask[i]); } | ||||
| 
 | ||||
| size_t utf8validate(Rune *u, size_t i) { | ||||
|     if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF)) | ||||
|         *u = UTF_INVALID; | ||||
|     for (i = 1; *u > utfmax[i]; ++i) | ||||
|         ; | ||||
| /**
 | ||||
|  * Check if a given rune is a valid UTF-8 rune | ||||
|  * | ||||
|  * @param p_rune rune to validate | ||||
|  * @param i  | ||||
|  */ | ||||
| size_t utf8validate(Rune *p_rune, size_t i) { | ||||
|     if (!BETWEEN(*p_rune, utfmin[i], utfmax[i]) || BETWEEN(*p_rune, 0xD800, 0xDFFF)) | ||||
|         *p_rune = UTF_INVALID; | ||||
| 
 | ||||
|     // Count up i until you find a utfmax entry that's greater than *p_rune
 | ||||
|     for (i = 1; *p_rune > utfmax[i]; ++i); | ||||
| 
 | ||||
|     return i; | ||||
| } | ||||
|  |  | |||
		Reference in New Issue