1199767fToomas Soome/*-
2199767fToomas Soome * Copyright (c) 1998 Robert Nordier
3199767fToomas Soome * Copyright (c) 2010 Pawel Jakub Dawidek <pjd@FreeBSD.org>
4199767fToomas Soome * All rights reserved.
5199767fToomas Soome *
6199767fToomas Soome * Redistribution and use in source and binary forms are freely
7199767fToomas Soome * permitted provided that the above copyright notice and this
8199767fToomas Soome * paragraph and the following disclaimer are duplicated in all
9199767fToomas Soome * such forms.
10199767fToomas Soome *
11199767fToomas Soome * This software is provided "AS IS" and without any express or
12199767fToomas Soome * implied warranties, including, without limitation, the implied
13199767fToomas Soome * warranties of merchantability and fitness for a particular
14199767fToomas Soome * purpose.
15199767fToomas Soome */
16199767fToomas Soome
17199767fToomas Soome#include <sys/cdefs.h>
18199767fToomas Soome__FBSDID("$FreeBSD$");
19199767fToomas Soome
20199767fToomas Soome#include <sys/param.h>
21199767fToomas Soome
22199767fToomas Soome#include <stdarg.h>
23199767fToomas Soome
24199767fToomas Soome#include "cons.h"
25199767fToomas Soome#include "util.h"
26199767fToomas Soome
27199767fToomas Soomevoid
28199767fToomas Soomememcpy(void *dst, const void *src, int len)
29199767fToomas Soome{
30199767fToomas Soome	const char *s = src;
31199767fToomas Soome	char *d = dst;
32199767fToomas Soome
33199767fToomas Soome	while (len--)
34199767fToomas Soome		*d++ = *s++;
35199767fToomas Soome}
36199767fToomas Soome
37199767fToomas Soomevoid
38199767fToomas Soomememset(void *b, int c, size_t len)
39199767fToomas Soome{
40199767fToomas Soome	char *bp = b;
41199767fToomas Soome
42199767fToomas Soome	while (len--)
43199767fToomas Soome		*bp++ = (unsigned char)c;
44199767fToomas Soome}
45199767fToomas Soome
46199767fToomas Soomeint
47199767fToomas Soomememcmp(const void *b1, const void *b2, size_t len)
48199767fToomas Soome{
49199767fToomas Soome	const unsigned char *p1, *p2;
50199767fToomas Soome
51199767fToomas Soome	for (p1 = b1, p2 = b2; len > 0; len--, p1++, p2++) {
52199767fToomas Soome		if (*p1 != *p2)
53199767fToomas Soome			return ((*p1) - (*p2));
54199767fToomas Soome	}
55199767fToomas Soome	return (0);
56199767fToomas Soome}
57199767fToomas Soome
58199767fToomas Soomeint
59199767fToomas Soomestrcmp(const char *s1, const char *s2)
60199767fToomas Soome{
61199767fToomas Soome
62199767fToomas Soome	for (; *s1 == *s2 && *s1 != '\0'; s1++, s2++)
63199767fToomas Soome		;
64199767fToomas Soome	return ((unsigned char)*s1 - (unsigned char)*s2);
65199767fToomas Soome}
66199767fToomas Soome
67199767fToomas Soomeint
68199767fToomas Soomestrncmp(const char *s1, const char *s2, size_t len)
69199767fToomas Soome{
70199767fToomas Soome
71199767fToomas Soome	for (; len > 0 && *s1 == *s2 && *s1 != '\0'; len--, s1++, s2++)
72199767fToomas Soome		;
73199767fToomas Soome	return (len == 0 ? 0 : (unsigned char)*s1 - (unsigned char)*s2);
74199767fToomas Soome}
75199767fToomas Soome
76199767fToomas Soomevoid
77199767fToomas Soomestrcpy(char *dst, const char *src)
78199767fToomas Soome{
79199767fToomas Soome
80199767fToomas Soome	while (*src != '\0')
81199767fToomas Soome		*dst++ = *src++;
82199767fToomas Soome	*dst = '\0';
83199767fToomas Soome}
84199767fToomas Soome
85199767fToomas Soomevoid
86199767fToomas Soomestrcat(char *dst, const char *src)
87199767fToomas Soome{
88199767fToomas Soome
89199767fToomas Soome	while (*dst != '\0')
90199767fToomas Soome		dst++;
91199767fToomas Soome	while (*src != '\0')
92199767fToomas Soome		*dst++ = *src++;
93199767fToomas Soome	*dst = '\0';
94199767fToomas Soome}
95199767fToomas Soome
96199767fToomas Soomechar *
97199767fToomas Soomestrchr(const char *s, char ch)
98199767fToomas Soome{
99199767fToomas Soome
100199767fToomas Soome	for (; *s != '\0'; s++) {
101199767fToomas Soome		if (*s == ch)
102199767fToomas Soome			return ((char *)(uintptr_t)(const void *)s);
103199767fToomas Soome	}
104199767fToomas Soome	return (NULL);
105199767fToomas Soome}
106199767fToomas Soome
107199767fToomas Soomesize_t
108199767fToomas Soomestrlen(const char *s)
109199767fToomas Soome{
110199767fToomas Soome	size_t len = 0;
111199767fToomas Soome
112199767fToomas Soome	while (*s++ != '\0')
113199767fToomas Soome		len++;
114199767fToomas Soome	return (len);
115199767fToomas Soome}
116199767fToomas Soome
117199767fToomas Soomeint
118199767fToomas Soomeprintf(const char *fmt, ...)
119199767fToomas Soome{
120199767fToomas Soome	va_list ap;
121199767fToomas Soome	const char *hex = "0123456789abcdef";
122199767fToomas Soome	char buf[32], *s;
123cfba4bcToomas Soome	uint16_t *S;
124199767fToomas Soome	unsigned long long u;
125199767fToomas Soome	int c, l;
126199767fToomas Soome
127199767fToomas Soome	va_start(ap, fmt);
128199767fToomas Soome	while ((c = *fmt++) != '\0') {
129199767fToomas Soome		if (c != '%') {
130199767fToomas Soome			putchar(c);
131199767fToomas Soome			continue;
132199767fToomas Soome		}
133199767fToomas Soome		l = 0;
134199767fToomas Soomenextfmt:
135199767fToomas Soome		c = *fmt++;
136199767fToomas Soome		switch (c) {
137199767fToomas Soome		case 'l':
138199767fToomas Soome			l++;
139199767fToomas Soome			goto nextfmt;
140199767fToomas Soome		case 'c':
141199767fToomas Soome			putchar(va_arg(ap, int));
142199767fToomas Soome			break;
143199767fToomas Soome		case 's':
144199767fToomas Soome			for (s = va_arg(ap, char *); *s != '\0'; s++)
145199767fToomas Soome				putchar(*s);
146199767fToomas Soome			break;
147cfba4bcToomas Soome		case 'S':	/* Assume console can cope with wide chars */
148cfba4bcToomas Soome			for (S = va_arg(ap, uint16_t *); *S != 0; S++)
149cfba4bcToomas Soome				putchar(*S);
150cfba4bcToomas Soome			break;
151199767fToomas Soome		case 'd':	/* A lie, always prints unsigned */
152199767fToomas Soome		case 'u':
153199767fToomas Soome		case 'x':
154199767fToomas Soome			switch (l) {
155199767fToomas Soome			case 2:
156199767fToomas Soome				u = va_arg(ap, unsigned long long);
157199767fToomas Soome				break;
158199767fToomas Soome			case 1:
159199767fToomas Soome				u = va_arg(ap, unsigned long);
160199767fToomas Soome				break;
161199767fToomas Soome			default:
162199767fToomas Soome				u = va_arg(ap, unsigned int);
163199767fToomas Soome				break;
164199767fToomas Soome			}
165199767fToomas Soome			s = buf;
166199767fToomas Soome			if (c == 'd' || c == 'u') {
167199767fToomas Soome				do
168199767fToomas Soome					*s++ = '0' + (u % 10U);
169199767fToomas Soome				while (u /= 10);
170199767fToomas Soome			} else {
171199767fToomas Soome				do
172199767fToomas Soome					*s++ = hex[u & 0xfu];
173199767fToomas Soome				while (u >>= 4);
174199767fToomas Soome			}
175199767fToomas Soome			while (--s >= buf)
176199767fToomas Soome				putchar(*s);
177199767fToomas Soome			break;
178199767fToomas Soome		}
179199767fToomas Soome	}
180199767fToomas Soome	va_end(ap);
181199767fToomas Soome	return (0);
182199767fToomas Soome}