188 #ifdef STRCASECMP_IN_STRINGS_H
200 static int hex_to_ulong(
char *,
unsigned long,
unsigned long *);
202 #define STR(x) vstring_str(x)
207 const char *names,
const char *delim,
int flags)
209 const char *myname =
"name_mask";
210 char *saved_names =
mystrdup(names);
211 char *bp = saved_names;
215 int (*lookup) (
const char *,
const char *);
219 msg_panic(
"%s: missing NAME_MASK_FATAL/RETURN/WARN/IGNORE flag",
231 while ((name =
mystrtok(&bp, delim)) != 0) {
232 for (np = table; ; np++) {
235 && hex_to_ulong(name, ~0U, &ulval)) {
236 result |= (
unsigned int) ulval;
238 msg_fatal(
"unknown %s value \"%s\" in \"%s\"",
239 context, name, names);
241 msg_warn(
"unknown %s value \"%s\" in \"%s\"",
242 context, name, names);
246 msg_warn(
"unknown %s value \"%s\" in \"%s\"",
247 context, name, names);
251 if (lookup(name, np->
name) == 0) {
269 const char *myname =
"name_mask";
277 msg_panic(
"%s: missing NAME_MASK_NUMBER/FATAL/RETURN/WARN/IGNORE flag",
287 for (np = table; mask != 0; np++) {
292 msg_fatal(
"%s: unknown %s bit in mask: 0x%x",
293 myname, context, mask);
295 msg_warn(
"%s: unknown %s bit in mask: 0x%x",
296 myname, context, mask);
299 msg_warn(
"%s: unknown %s bit in mask: 0x%x",
300 myname, context, mask);
304 if (mask & np->
mask) {
320 const char *names,
const char *delim,
323 const char *myname =
"name_mask";
324 char *saved_names =
mystrdup(names);
325 char *bp = saved_names;
329 int (*lookup) (
const char *,
const char *);
333 msg_panic(
"%s: missing NAME_MASK_FATAL/RETURN/WARN/IGNORE flag",
345 while ((name =
mystrtok(&bp, delim)) != 0) {
346 for (np = table; ; np++) {
349 && hex_to_ulong(name, ~0UL, &ulval)) {
352 msg_fatal(
"unknown %s value \"%s\" in \"%s\"",
353 context, name, names);
355 msg_warn(
"unknown %s value \"%s\" in \"%s\"",
356 context, name, names);
360 msg_warn(
"unknown %s value \"%s\" in \"%s\"",
361 context, name, names);
365 if (lookup(name, np->
name) == 0) {
382 long mask,
int flags)
384 const char *myname =
"name_mask";
392 msg_panic(
"%s: missing NAME_MASK_NUMBER/FATAL/RETURN/WARN/IGNORE flag",
402 for (np = table; mask != 0; np++) {
407 msg_fatal(
"%s: unknown %s bit in mask: 0x%lx",
408 myname, context, mask);
410 msg_warn(
"%s: unknown %s bit in mask: 0x%lx",
411 myname, context, mask);
414 msg_warn(
"%s: unknown %s bit in mask: 0x%lx",
415 myname, context, mask);
419 if (mask & np->
mask) {
433 static int hex_to_ulong(
char *value,
unsigned long mask,
unsigned long *ulp)
435 unsigned long result;
447 result = strtoul(value, &cp, 16);
448 if (*cp !=
'\0' || errno == ERANGE)
451 *ulp = (result & mask);
452 return (*ulp == result);
464 int main(
int argc,
char **argv)
473 static const NAME_MASK feature_table[] = {
486 int out_feature_mask;
488 const char *demo_str;
493 msg_fatal(
"usage: %s in-feature-mask out-feature-mask", argv[0]);
494 in_feature_mask =
name_mask(argv[1], feature_table, argv[1]);
495 out_feature_mask =
name_mask(argv[2], feature_table, argv[2]);
498 STR(in_buf), in_feature_mask);
500 demo_mask, out_feature_mask);
502 STR(in_buf), demo_mask,
503 demo_str ? demo_str :
"(null)");
char * mystrdup(const char *str)
int vstring_get_nonl(VSTRING *vp, VSTREAM *fp)
NORETURN msg_panic(const char *fmt,...)
const char * str_long_name_mask_opt(VSTRING *buf, const char *context, const LONG_NAME_MASK *table, long mask, int flags)
int main(int argc, char **argv)
VSTRING * vstring_truncate(VSTRING *vp, ssize_t len)
char * mystrtok(char **src, const char *sep)
int strncasecmp(const char *s1, const char *s2, size_t n)
#define VSTRING_TERMINATE(vp)
#define STR_NAME_MASK_REQUIRED
VSTRING * vstring_sprintf_append(VSTRING *vp, const char *format,...)
long long_name_mask_delim_opt(const char *context, const LONG_NAME_MASK *table, const char *names, const char *delim, int flags)
const char * str_name_mask_opt(VSTRING *buf, const char *context, const NAME_MASK *table, int mask, int flags)
VSTREAM * vstream_printf(const char *fmt,...)
#define VSTRING_RESET(vp)
void msg_warn(const char *fmt,...)
int name_mask_delim_opt(const char *context, const NAME_MASK *table, const char *names, const char *delim, int flags)
VSTRING * vstring_alloc(ssize_t len)
#define name_mask(tag, table, str)
NORETURN msg_fatal(const char *fmt,...)
int vstream_fflush(VSTREAM *stream)
int strcasecmp(const char *s1, const char *s2)
VSTRING * vstring_free(VSTRING *vp)
#define NAME_MASK_DEFAULT
#define NAME_MASK_ANY_CASE
#define NAME_MASK_REQUIRED
#define name_mask_opt(tag, table, str, flags)
void msg_info(const char *fmt,...)