work in progress to implement the builtin printf function
This commit is contained in:
		| @ -266,6 +266,11 @@ void hcl_fini (hcl_t* hcl) | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void hcl_clear (hcl_t* hcl, int flags) | ||||||
|  | { | ||||||
|  | 	/* TODO */ | ||||||
|  | } | ||||||
|  |  | ||||||
| int hcl_setoption (hcl_t* hcl, hcl_option_t id, const void* value) | int hcl_setoption (hcl_t* hcl, hcl_option_t id, const void* value) | ||||||
| { | { | ||||||
| 	switch (id) | 	switch (id) | ||||||
|  | |||||||
| @ -477,23 +477,34 @@ hcl_ooi_t hcl_logufmt (hcl_t* hcl, hcl_oow_t mask, const hcl_uch_t* fmt, ...) | |||||||
| static int put_prch (hcl_t* hcl, hcl_oow_t mask, hcl_ooch_t ch, hcl_oow_t len) | static int put_prch (hcl_t* hcl, hcl_oow_t mask, hcl_ooch_t ch, hcl_oow_t len) | ||||||
| { | { | ||||||
| /* TODO: better error handling, buffering. | /* TODO: better error handling, buffering. | ||||||
|  * buffer should be done by the printer callback? */ |  *       should buffering be done by the printer callback? */ | ||||||
| 	hcl_ooi_t n; | 	hcl_ooi_t n; | ||||||
|  | 	hcl_ooch_t str[256]; | ||||||
|  | 	hcl_oow_t seglen, i; | ||||||
|  |  | ||||||
| 	hcl->c->outarg.ptr = &ch; | 	while (len > 0) | ||||||
| 	hcl->c->outarg.len = 1; | 	{ | ||||||
|  | 		seglen = (len > HCL_COUNTOF(str))? len = HCL_COUNTOF(str): len; | ||||||
|  | 		for (i = 0; i < seglen; i++) str[i] = ch; | ||||||
|  |  | ||||||
| 	n = hcl->c->printer(hcl, HCL_IO_WRITE, &hcl->c->outarg); | 		hcl->c->outarg.ptr = str; | ||||||
|  | 		hcl->c->outarg.len = seglen; | ||||||
|  |  | ||||||
|  | 		n = hcl->c->printer(hcl, HCL_IO_WRITE, &hcl->c->outarg); | ||||||
|  |  | ||||||
|  | 		if (n <= -1) return -1; | ||||||
|  | 		if (n == 0) return 0; | ||||||
|  |  | ||||||
|  | 		len -= seglen; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (n <= -1) return -1; |  | ||||||
| 	if (n == 0) return 0; |  | ||||||
| 	return 1; /* success */ | 	return 1; /* success */ | ||||||
| } | } | ||||||
|  |  | ||||||
| static int put_prcs (hcl_t* hcl, hcl_oow_t mask, const hcl_ooch_t* ptr, hcl_oow_t len) | static int put_prcs (hcl_t* hcl, hcl_oow_t mask, const hcl_ooch_t* ptr, hcl_oow_t len) | ||||||
| { | { | ||||||
| /* TODO: better error handling, buffering  | /* TODO: better error handling, buffering  | ||||||
|  * buffer should be done by the printer callback? */ |  *       should buffering be done by the printer callback? */ | ||||||
| 	hcl_ooi_t n; | 	hcl_ooi_t n; | ||||||
|  |  | ||||||
| 	hcl->c->outarg.ptr = (hcl_ooch_t*)ptr; | 	hcl->c->outarg.ptr = (hcl_ooch_t*)ptr; | ||||||
|  | |||||||
| @ -74,7 +74,7 @@ | |||||||
| #define PUT_OOCH(c,n) do { \ | #define PUT_OOCH(c,n) do { \ | ||||||
| 	if (n > 0) { \ | 	if (n > 0) { \ | ||||||
| 		int xx; \ | 		int xx; \ | ||||||
| 		if ((xx = data->putch (hcl, data->mask, c, n)) <= -1) goto oops; \ | 		if ((xx = data->putch(hcl, data->mask, c, n)) <= -1) goto oops; \ | ||||||
| 		if (xx == 0) goto done; \ | 		if (xx == 0) goto done; \ | ||||||
| 		data->count += n; \ | 		data->count += n; \ | ||||||
| 	} \ | 	} \ | ||||||
| @ -83,7 +83,7 @@ | |||||||
| #define PUT_OOCS(ptr,len) do { \ | #define PUT_OOCS(ptr,len) do { \ | ||||||
| 	if (len > 0) { \ | 	if (len > 0) { \ | ||||||
| 		int xx; \ | 		int xx; \ | ||||||
| 		if ((xx = data->putcs (hcl, data->mask, ptr, len)) <= -1) goto oops; \ | 		if ((xx = data->putcs(hcl, data->mask, ptr, len)) <= -1) goto oops; \ | ||||||
| 		if (xx == 0) goto done; \ | 		if (xx == 0) goto done; \ | ||||||
| 		data->count += len; \ | 		data->count += len; \ | ||||||
| 	} \ | 	} \ | ||||||
| @ -137,10 +137,17 @@ static int logfmtv (hcl_t* hcl, const fmtchar_t* fmt, hcl_fmtout_t* data, va_lis | |||||||
| 		} | 		} | ||||||
| 		PUT_OOCS (checkpoint, fmt - checkpoint - 1); | 		PUT_OOCS (checkpoint, fmt - checkpoint - 1); | ||||||
| 	#else | 	#else | ||||||
|  |  | ||||||
| 		while ((ch = *fmt++) != '%' || stop)  | 		while ((ch = *fmt++) != '%' || stop)  | ||||||
| 		{ | 		{ | ||||||
| 			if (ch == '\0') goto done; | 			if (ch == '\0') goto done; | ||||||
|  |  | ||||||
|  | 	#if defined(HCL_OOCH_IS_UCH) | ||||||
|  | 		/* ooch is uch. fmtchar is bch */ | ||||||
|  | 		/* TODO: convert bch to uch */ | ||||||
|  | 	#else | ||||||
|  | 		/* ooch is bch. fmtchar is uch */ | ||||||
|  | 		/* TODO: convert uch to bch */ | ||||||
|  | 	#endif | ||||||
| 			PUT_OOCH (ch, 1); | 			PUT_OOCH (ch, 1); | ||||||
| 		} | 		} | ||||||
| 	#endif | 	#endif | ||||||
|  | |||||||
							
								
								
									
										995
									
								
								hcl/lib/prim.c
									
									
									
									
									
								
							
							
						
						
									
										995
									
								
								hcl/lib/prim.c
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user