+/*
+ * attr_print: log attributes
+ */
+static void attr_print (Z_AttributesPlusTerm *t)
+{
+ int of, i;
+ for (of = 0; of < t->num_attributes; of++)
+ {
+ Z_AttributeElement *element;
+ element = t->attributeList[of];
+
+ switch (element->which)
+ {
+ case Z_AttributeValue_numeric:
+ logf (LOG_DEBUG, "attributeType=%d value=%d",
+ *element->attributeType,
+ *element->value.numeric);
+ break;
+ case Z_AttributeValue_complex:
+ logf (LOG_DEBUG, "attributeType=%d complex",
+ *element->attributeType);
+ for (i = 0; i<element->value.complex->num_list; i++)
+ {
+ if (element->value.complex->list[i]->which ==
+ Z_StringOrNumeric_string)
+ logf (LOG_DEBUG, " string: '%s'",
+ element->value.complex->list[i]->u.string);
+ else if (element->value.complex->list[i]->which ==
+ Z_StringOrNumeric_numeric)
+ logf (LOG_DEBUG, " numeric: '%d'",
+ *element->value.complex->list[i]->u.numeric);
+ }
+ break;
+ default:
+ assert (0);
+ }
+ }
+}
+
+typedef struct {
+ int type;
+ int major;
+ int minor;
+ Z_AttributesPlusTerm *zapt;
+} AttrType;
+
+static int attr_find (AttrType *src)
+{
+ while (src->major < src->zapt->num_attributes)
+ {
+ Z_AttributeElement *element;
+ element = src->zapt->attributeList[src->major];
+
+ if (src->type == *element->attributeType)
+ {
+ switch (element->which)
+ {
+ case Z_AttributeValue_numeric:
+ ++(src->major);
+ return *element->value.numeric;
+ break;
+ case Z_AttributeValue_complex:
+ if (src->minor >= element->value.complex->num_list ||
+ element->value.complex->list[src->minor]->which !=
+ Z_StringOrNumeric_numeric)
+ break;
+ ++(src->minor);
+ return *element->value.complex->list[src->minor-1]->u.numeric;
+ default:
+ assert (0);
+ }
+ }
+ ++(src->major);
+ }
+ return -1;
+}
+
+static void attr_init (AttrType *src, Z_AttributesPlusTerm *zapt,
+ int type)
+{
+ src->zapt = zapt;
+ src->type = type;
+ src->major = 0;
+ src->minor = 0;
+}
+
+static ISAM_P *isam_p_buf = NULL;
+static int isam_p_size = 0;
+static int isam_p_indx;
+
+static void add_isam_p (const char *info)
+{
+ if (isam_p_indx == isam_p_size)
+ {
+ ISAM_P *new_isam_p_buf;
+
+ isam_p_size = 2*isam_p_size + 100;
+ new_isam_p_buf = xmalloc (sizeof(*new_isam_p_buf) *
+ isam_p_size);
+ if (isam_p_buf)
+ {
+ memcpy (new_isam_p_buf, isam_p_buf,
+ isam_p_indx * sizeof(*isam_p_buf));
+ xfree (isam_p_buf);
+ }
+ isam_p_buf = new_isam_p_buf;
+ }
+ assert (*info == sizeof(*isam_p_buf));
+ memcpy (isam_p_buf + isam_p_indx, info+1, sizeof(*isam_p_buf));
+ isam_p_indx++;
+}
+
+static int grep_handle (Dict_char *name, const char *info)
+{
+ logf (LOG_DEBUG, "dict name: %s", name);
+ add_isam_p (info);
+ return 0;
+}
+
+static int trunc_term (ZServerInfo *zi, Z_AttributesPlusTerm *zapt,
+ ISAM_P **isam_ps,
+ int *no, int split_flag)