This sequence of lookups and then processing is all the same except for property and token - it would be better to use an array which is then iterated through in order. e.g.

    static struct { Properties prop; const char *tag; } s_preprocess_props[] =
    {
        { P_RECTANGLE, "rectangle" },
        ...
    }

You can check the length of the array by using sizeof(s_preprocess_props) / sizeof(s_preprocess_props[0]).