# Rule Files

The W3C Library provides this module for handling configuration files (a.k.a. rule files). Rule files can be used to initialize as much as the application desires including setting up new protocol modules etc. Also the rules file do not have to be a file - it can be a database or any other way of storage information. This implementation is not used by the Library at all and is part of the Application interface. The syntax of the rule files is described in the rule file syntax section of this manual

Parsing a whole rule file is done using a converter stream. This means that a rule file can come from anywhere, even across the network. We have defined a special content type for rule files called `WWW_RULES` in HTFormat.

In some situations, a set of rules comes from a subset of a file or some other origin, for example INI files for X resources. In that case, you can also parse a single line from a rules file using the following function:

    extern BOOL HTRule_parseLine (HTList * list, const char * config);

You can add a rule to a list of rules as any other preference. The `pattern` is a string containing a single "*". `replace` points to the equivalent string with * for the place where the text matched by * goes.

    typedef enum _HTRuleOp {
        HT_Invalid,
        HT_Map,
        HT_Pass,
        HT_Fail,
        HT_DefProt,
        HT_Protect,
        HT_Exec,
        HT_Redirect,
        HT_UseProxy
    } HTRuleOp;

    extern BOOL HTRule_add (HTList * list, HTRuleOp op, const char * pattern, const char * replace);

And as normal you can delete a set of rules by using this function:

    extern BOOL HTRule_deleteAll (HTList *list);

## Global Rules

Rules are handled as list as everything else that has to do with preferences. We provide two functions for getting and setting the global rules:

    extern HTList * HTRule_global	(void);
    extern BOOL HTRule_setGlobal	(HTList * list);

## Translate by rules

This function walks through the list of rules and translates the reference when matches are found. The list is traversed in order starting from the head of the list. It returns the address of the equivalent string allocated from the heap which the CALLER MUST FREE. If no translation occured, then it is a copy of the original.

    extern char * HTRule_translate (HTList * list, const char * token, BOOL ignore_case);