xref: /openbmc/linux/arch/alpha/lib/srm_printk.c (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  *	arch/alpha/lib/srm_printk.c
3*1da177e4SLinus Torvalds  */
4*1da177e4SLinus Torvalds 
5*1da177e4SLinus Torvalds #include <linux/kernel.h>
6*1da177e4SLinus Torvalds #include <asm/console.h>
7*1da177e4SLinus Torvalds 
8*1da177e4SLinus Torvalds long
9*1da177e4SLinus Torvalds srm_printk(const char *fmt, ...)
10*1da177e4SLinus Torvalds {
11*1da177e4SLinus Torvalds 	static char buf[1024];
12*1da177e4SLinus Torvalds 	va_list args;
13*1da177e4SLinus Torvalds 	long len, num_lf;
14*1da177e4SLinus Torvalds 	char *src, *dst;
15*1da177e4SLinus Torvalds 
16*1da177e4SLinus Torvalds 	va_start(args, fmt);
17*1da177e4SLinus Torvalds 	len = vsprintf(buf, fmt, args);
18*1da177e4SLinus Torvalds 	va_end(args);
19*1da177e4SLinus Torvalds 
20*1da177e4SLinus Torvalds 	/* count number of linefeeds in string: */
21*1da177e4SLinus Torvalds 
22*1da177e4SLinus Torvalds 	num_lf = 0;
23*1da177e4SLinus Torvalds 	for (src = buf; *src; ++src) {
24*1da177e4SLinus Torvalds 		if (*src == '\n') {
25*1da177e4SLinus Torvalds 			++num_lf;
26*1da177e4SLinus Torvalds 		}
27*1da177e4SLinus Torvalds 	}
28*1da177e4SLinus Torvalds 
29*1da177e4SLinus Torvalds 	if (num_lf) {
30*1da177e4SLinus Torvalds 		/* expand each linefeed into carriage-return/linefeed: */
31*1da177e4SLinus Torvalds 		for (dst = src + num_lf; src >= buf; ) {
32*1da177e4SLinus Torvalds 			if (*src == '\n') {
33*1da177e4SLinus Torvalds 				*dst-- = '\r';
34*1da177e4SLinus Torvalds 			}
35*1da177e4SLinus Torvalds 			*dst-- = *src--;
36*1da177e4SLinus Torvalds 		}
37*1da177e4SLinus Torvalds 	}
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds 	srm_puts(buf, num_lf+len);
40*1da177e4SLinus Torvalds         return len;
41*1da177e4SLinus Torvalds }
42