1213136Spjd/*-
2213136Spjd * Copyright (c) 1998 Robert Nordier
3213136Spjd * Copyright (c) 2010 Pawel Jakub Dawidek <pjd@FreeBSD.org>
4213136Spjd * All rights reserved.
5213136Spjd *
6213136Spjd * Redistribution and use in source and binary forms are freely
7213136Spjd * permitted provided that the above copyright notice and this
8213136Spjd * paragraph and the following disclaimer are duplicated in all
9213136Spjd * such forms.
10213136Spjd *
11213136Spjd * This software is provided "AS IS" and without any express or
12213136Spjd * implied warranties, including, without limitation, the implied
13213136Spjd * warranties of merchantability and fitness for a particular
14213136Spjd * purpose.
15213136Spjd */
16213136Spjd
17213136Spjd#include <sys/cdefs.h>
18213136Spjd__FBSDID("$FreeBSD$");
19213136Spjd
20213136Spjd#include <sys/param.h>
21213136Spjd
22213136Spjd#include <stdarg.h>
23213136Spjd
24213136Spjd#include "cons.h"
25213136Spjd#include "util.h"
26213136Spjd
27213136Spjdvoid
28213136Spjdmemcpy(void *dst, const void *src, int len)
29213136Spjd{
30213136Spjd	const char *s = src;
31213136Spjd	char *d = dst;
32213136Spjd
33213136Spjd	while (len--)
34213136Spjd		*d++ = *s++;
35213136Spjd}
36213136Spjd
37213136Spjdvoid
38213136Spjdmemset(void *b, int c, size_t len)
39213136Spjd{
40213136Spjd	char *bp = b;
41213136Spjd
42213136Spjd	while (len--)
43213136Spjd		*bp++ = (unsigned char)c;
44213136Spjd}
45213136Spjd
46213136Spjdint
47213136Spjdmemcmp(const void *b1, const void *b2, size_t len)
48213136Spjd{
49213136Spjd	const unsigned char *p1, *p2;
50213136Spjd
51213136Spjd	for (p1 = b1, p2 = b2; len > 0; len--, p1++, p2++) {
52213136Spjd		if (*p1 != *p2)
53213136Spjd			return ((*p1) - (*p2));
54213136Spjd	}
55213136Spjd	return (0);
56213136Spjd}
57213136Spjd
58213136Spjdint
59213136Spjdstrcmp(const char *s1, const char *s2)
60213136Spjd{
61213136Spjd
62213136Spjd	for (; *s1 == *s2 && *s1 != '\0'; s1++, s2++)
63213136Spjd		;
64213136Spjd	return ((unsigned char)*s1 - (unsigned char)*s2);
65213136Spjd}
66213136Spjd
67213136Spjdint
68213136Spjdstrncmp(const char *s1, const char *s2, size_t len)
69213136Spjd{
70213136Spjd
71249139Savg	for (; len > 0 && *s1 == *s2 && *s1 != '\0'; len--, s1++, s2++)
72213136Spjd		;
73249139Savg	return (len == 0 ? 0 : (unsigned char)*s1 - (unsigned char)*s2);
74213136Spjd}
75213136Spjd
76213136Spjdvoid
77213136Spjdstrcpy(char *dst, const char *src)
78213136Spjd{
79213136Spjd
80213136Spjd	while (*src != '\0')
81213136Spjd		*dst++ = *src++;
82213136Spjd	*dst = '\0';
83213136Spjd}
84213136Spjd
85213136Spjdvoid
86213136Spjdstrcat(char *dst, const char *src)
87213136Spjd{
88213136Spjd
89213136Spjd	while (*dst != '\0')
90213136Spjd		dst++;
91213136Spjd	while (*src != '\0')
92213136Spjd		*dst++ = *src++;
93213136Spjd	*dst = '\0';
94213136Spjd}
95213136Spjd
96213136Spjdchar *
97213136Spjdstrchr(const char *s, char ch)
98213136Spjd{
99213136Spjd
100213136Spjd	for (; *s != '\0'; s++) {
101213136Spjd		if (*s == ch)
102213136Spjd			return ((char *)(uintptr_t)(const void *)s);
103213136Spjd	}
104213136Spjd	return (NULL);
105213136Spjd}
106213136Spjd
107213136Spjdsize_t
108213136Spjdstrlen(const char *s)
109213136Spjd{
110213136Spjd	size_t len = 0;
111213136Spjd
112213136Spjd	while (*s++ != '\0')
113213136Spjd		len++;
114213136Spjd	return (len);
115213136Spjd}
116213136Spjd
117213136Spjdvoid
118213136Spjdprintf(const char *fmt, ...)
119213136Spjd{
120213136Spjd	va_list ap;
121213136Spjd	const char *hex = "0123456789abcdef";
122224722Sdim	char buf[32], *s;
123213136Spjd	unsigned long long u;
124213136Spjd	int c, l;
125213136Spjd
126213136Spjd	va_start(ap, fmt);
127213136Spjd	while ((c = *fmt++) != '\0') {
128213136Spjd		if (c != '%') {
129213136Spjd			putchar(c);
130213136Spjd			continue;
131213136Spjd		}
132213136Spjd		l = 0;
133213136Spjdnextfmt:
134213136Spjd		c = *fmt++;
135213136Spjd		switch (c) {
136213136Spjd		case 'l':
137213136Spjd			l++;
138213136Spjd			goto nextfmt;
139213136Spjd		case 'c':
140213136Spjd			putchar(va_arg(ap, int));
141213136Spjd			break;
142213136Spjd		case 's':
143213136Spjd			for (s = va_arg(ap, char *); *s != '\0'; s++)
144213136Spjd				putchar(*s);
145213136Spjd			break;
146213136Spjd		case 'd':	/* A lie, always prints unsigned */
147213136Spjd		case 'u':
148213136Spjd		case 'x':
149213136Spjd			switch (l) {
150213136Spjd			case 2:
151213136Spjd				u = va_arg(ap, unsigned long long);
152213136Spjd				break;
153213136Spjd			case 1:
154213136Spjd				u = va_arg(ap, unsigned long);
155213136Spjd				break;
156213136Spjd			default:
157213136Spjd				u = va_arg(ap, unsigned int);
158213136Spjd				break;
159213136Spjd			}
160213136Spjd			s = buf;
161213136Spjd			if (c == 'd' || c == 'u') {
162213136Spjd				do
163213136Spjd					*s++ = '0' + (u % 10U);
164213136Spjd				while (u /= 10);
165213136Spjd			} else {
166213136Spjd				do
167213136Spjd					*s++ = hex[u & 0xfu];
168213136Spjd				while (u >>= 4);
169213136Spjd			}
170213136Spjd			while (--s >= buf)
171213136Spjd				putchar(*s);
172213136Spjd			break;
173213136Spjd		}
174213136Spjd	}
175213136Spjd	va_end(ap);
176213136Spjd}
177