CTRACE(tfp, "%s `%s' already in cache\n", "HTAAProt_new: Protection file", prot_filename);
CTRACE((tfp, "%s `%s' already in cache\n", "HTAAProt_new: Protection file", prot_filename));
PRIVATE HTAAProt *HTAAProt_new ARGS3(CONST char *,	cur_docname,				     CONST char *,	prot_filename,				     CONST char *,	ids){    HTList *cur = prot_cache;    HTAAProtCache *cache_item = NULL;    HTAAProt *prot;    FILE *fp;    if (!prot_cache)	prot_cache = HTList_new();    while (NULL != (cache_item = (HTAAProtCache*)HTList_nextObject(cur))) {	if (!strcmp(cache_item->prot_filename, prot_filename))	    break;    }    if (cache_item) {	prot = cache_item->prot;	CTRACE(tfp, "%s `%s' already in cache\n",		    "HTAAProt_new: Protection file", prot_filename);    } else {	CTRACE(tfp, "HTAAProt_new: Loading protection file `%s'\n",		    prot_filename);	if (!(prot = (HTAAProt*)calloc(1, sizeof(HTAAProt))))	    outofmem(__FILE__, "HTAAProt_new");	prot->template	= NULL;	prot->filename	= NULL;	prot->uid_name	= NULL;	prot->gid_name	= NULL;	prot->valid_schemes = HTList_new();	prot->mask_group= NULL;		/* Masking disabled by defaults */	prot->values	= HTAssocList_new();	if (prot_filename && NULL != (fp = fopen(prot_filename, "r"))) {	    HTAA_parseProtFile(prot, fp);	    fclose(fp);	    if (!(cache_item =	    		(HTAAProtCache*)calloc(1, sizeof(HTAAProtCache))))		outofmem(__FILE__, "HTAAProt_new");	    cache_item->prot = prot;	    cache_item->prot_filename = NULL;	    StrAllocCopy(cache_item->prot_filename, prot_filename);	    HTList_addObject(prot_cache, (void*)cache_item);	} else {	    CTRACE(tfp, "HTAAProt_new: %s `%s'\n",			"Unable to open protection setup file",			(prot_filename ? prot_filename : "(null)"));	}    }    if (cur_docname)	StrAllocCopy(prot->filename, cur_docname);    HTAA_setIds(prot, ids);    return prot;}