CTRACE(tfp, "%s %s `%s'\n",
CTRACE((tfp, "%s %s `%s'\n",
PRIVATE void HTAA_parseProtFile ARGS2(HTAAProt *, prot,				      FILE *,	  fp){    if (prot && fp) {	LexItem lex_item;	char *fieldname = NULL;	while (LEX_EOF != (lex_item = lex(fp))) {	    while (lex_item == LEX_REC_SEP)	/* Ignore empty lines */		lex_item = lex(fp);	    if (lex_item == LEX_EOF)		/* End of file */		break;	    if (lex_item == LEX_ALPH_STR) {	/* Valid setup record */		StrAllocCopy(fieldname, HTlex_buffer);		if (LEX_FIELD_SEP != (lex_item = lex(fp)))		    unlex(lex_item);	/* If someone wants to use colon */		                        /* after field name it's ok, but */		                        /* not required. Here we read it.*/		if (0==strncasecomp(fieldname, "Auth", 4)) {		    lex_item = lex(fp);		    while (lex_item == LEX_ALPH_STR) {			HTAAScheme scheme = HTAAScheme_enum(HTlex_buffer);			if (scheme != HTAA_UNKNOWN) {			    if (!prot->valid_schemes)				prot->valid_schemes = HTList_new();			    HTList_addObject(prot->valid_schemes,(void*)scheme);			    CTRACE(tfp, "%s %s `%s'\n",				        "HTAA_parseProtFile: valid",				        "authentication scheme:",				        HTAAScheme_name(scheme));			} else {			    CTRACE(tfp, "%s %s `%s'\n",					"HTAA_parseProtFile: unknown",					"authentication scheme:",					HTlex_buffer);			}			if (LEX_ITEM_SEP != (lex_item = lex(fp)))			    break;			/*			** Here lex_item == LEX_ITEM_SEP; after item separator			** it is ok to have one or more newlines (LEX_REC_SEP)			** and they are ignored (continuation line).			*/			do {			    lex_item = lex(fp);			} while (lex_item == LEX_REC_SEP);		    } /* while items in list */		} /* if "Authenticate" */		else if (0==strncasecomp(fieldname, "mask", 4)) {		    prot->mask_group = HTAA_parseGroupDef(fp);		    lex_item=LEX_REC_SEP; /*groupdef parser read this already*/		    if (TRACE) {			if (prot->mask_group) {			    fprintf(tfp,				    "HTAA_parseProtFile: Mask group:\n");			    HTAA_printGroupDef(prot->mask_group);			} else fprintf(tfp, "HTAA_parseProtFile: Mask group syntax error\n");		    }		} /* if "Mask" */		else {	/* Just a name-value pair, put it to assoclist */		    if (LEX_ALPH_STR == (lex_item = lex(fp))) {			if (!prot->values)			    prot->values = HTAssocList_new();			HTAssocList_add(prot->values, fieldname, HTlex_buffer);			lex_item = lex(fp);  /* Read record separator */			CTRACE(tfp, "%s `%s' bound to value `%s'\n",				    "HTAA_parseProtFile: Name",				    fieldname, HTlex_buffer);		    }		} /* else name-value pair */	    } /* if valid field */	    if (lex_item != LEX_EOF  &&  lex_item != LEX_REC_SEP) {		CTRACE(tfp, "%s %s %d (that line ignored)\n",			    "HTAA_parseProtFile: Syntax error",			    "in protection setup file at line",			    HTlex_line);		do {		    lex_item = lex(fp);		} while (lex_item != LEX_EOF && lex_item != LEX_REC_SEP);	    } /* if syntax error */	} /* while not end-of-file */	FREE(fieldname);    } /* if valid parameters */}