print: Add print_func() - output text w/ custom putc()
This commit is contained in:
		@@ -21,7 +21,8 @@
 | 
				
			|||||||
#ifndef PRINT_H
 | 
					#ifndef PRINT_H
 | 
				
			||||||
#define PRINT_H
 | 
					#define PRINT_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int print(char *fmt, ...);
 | 
					 | 
				
			||||||
void print_init(void (*putc)(char));
 | 
					void print_init(void (*putc)(char));
 | 
				
			||||||
 | 
					int print(char *fmt, ...);
 | 
				
			||||||
 | 
					int print_func(void (putcf)(char), char *fmt, ...);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* PRINT_H */
 | 
					#endif /* PRINT_H */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,19 +26,19 @@
 | 
				
			|||||||
void putc_initial(char c) {
 | 
					void putc_initial(char c) {
 | 
				
			||||||
	(void)c;
 | 
						(void)c;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
void (*putc)(char) = &putc_initial;
 | 
					void (*print_putc)(char) = &putc_initial;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void print_init(void (*putcfn)(char)) {
 | 
					void print_init(void (*putcfn)(char)) {
 | 
				
			||||||
	if (putcfn)
 | 
						if (putcfn)
 | 
				
			||||||
		putc = putcfn;
 | 
							print_putc = putcfn;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
void puts(const char *s)
 | 
					void puts(void (*putc)(char), const char *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    while (*s) putc (*s++);
 | 
					    while (*s) putc (*s++);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void puti(int i)
 | 
					void puti(void (*putc)(char), int i)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int left;
 | 
						unsigned int left;
 | 
				
			||||||
	char buf[1 << (sizeof(int)*8) / 10];
 | 
						char buf[1 << (sizeof(int)*8) / 10];
 | 
				
			||||||
@@ -64,10 +64,10 @@ void puti(int i)
 | 
				
			|||||||
		putc(*p);
 | 
							putc(*p);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void putx(unsigned int i) {
 | 
					void putx(void (*putc)(char), unsigned int i) {
 | 
				
			||||||
	int j;
 | 
						int j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("0x");
 | 
						puts(putc, "0x");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (j = 0; j < 8; j++) {
 | 
						for (j = 0; j < 8; j++) {
 | 
				
			||||||
		unsigned int toprint = (i >> (4*(7-j))) & 0xf;
 | 
							unsigned int toprint = (i >> (4*(7-j))) & 0xf;
 | 
				
			||||||
@@ -78,21 +78,18 @@ void putx(unsigned int i) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void putb(unsigned int i) {
 | 
					void putb(void (*putc)(char), unsigned int i) {
 | 
				
			||||||
	int j;
 | 
						int j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("0b");
 | 
						puts(putc, "0b");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (j = 0; j < 32; j++) {
 | 
						for (j = 0; j < 32; j++) {
 | 
				
			||||||
		putc((i>>(31-j)) & 1 ? '1' : '0');
 | 
							putc((i>>(31-j)) & 1 ? '1' : '0');
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int print(char *fmt, ...) {
 | 
					int _print(void (*putc)(char), char *fmt, va_list arg) {
 | 
				
			||||||
	char *c;
 | 
						char *c;
 | 
				
			||||||
	va_list arg;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	va_start(arg, fmt);
 | 
					 | 
				
			||||||
	for (c = fmt; *c; c++) {
 | 
						for (c = fmt; *c; c++) {
 | 
				
			||||||
		if (*c == '%') {
 | 
							if (*c == '%') {
 | 
				
			||||||
			switch (*++c) {
 | 
								switch (*++c) {
 | 
				
			||||||
@@ -100,24 +97,24 @@ int print(char *fmt, ...) {
 | 
				
			|||||||
				putc('%');
 | 
									putc('%');
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 's':
 | 
								case 's':
 | 
				
			||||||
				puts(va_arg(arg, char *));
 | 
									puts(putc, va_arg(arg, char *));
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'c':
 | 
								case 'c':
 | 
				
			||||||
				putc(va_arg(arg, unsigned int));
 | 
									putc(va_arg(arg, unsigned int));
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'd':
 | 
								case 'd':
 | 
				
			||||||
				puti(va_arg(arg, int));
 | 
									puti(putc, va_arg(arg, int));
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'x':
 | 
								case 'x':
 | 
				
			||||||
				putx(va_arg(arg, unsigned int));
 | 
									putx(putc, va_arg(arg, unsigned int));
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'b':
 | 
								case 'b':
 | 
				
			||||||
				putb(va_arg(arg, unsigned int));
 | 
									putb(putc, va_arg(arg, unsigned int));
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			default:
 | 
								default:
 | 
				
			||||||
				puts("\nError: print(): Invalid formatting character: '");
 | 
									puts(putc, "\nError: print(): Invalid formatting character: '");
 | 
				
			||||||
				putc(*c);
 | 
									putc(*c);
 | 
				
			||||||
				puts("'\n");
 | 
									puts(putc, "'\n");
 | 
				
			||||||
				return -1;
 | 
									return -1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
@@ -126,7 +123,28 @@ int print(char *fmt, ...) {
 | 
				
			|||||||
				putc('\r');
 | 
									putc('\r');
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	va_end(arg);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int print(char *fmt, ...) {
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
						va_list arg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						va_start(arg, fmt);
 | 
				
			||||||
 | 
						ret = _print(print_putc, fmt, arg);
 | 
				
			||||||
 | 
						va_end(arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int print_func(void (*putc)(char), char *fmt, ...) {
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
						va_list arg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						va_start(arg, fmt);
 | 
				
			||||||
 | 
						ret = _print(putc, fmt, arg);
 | 
				
			||||||
 | 
						va_end(arg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user