+
+/*
+ * Definitions of custom attributes:
+ *
+ * INT_ATTR(type, id, oattr, keyword, get_func, parse_func)
+ *
+ * type data type used to hold the value
+ * id C identifier of the attribute
+ * oattr object attribute we get the value from
+ * keywd search server keyword for the attribute
+ * void get_func(struct card_attr *ca, byte *attr)
+ * parse object attribute (may be NULL)
+ * byte *parse_func(u32 *dest, byte *value, uns intval)
+ * parse value in query (returns error message or NULL)
+ * for KEYWD = "string", it gets value="string", intval=0
+ * for KEYWD = num, it gets value=NULL, intval=num.
+ *
+ * A good place for definitions of the functions is lib/custom.c.
+ *
+ * Please order the attributes by decreasing size to get optimum padding.
+ */
+
+#if 0 /* Example */
+
+#define CUSTOM_ATTRS INT_ATTR(u32, lm, 'L', LM, custom_get_lm, custom_parse_lm)
+
+struct card_attr;
+void custom_get_lm(struct card_attr *ca, byte *attr);
+byte *custom_parse_lm(u32 *dest, byte *value, uns intval);
+
+#else
+
+#define CUSTOM_ATTRS
+
+#endif