case STRING: { char *termstr, *usestr = ABSENT_STRING;
if (usestr == ABSENT_STRING && termstr == ABSENT_STRING) return (FAIL); else if (!usestr || !termstr || capcmp(usestr, termstr)) return (TRUE); else return (FAIL); } }
static int use_predicate(int type, int idx)/* predicate function to use for use decompilation */{	TERMTYPE *tp;	switch(type)	{	case BOOLEAN: {		int is_set = FALSE;		/*		 * This assumes that multiple use entries are supposed		 * to contribute the logical or of their boolean capabilities.		 * This is true if we take the semantics of multiple uses to		 * be 'each capability gets the first non-default value found		 * in the sequence of use entries'.		 */		for (tp = &term[1]; tp < term + termcount; tp++)			if (tp->Booleans[idx]) {				is_set = TRUE;				break;			}			if (is_set != term->Booleans[idx])				return(!is_set);			else				return(FAIL);		}	case NUMBER: {		int	value = ABSENT_NUMERIC;		/*		 * We take the semantics of multiple uses to be 'each		 * capability gets the first non-default value found		 * in the sequence of use entries'.		 */		for (tp = &term[1]; tp < term + termcount; tp++)			if (tp->Numbers[idx] >= 0) {				value = tp->Numbers[idx];				break;			}		if (value != term->Numbers[idx])			return(value != ABSENT_NUMERIC);		else			return(FAIL);		}	case STRING: {		char *termstr, *usestr = ABSENT_STRING;		termstr = term->Strings[idx];		/*		 * We take the semantics of multiple uses to be 'each		 * capability gets the first non-default value found		 * in the sequence of use entries'.		 */		for (tp = &term[1]; tp < term + termcount; tp++)			if (tp->Strings[idx])			{				usestr = tp->Strings[idx];				break;			}		if (usestr == ABSENT_STRING && termstr == ABSENT_STRING)			return(FAIL);		else if (!usestr || !termstr || capcmp(usestr, termstr))			return(TRUE);		else			return(FAIL);	    }	}	return(FALSE);	/* pacify compiler */}