1 /* This file is part of the YAZ toolkit.
2 * Copyright (C) 1995-2011 Index Data
3 * See the file LICENSE for details.
7 * \brief CQL sortkeys utilities
17 #include <yaz/wrbuf.h>
20 static void pr_n(void (*pr)(const char *buf, void *client_data),
21 const char *buf, int len, void *client_data)
28 if (left >= sizeof(tmp))
30 memcpy(tmp, buf, sizeof(tmp)-1);
31 tmp[sizeof(tmp)-1] = '\0';
32 left = left - (sizeof(tmp)-1);
43 static int cql_sort_modifiers(struct cql_node *cn,
44 void (*pr)(const char *buf, void *client_data),
48 int caseSensitive = 0;
49 const char *missingValue = "highValue";
50 for (; cn; cn = cn->u.st.modifiers)
52 const char *indx = cn->u.st.index;
53 if (!strcmp(indx, "ignoreCase"))
55 else if (!strcmp(indx, "respectCase"))
57 else if (!strcmp(indx, "ascending"))
59 else if (!strcmp(indx, "descending"))
61 else if (!strcmp(indx, "missingOmit"))
62 missingValue = "omit";
63 else if (!strcmp(indx, "missingFail"))
64 missingValue = "abort";
65 else if (!strcmp(indx, "missingLow"))
66 missingValue = "lowValue";
67 else if (!strcmp(indx, "missingHigh"))
68 missingValue = "highValue";
72 pr(ascending ? "1" : "0", client_data);
74 pr(caseSensitive ? "1" : "0", client_data);
76 pr(missingValue, client_data);
80 int cql_sortby_to_sortkeys(struct cql_node *cn,
81 void (*pr)(const char *buf, void *client_data),
85 if (cn && cn->which == CQL_NODE_SORT)
87 for (; cn; cn = cn->u.sort.next)
89 const char *indx = cn->u.sort.index;
93 const char *s = strchr(indx, '.');
98 pr_n(pr, indx, s - indx, client_data);
102 pr(indx, client_data);
103 pr(",", client_data);
105 pr(",", client_data);
106 r = cql_sort_modifiers(cn->u.sort.modifiers, pr, client_data);
110 pr(" ", client_data);
117 int cql_sortby_to_sortkeys_buf(struct cql_node *cn, char *out, int max)
119 struct cql_buf_write_info info;
125 r = cql_sortby_to_sortkeys(cn, cql_buf_write_handler, &info);
127 info.buf[info.off] = '\0';
134 * c-file-style: "Stroustrup"
135 * indent-tabs-mode: nil
137 * vim: shiftwidth=4 tabstop=8 expandtab