Home | History | Annotate | Line # | Download | only in dev
dev_verbose.c revision 1.1
      1 /*	$NetBSD: dev_verbose.c,v 1.1 2014/09/21 14:30:22 christos Exp $	*/
      2 
      3 /*
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     23  */
     24 
     25 #include <sys/cdefs.h>
     26 __KERNEL_RCSID(0, "$NetBSD: dev_verbose.c,v 1.1 2014/09/21 14:30:22 christos Exp $");
     27 
     28 #include <sys/param.h>
     29 
     30 #ifdef _KERNEL
     31 #include <sys/systm.h>
     32 #else
     33 #include <stdio.h>
     34 #include <string.h>
     35 #endif
     36 
     37 #include <dev/dev_verbose.h>
     38 
     39 static const char *
     40 dev_untokenstring(const char *words, const uint16_t *token, char *buf,
     41     size_t len)
     42 {
     43 	char *cp = buf;
     44 
     45 	buf[0] = '\0';
     46 	for (; *token != 0; token++) {
     47 		cp = buf + strlcat(buf, words + *token, len - 2);
     48 		cp[0] = ' ';
     49 		cp[1] = '\0';
     50 	}
     51 	*cp = '\0';
     52 	return cp != buf ? buf : NULL;
     53 }
     54 
     55 const char *
     56 dev_findvendor(char *buf, size_t len, const char *words, size_t nwords,
     57     const uint16_t *vendors, size_t nvendors, uint16_t vendor)
     58 {
     59 	size_t n;
     60 
     61 	for (n = 0; n < nvendors; n++) {
     62 		if (vendors[n] == vendor)
     63 			return dev_untokenstring(words, &vendors[n + 1],
     64 			    buf, len);
     65 
     66 		/* Skip Tokens */
     67 		n++;
     68 		while (vendors[n] != 0 && n < nvendors)
     69 			n++;
     70 	}
     71 	snprintf(buf, len, "vendor %4.4x", vendor);
     72 	return NULL;
     73 }
     74 
     75 const char *
     76 dev_findproduct(char *buf, size_t len, const char *words, size_t nwords,
     77     const uint16_t *products, size_t nproducts, uint16_t vendor,
     78     uint16_t product)
     79 {
     80 	size_t n;
     81 
     82 	for (n = 0; n < nproducts; n++) {
     83 		if (products[n] == vendor && products[n + 1] == product)
     84 			return dev_untokenstring(words, &products[n + 2],
     85 			    buf, len);
     86 
     87 		/* Skip Tokens */
     88 		n += 2;
     89 		while (products[n] != 0 && n < nproducts)
     90 			n++;
     91 	}
     92 	snprintf(buf, len, "product %4.4x", product);
     93 	return NULL;
     94 }
     95