1 /* $NetBSD: name_code.c,v 1.1.1.1 2009/06/23 10:09:00 tron Exp $ */ 2 3 /*++ 4 /* NAME 5 /* name_code 3 6 /* SUMMARY 7 /* name to number table mapping 8 /* SYNOPSIS 9 /* #include <name_code.h> 10 /* 11 /* typedef struct { 12 /* .in +4 13 /* const char *name; 14 /* int code; 15 /* .in -4 16 /* } NAME_CODE; 17 /* 18 /* int name_code(table, flags, name) 19 /* const NAME_CODE *table; 20 /* int flags; 21 /* const char *name; 22 /* 23 /* const char *str_name_code(table, code) 24 /* const NAME_CODE *table; 25 /* int code; 26 /* DESCRIPTION 27 /* This module does simple name<->number mapping. The process 28 /* is controlled by a table of (name, code) values. 29 /* The table is terminated with a null pointer and a code that 30 /* corresponds to "name not found". 31 /* 32 /* name_code() looks up the code that corresponds with the name. 33 /* The lookup is case insensitive. The flags argument specifies 34 /* zero or more of the following: 35 /* .IP NAME_CODE_FLAG_STRICT_CASE 36 /* String lookups are case sensitive. 37 /* .PP 38 /* For convenience the constant NAME_CODE_FLAG_NONE requests 39 /* no special processing. 40 /* 41 /* str_name_code() translates a number to its equivalent string. 42 /* DIAGNOSTICS 43 /* When the search fails, the result is the "name not found" code 44 /* or the null pointer, respectively. 45 /* LICENSE 46 /* .ad 47 /* .fi 48 /* The Secure Mailer license must be distributed with this software. 49 /* AUTHOR(S) 50 /* Wietse Venema 51 /* IBM T.J. Watson Research 52 /* P.O. Box 704 53 /* Yorktown Heights, NY 10598, USA 54 /*--*/ 55 56 /* System library. */ 57 58 #include <sys_defs.h> 59 #include <string.h> 60 61 #ifdef STRCASECMP_IN_STRINGS_H 62 #include <strings.h> 63 #endif 64 65 /* Utility library. */ 66 67 #include <name_code.h> 68 69 /* name_code - look up code by name */ 70 71 int name_code(const NAME_CODE *table, int flags, const char *name) 72 { 73 const NAME_CODE *np; 74 int (*lookup) (const char *, const char *); 75 76 if (flags & NAME_CODE_FLAG_STRICT_CASE) 77 lookup = strcmp; 78 else 79 lookup = strcasecmp; 80 81 for (np = table; np->name; np++) 82 if (lookup(name, np->name) == 0) 83 break; 84 return (np->code); 85 } 86 87 /* str_name_code - look up name by code */ 88 89 const char *str_name_code(const NAME_CODE *table, int code) 90 { 91 const NAME_CODE *np; 92 93 for (np = table; np->name; np++) 94 if (code == np->code) 95 break; 96 return (np->name); 97 } 98