229 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			229 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|  | 
 | ||
|  | h2_size_t XFUN(strfmc) ( | ||
|  | 	xchar_t* buf, const xchar_t* fmt, const xchar_t* str[]) | ||
|  | { | ||
|  | 	xchar_t* b = buf; | ||
|  | 	const xchar_t* f = fmt; | ||
|  | 
 | ||
|  | 	while (*f != XCHAR('\0')) | ||
|  | 	{ | ||
|  | 		if (*f == XCHAR('$')) | ||
|  | 		{ | ||
|  | 			if (f[1] == XCHAR('{') &&  | ||
|  | 			    (f[2] >= XCHAR('0') && f[2] <= XCHAR('9'))) | ||
|  | 			{ | ||
|  | 				const xchar_t* tmp; | ||
|  | 				h2_size_t idx = 0; | ||
|  | 
 | ||
|  | 				tmp = f; | ||
|  | 				f += 2; | ||
|  | 
 | ||
|  | 				do idx = idx * 10 + (*f++ - XCHAR('0')); | ||
|  | 				while (*f >= XCHAR('0') && *f <= XCHAR('9')); | ||
|  | 	 | ||
|  | 				if (*f != XCHAR('}')) | ||
|  | 				{ | ||
|  | 					f = tmp; | ||
|  | 					goto normal; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				f++; | ||
|  | 
 | ||
|  | 				tmp = str[idx]; | ||
|  | 				while (*tmp != XCHAR('\0')) *b++ = *tmp++; | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 			else if (f[1] == XCHAR('$')) f++; | ||
|  | 		} | ||
|  | 
 | ||
|  | 	normal: | ||
|  | 		*b++ = *f++; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	*b = XCHAR('\0'); | ||
|  | 	return b - buf; | ||
|  | } | ||
|  | 
 | ||
|  | #if 0
 | ||
|  | h2_size_t XFUN(strfncpy) ( | ||
|  | 	xchar_t* buf, const xchar_t* fmt, const cstr_t str[]) | ||
|  | { | ||
|  | 	xchar_t* b = buf; | ||
|  | 	const xchar_t* f = fmt; | ||
|  | 
 | ||
|  | 	while (*f != XCHAR('\0')) | ||
|  | 	{ | ||
|  | 		if (*f == XCHAR('\\')) | ||
|  | 		{ | ||
|  | 			/* get the escaped character and treat it normally.
 | ||
|  | 			 * if the escaper is the last character, treat it  | ||
|  | 			 * normally also. */ | ||
|  | 			if (f[1] != XCHAR('\0')) f++; | ||
|  | 		} | ||
|  | 		else if (*f == XCHAR('$')) | ||
|  | 		{ | ||
|  | 			if (f[1] == XCHAR('{') &&  | ||
|  | 			    (f[2] >= XCHAR('0') && f[2] <= XCHAR('9'))) | ||
|  | 			{ | ||
|  | 				const xchar_t* tmp, * tmpend; | ||
|  | 				h2_size_t idx = 0; | ||
|  | 
 | ||
|  | 				tmp = f; | ||
|  | 				f += 2; | ||
|  | 
 | ||
|  | 				do idx = idx * 10 + (*f++ - XCHAR('0')); | ||
|  | 				while (*f >= XCHAR('0') && *f <= XCHAR('9')); | ||
|  | 	 | ||
|  | 				if (*f != XCHAR('}')) | ||
|  | 				{ | ||
|  | 					f = tmp; | ||
|  | 					goto normal; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				f++; | ||
|  | 				 | ||
|  | 				tmp = str[idx].ptr; | ||
|  | 				tmpend = tmp + str[idx].len; | ||
|  | 
 | ||
|  | 				while (tmp < tmpend) *b++ = *tmp++; | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 			else if (f[1] == XCHAR('$')) f++; | ||
|  | 		} | ||
|  | 
 | ||
|  | 	normal: | ||
|  | 		*b++ = *f++; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	*b = XCHAR('\0'); | ||
|  | 	return b - buf; | ||
|  | } | ||
|  | 
 | ||
|  | h2_size_t XFUN(strxfmc) ( | ||
|  | 	xchar_t* buf, h2_size_t bsz,  | ||
|  | 	const xchar_t* fmt, const xchar_t* str[]) | ||
|  | { | ||
|  | 	xchar_t* b = buf; | ||
|  | 	xchar_t* end = buf + bsz - 1; | ||
|  | 	const xchar_t* f = fmt; | ||
|  | 
 | ||
|  | 	if (bsz <= 0) return 0; | ||
|  | 
 | ||
|  | 	while (*f != XCHAR('\0')) | ||
|  | 	{ | ||
|  | 		if (*f == XCHAR('\\')) | ||
|  | 		{ | ||
|  | 			/* get the escaped character and treat it normally.
 | ||
|  | 			 * if the escaper is the last character, treat it  | ||
|  | 			 * normally also. */ | ||
|  | 			if (f[1] != XCHAR('\0')) f++; | ||
|  | 		} | ||
|  | 		else if (*f == XCHAR('$')) | ||
|  | 		{ | ||
|  | 			if (f[1] == XCHAR('{') &&  | ||
|  | 			    (f[2] >= XCHAR('0') && f[2] <= XCHAR('9'))) | ||
|  | 			{ | ||
|  | 				const xchar_t* tmp; | ||
|  | 				h2_size_t idx = 0; | ||
|  | 
 | ||
|  | 				tmp = f; | ||
|  | 				f += 2; | ||
|  | 
 | ||
|  | 				do idx = idx * 10 + (*f++ - XCHAR('0')); | ||
|  | 				while (*f >= XCHAR('0') && *f <= XCHAR('9')); | ||
|  | 	 | ||
|  | 				if (*f != XCHAR('}')) | ||
|  | 				{ | ||
|  | 					f = tmp; | ||
|  | 					goto normal; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				f++; | ||
|  | 				 | ||
|  | 				tmp = str[idx]; | ||
|  | 				while (*tmp != XCHAR('\0'))  | ||
|  | 				{ | ||
|  | 					if (b >= end) goto fini; | ||
|  | 					*b++ = *tmp++; | ||
|  | 				} | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 			else if (f[1] == XCHAR('$')) f++; | ||
|  | 		} | ||
|  | 
 | ||
|  | 	normal: | ||
|  | 		if (b >= end) break; | ||
|  | 		*b++ = *f++; | ||
|  | 	} | ||
|  | 
 | ||
|  | fini: | ||
|  | 	*b = XCHAR('\0'); | ||
|  | 	return b - buf; | ||
|  | } | ||
|  | 
 | ||
|  | h2_size_t XFUN(strxfncpy) ( | ||
|  | 	xchar_t* buf, h2_size_t bsz,  | ||
|  | 	const xchar_t* fmt, const cstr_t str[]) | ||
|  | { | ||
|  | 	xchar_t* b = buf; | ||
|  | 	xchar_t* end = buf + bsz - 1; | ||
|  | 	const xchar_t* f = fmt; | ||
|  | 
 | ||
|  | 	if (bsz <= 0) return 0; | ||
|  | 
 | ||
|  | 	while (*f != XCHAR('\0')) | ||
|  | 	{ | ||
|  | 		if (*f == XCHAR('\\')) | ||
|  | 		{ | ||
|  | 			/* get the escaped character and treat it normally.
 | ||
|  | 			 * if the escaper is the last character, treat it  | ||
|  | 			 * normally also. */ | ||
|  | 			if (f[1] != XCHAR('\0')) f++; | ||
|  | 		} | ||
|  | 		else if (*f == XCHAR('$')) | ||
|  | 		{ | ||
|  | 			if (f[1] == XCHAR('{') &&  | ||
|  | 			    (f[2] >= XCHAR('0') && f[2] <= XCHAR('9'))) | ||
|  | 			{ | ||
|  | 				const xchar_t* tmp, * tmpend; | ||
|  | 				h2_size_t idx = 0; | ||
|  | 
 | ||
|  | 				tmp = f; | ||
|  | 				f += 2; | ||
|  | 
 | ||
|  | 				do idx = idx * 10 + (*f++ - XCHAR('0')); | ||
|  | 				while (*f >= XCHAR('0') && *f <= XCHAR('9')); | ||
|  | 	 | ||
|  | 				if (*f != XCHAR('}')) | ||
|  | 				{ | ||
|  | 					f = tmp; | ||
|  | 					goto normal; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				f++; | ||
|  | 				 | ||
|  | 				tmp = str[idx].ptr; | ||
|  | 				tmpend = tmp + str[idx].len; | ||
|  | 
 | ||
|  | 				while (tmp < tmpend) | ||
|  | 				{ | ||
|  | 					if (b >= end) goto fini; | ||
|  | 					*b++ = *tmp++; | ||
|  | 				} | ||
|  | 				continue; | ||
|  | 			} | ||
|  | 			else if (f[1] == XCHAR('$')) f++; | ||
|  | 		} | ||
|  | 
 | ||
|  | 	normal: | ||
|  | 		if (b >= end) break; | ||
|  | 		*b++ = *f++; | ||
|  | 	} | ||
|  | 
 | ||
|  | fini: | ||
|  | 	*b = XCHAR('\0'); | ||
|  | 	return b - buf; | ||
|  | } | ||
|  | 
 | ||
|  | #endif
 |