HTAddRule(op, word2, word3);
switch (op) { case HT_Fail:	 case HT_PermitRedir: cond_op = word3; if (cond_op && *cond_op) { word3 = NULL; cond = HTNextField(&pointer); } break;  case HT_Pass:	 if (word3 && (!strcasecomp(word3, "if") || !strcasecomp(word3, "unless"))) { cond_op = word3; word3 = NULL; cond = HTNextField(&pointer); break; }   case HT_Map:	 case HT_Redirect: case HT_RedirectPerm: case HT_UseProxy: cond_op = HTNextField(&pointer);  if (op==HT_Redirect && 0==strcasecomp(word1, "redirect") && cond_op && strcasecomp(cond_op, "if") && strcasecomp(cond_op, "unless")) { if (0==strcmp(word2, "301") || 0==strcasecomp(word2, "permanent")) { op = HT_RedirectPerm; } else if (!(0==strcmp(word2, "302") || 0==strcmp(word2, "303") || 0==strcasecomp(word2, "temp") || 0==strcasecomp(word2, "seeother"))) { CTRACE((tfp, "Rule: Ignoring `%s' in Redirect\n", word2)); } word2 = word3; word3 = cond_op;  cond_op = HTNextField(&pointer); } if (cond_op && *cond_op) cond = HTNextField(&pointer); break;  case HT_Progress: case HT_InfoMsg: case HT_UserMsg: case HT_Alert: case HT_AlwaysAlert: cond_op = HTNextField(&pointer); if (cond_op && *cond_op) cond = HTNextField(&pointer); if (word3) {	 char *cp = word3, *cp1, *cp2; while ((cp1=strchr(cp, '%'))) { if (cp1[1] == '\0') { *cp1 = '\0'; break; } else if (cp1[1] == '%') { cp = cp1 + 2; continue; } else while ((cp2=strchr(cp1+2, '%'))) { if (cp2[1] == '\0') { *cp2 = '\0'; break; } else if (cp2[1] == '%') { cp1 = cp2; } else { *cp2 = '?';  cp1 = cp2; } } break; } } break;  default: break; } if (cond_op && cond && *cond && !strcasecomp(cond_op, "unless")) { cond_op = "unless"; } else if (cond_op && cond && *cond && !strcasecomp(cond_op, "if")) { cond_op = "if"; } else if (cond_op || cond) { fprintf(stderr, "HTRule: %s '%s'\n", RULE_INCORRECT, config); FREE(line);	 return -2;	 } if (cond && !strncasecomp(cond, "redirected", strlen(cond))) { cond = "redirected";  } else if (cond && strlen(cond) >= 8 && !strncasecomp(cond, "userspecified", strlen(cond))) { cond = "userspec";  } HTAddRule(op, word2, word3, cond_op, cond);
PUBLIC int  HTSetConfiguration ARGS1(    char *,		config){    HTRuleOp op;    char * line = NULL;    char * pointer = line;    char *word1, *word2, *word3;    float quality, secs, secs_per_byte;    int maxbytes;    int status;    StrAllocCopy(line, config);    {	char * p = strchr(line, '#');	/* Chop off comments */	if (p) *p = 0;    }    pointer = line;    word1 = HTNextField(&pointer);    if (!word1) {	FREE(line);	return 0;    } ; /* Comment only or blank */    word2 = HTNextField(&pointer);    if (0==strcasecomp(word1, "defprot") ||	0==strcasecomp(word1, "protect"))	word3 = pointer;  /* The rest of the line to be parsed by AA module */    else	word3 = HTNextField(&pointer);	/* Just the next word */    if (!word2) {	fprintf(stderr, "HTRule: %s %s\n", RULE_NEEDS_DATA, line);	FREE(line);	return -2;	/*syntax error */    }    if (0==strcasecomp(word1, "suffix")) {	char * encoding = HTNextField(&pointer);	if (pointer) status = sscanf(pointer, "%f", &quality);	else status = 0;	HTSetSuffix(word2,	word3,				encoding ? encoding : "binary",				status >= 1? quality : 1.0);    } else if (0==strcasecomp(word1, "presentation")) {	if (pointer) status = sscanf(pointer, "%f%f%f%d",			    &quality, &secs, &secs_per_byte, &maxbytes);	else status = 0;	HTSetPresentation(word2, word3,		    status >= 1? quality		: 1.0,		    status >= 2 ? secs			: 0.0,		    status >= 3 ? secs_per_byte 	: 0.0,		    status >= 4 ? maxbytes		: 0 );    } else if (0==strncasecomp(word1, "htbin", 5) ||	       0==strncasecomp(word1, "bindir", 6)) {	StrAllocCopy(HTBinDir, word2);	/* Physical /htbin location */    } else if (0==strncasecomp(word1, "search", 6)) {	StrAllocCopy(HTSearchScript, word2);	/* Search script name */    } else {	op =	0==strcasecomp(word1, "map")  ? HT_Map	    :	0==strcasecomp(word1, "pass") ? HT_Pass	    :	0==strcasecomp(word1, "fail") ? HT_Fail	    :	0==strcasecomp(word1, "defprot") ? HT_DefProt	    :	0==strcasecomp(word1, "protect") ? HT_Protect	    :						HT_Invalid;	if (op==HT_Invalid) {	    fprintf(stderr, "HTRule: %s '%s'\n", RULE_INCORRECT, config);	} else {	    HTAddRule(op, word2, word3);	}    }    FREE(line);    return 0;}