00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef lint
00021 static const char rcsid[] = "$Id: flags.c,v 1.11 2004-07-29 19:48:11 darko Exp $";
00022 #endif
00023
00024 #include "flags.h"
00025
00026 unsigned long flagmap[256];
00027
00028 void init_flag_map()
00029 {
00030 int i;
00031
00032 for (i = 0; i < 'A'; i++)
00033 flagmap[i] = 0;
00034 for (; i <= 'Z'; i++)
00035 flagmap[i] = 1 << (i - 'A');
00036 for (; i < 'a'; i++)
00037 flagmap[i] = 0;
00038 for (; i <= 'z'; i++)
00039 flagmap[i] = 1 << (i - 'a');
00040
00041 for (; i < 256; i++)
00042 flagmap[i] = 0;
00043 }
00044
00045
00046 int flag_to_str(flags_t *flags, char *str)
00047 {
00048 int i, j;
00049
00050 j = 0;
00051 for (i = 0; i < 26; i++) {
00052 if (flags->builtin & (1 << i)) str[j++] = 'a' + i;
00053 }
00054 for (i = 0; i < 26; i++) {
00055 if (flags->udef & (1 << i)) str[j++] = 'A' + i;
00056 }
00057 str[j] = 0;
00058 return 1;
00059 }
00060
00061 static inline void add_flag(unsigned long *longptr, int dir, int flag)
00062 {
00063 if (dir < 0) *longptr &= ~(1 << flag);
00064 else *longptr |= 1 << flag;
00065 }
00066
00067 int flag_merge_str(flags_t *flags, const char *str)
00068 {
00069 int dir = 1;
00070
00071
00072 if (*str != '+' && *str != '-') {
00073 flags->builtin = flags->udef = 0;
00074 }
00075
00076 while (*str) {
00077 if (*str >= 'a' && *str <= 'z') {
00078 add_flag(&flags->builtin, dir, *str - 'a');
00079 }
00080 else if (*str >= 'A' && *str <= 'Z') {
00081 add_flag(&flags->udef, dir, *str - 'A');
00082 }
00083 else if (*str == '-') dir = -1;
00084 else if (*str == '+') dir = 1;
00085 str++;
00086 }
00087
00088 return 1;
00089 }
00090
00091 int flag_from_str(flags_t *flags, const char *str)
00092 {
00093
00094 flags->builtin = flags->udef = 0;
00095 return flag_merge_str(flags, str);
00096 }
00097
00098
00099
00100 int flag_match_subset(flags_t *left, flags_t *right)
00101 {
00102 unsigned long builtin, udef;
00103
00104 builtin = (left->builtin & right->builtin) == left->builtin;
00105 udef = (left->udef & right->udef) == left->udef;
00106 return (builtin && udef);
00107 }
00108
00109
00110 int flag_match_exact(flags_t *left, flags_t *right)
00111 {
00112 unsigned long builtin, udef;
00113
00114 builtin = left->builtin ^ right->builtin;
00115 udef = left->udef ^ right->udef;
00116 return !(builtin || udef);
00117 }
00118
00119
00120 int flag_match_partial(flags_t *left, flags_t *right)
00121 {
00122 unsigned long builtin, udef;
00123
00124
00125 if (!(right->builtin | right->udef)) return(1);
00126
00127 builtin = left->builtin & right->builtin;
00128 udef = left->udef & right->udef;
00129 return (builtin || udef);
00130 }
00131
00132 int flag_match_single_char(flags_t *f, unsigned char c)
00133 {
00134 if (c >= 'a' && c <= 'z')
00135 return f->builtin & flagmap[c];
00136 else if (c >= 'A' && c <= 'Z')
00137 return f->udef & flagmap[c];
00138 else
00139 return 0;
00140 }
00141
00142
00143
00144
00145 void global_sanity_check(flags_t *flags)
00146 {
00147 unsigned long builtin = flags->builtin;
00148
00149
00150
00151 if (builtin & flagmap['d'] && builtin & flagmap['o'])
00152 builtin &= ~(flagmap['d'] | flagmap['o']);
00153
00154 if (builtin & flagmap['r'] && builtin & flagmap['l'])
00155 builtin &= ~(flagmap['r'] | flagmap['l']);
00156
00157 if (builtin & flagmap['q'] && builtin & flagmap['v'])
00158 builtin &= ~(flagmap['q'] | flagmap['v']);
00159
00160 if (builtin & flagmap['n'])
00161 builtin |= flagmap['m'];
00162
00163 if (builtin & flagmap['m'])
00164 builtin |= flagmap['t'] | flagmap['j'] | flagmap['o'];
00165
00166 if (builtin & flagmap['t'])
00167 builtin |= flagmap['p'];
00168
00169 if (builtin & flagmap['j'])
00170 builtin |= flagmap['x'] | flagmap['p'];
00171
00172 if (builtin & flagmap['o'])
00173 builtin |= flagmap['l'];
00174
00175 flags->builtin = builtin;
00176 }
00177
00178
00179
00180
00181 void channel_sanity_check(flags_t *flags)
00182 {
00183 unsigned long builtin = flags->builtin;
00184
00185
00186
00187 if (builtin & flagmap['d'] && builtin & flagmap['o'])
00188 builtin &= ~(flagmap['d'] | flagmap['o']);
00189
00190 if (builtin & flagmap['r'] && builtin & flagmap['l'])
00191 builtin &= ~(flagmap['r'] | flagmap['l']);
00192
00193 if (builtin & flagmap['q'] && builtin & flagmap['v'])
00194 builtin &= ~(flagmap['q'] | flagmap['v']);
00195
00196 if (builtin & flagmap['n'])
00197 builtin |= flagmap['m'];
00198
00199 if (builtin & flagmap['m'])
00200 builtin |= flagmap['o'];
00201
00202 if (builtin & flagmap['o'])
00203 builtin |= flagmap['l'];
00204
00205 flags->builtin = builtin;
00206 }