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