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
 |