+ if (sp->lookahead != 't')
+ return 0;
+ if (sp->len == 4 && !memcmp(sp->tok, "data", sp->len))
+ {
+ if (n->which == DATA1N_data)
+ {
+ wrd->term_buf = n->u.data.data;
+ wrd->term_len = n->u.data.len;
+ }
+ sp_lex(sp);
+ }
+ else if (sp->len == 3 && !memcmp(sp->tok, "tag", sp->len))
+ {
+ if (n->which == DATA1N_tag)
+ {
+ wrd->term_buf = n->u.tag.tag;
+ wrd->term_len = strlen(n->u.tag.tag);
+ }
+ sp_lex(sp);
+ }
+ else if (sp->len == 4 && !memcmp(sp->tok, "attr", sp->len))
+ {
+ RecWord tmp_w;
+ sp_lex(sp);
+ if (sp->lookahead != '(')
+ return 0;
+ sp_lex(sp);
+
+ if (!sp_expr(sp, n, &tmp_w))
+ return 0;
+
+ wrd->term_buf = "";
+ wrd->term_len = 0;
+ if (n->which == DATA1N_tag)
+ {
+ data1_xattr *p = n->u.tag.attributes;
+ while (p && strlen(p->name) != tmp_w.term_len &&
+ memcmp (p->name, tmp_w.term_buf, tmp_w.term_len))
+ p = p->next;
+ if (p)
+ {
+ wrd->term_buf = p->value;
+ wrd->term_len = strlen(p->value);
+ }
+ }
+ if (sp->lookahead != ')')
+ return 0;
+ sp_lex(sp);
+ }
+ else if (sp->len == 5 && !memcmp(sp->tok, "first", sp->len))
+ {
+ return sp_first(sp, n, wrd);
+ }
+ else if (sp->len == 5 && !memcmp(sp->tok, "range", sp->len))
+ {
+ return sp_range(sp, n, wrd);
+ }
+ else if (sp->len > 0 && isdigit(*(unsigned char *)sp->tok))
+ {
+ char *b;
+ wrd->term_len = sp->len;
+ b = nmem_malloc(sp->nmem, sp->len);
+ memcpy(b, sp->tok, sp->len);
+ wrd->term_buf = b;
+ sp_lex(sp);
+ }
+ else if (sp->len > 2 && sp->tok[0] == '\'' && sp->tok[sp->len-1] == '\'')
+ {
+ char *b;
+ wrd->term_len = sp->len - 2;
+ b = nmem_malloc(sp->nmem, wrd->term_len);
+ memcpy(b, sp->tok+1, wrd->term_len);
+ wrd->term_buf = b;
+ sp_lex(sp);
+ }
+ else
+ {
+ wrd->term_buf = "";
+ wrd->term_len = 0;
+ sp_lex(sp);
+ }
+ return 1;