val2text.hc (2332B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 #include <stdlib.h> 24 #include <string.h> 25 #include <strings.h> 26 27 #define VAL2TEXT(TYPE,SHORT) \ 28 ssize_t \ 29 utilvserver_value2text_##SHORT(char const *str, size_t len, \ 30 struct Mapping_ ##SHORT const *map, \ 31 size_t map_len) \ 32 { \ 33 size_t i; \ 34 if (len==0) len=strlen(str); \ 35 \ 36 for (i=0; i<map_len; ++i) \ 37 if (len==map[i].len && \ 38 strncasecmp(map[i].id, str, len)==0) \ 39 return i; \ 40 \ 41 return -1; \ 42 } 43 44 #define TEXT2VAL(TYPE,SHORT) \ 45 static ssize_t \ 46 searchValue(TYPE val, \ 47 struct Mapping_##SHORT const *map, size_t map_len) \ 48 { \ 49 size_t i; \ 50 for (i=0; i<map_len; ++i) \ 51 if (val == map[i].val) return i; \ 52 return -1; \ 53 } \ 54 \ 55 ssize_t \ 56 utilvserver_text2value_##SHORT(TYPE *val, \ 57 struct Mapping_##SHORT const *map, \ 58 size_t map_len) \ 59 { \ 60 ssize_t idx; \ 61 TYPE del_val; \ 62 if (*val==0) \ 63 return -1; \ 64 \ 65 del_val = *val; \ 66 idx = searchValue(del_val, map, map_len); \ 67 \ 68 if (idx==-1) { \ 69 size_t i; \ 70 for (i=0; i<sizeof(*val)*8 && (*val&((TYPE)1<<i))==0; ++i) {} \ 71 del_val = ((TYPE)1<<i); \ 72 idx = searchValue(del_val, map, map_len); \ 73 } \ 74 if (idx!=-1) \ 75 *val &= ~del_val; \ 76 return idx; \ 77 }