annotate reverse/reverse.c @ 5:c3f23ea91e48

Updates for current MonetDB release.
author Sjoerd Mullender <sjoerd@acm.org>
date Tue, 01 Dec 2015 22:22:31 +0100 (2015-12-01)
parents de61daddf5ab
children 2047fa5d7dd7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
1 /*
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
2 * This Source Code Form is subject to the terms of the Mozilla Public
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
5 *
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
6 * Copyright 2008-2015 MonetDB B.V.
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
7 */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
8
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
9 /* monetdb_config.h must be included as the first include file */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
10 #include <monetdb_config.h>
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
11
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
12 /* mal_exception.h actually contains everything we need */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
13 #include <mal_exception.h>
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
14
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
15 /* system include files */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
16 #include <string.h>
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
17
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
18 /* dst is a buffer of length larger than len (i.e. dst[len] exists),
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
19 * src is a UTF-8-encoded string of length exactly len bytes */
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
20 static void
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
21 do_reverse(char *dst, const char *src, size_t len)
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
22 {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
23 dst[len] = 0;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
24 if (strcmp(src, str_nil) == 0) {
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
25 /* special case for nil:str */
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
26 assert(len == strlen(str_nil));
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
27 strcpy(dst, str_nil);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
28 return;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
29 }
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
30 /* all strings in MonetDB are encoded using UTF-8; we must
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
31 * make sure that the reversed string is also encoded in valid
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
32 * UTF-8, so we treat multibyte characters as single units */
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
33 while (*src) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
34 if ((*src & 0xF8) == 0xF0) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
35 /* 4 byte UTF-8 sequence */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
36 assert(len >= 4);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
37 dst[len - 4] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
38 assert((*src & 0xC0) == 0x80);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
39 dst[len - 3] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
40 assert((*src & 0xC0) == 0x80);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
41 dst[len - 2] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
42 assert((*src & 0xC0) == 0x80);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
43 dst[len - 1] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
44 len -= 4;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
45 } else if ((*src & 0xF0) == 0xE0) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
46 /* 3 byte UTF-8 sequence */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
47 assert(len >= 3);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
48 dst[len - 3] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
49 assert((*src & 0xC0) == 0x80);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
50 dst[len - 2] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
51 assert((*src & 0xC0) == 0x80);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
52 dst[len - 1] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
53 len -= 3;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
54 } else if ((*src & 0xE0) == 0xC0) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
55 /* 2 byte UTF-8 sequence */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
56 assert(len >= 2);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
57 dst[len - 2] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
58 assert((*src & 0xC0) == 0x80);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
59 dst[len - 1] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
60 len -= 2;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
61 } else {
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
62 /* 1 byte UTF-8 "sequence" */
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
63 assert(len >= 1);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
64 assert((*src & 0x80) == 0);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
65 dst[--len] = *src++;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
66 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
67 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
68 assert(len == 0);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
69 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
70
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
71 /* __declspec() must be used on Windows, but not on other systems */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
72 #ifndef _MSC_VER
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
73 /* not Windows */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
74 #define __declspec(x) /* nothing */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
75 #endif
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
76
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
77 extern __declspec(dllexport) char *UDFreverse(char **retval, const char **arg);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
78 extern __declspec(dllexport) char *UDFBATreverse(bat *retval, const bat *arg);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
79
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
80 char *
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
81 UDFreverse(char **retval, const char **arg)
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
82 {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
83 size_t len;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
84
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
85 len = strlen(*arg);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
86 *retval = GDKmalloc(len + 1);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
87 if (*retval == NULL)
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
88 throw(MAL, "reverse.reverse", MAL_MALLOC_FAIL);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
89
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
90 do_reverse(*retval, *arg, len);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
91
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
92 return MAL_SUCCEED;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
93
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
94 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
95
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
96 char *
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
97 UDFBATreverse(bat *retval, const bat *arg)
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
98 {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
99 BAT *b, *bn;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
100 BATiter bi;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
101 BUN p, q;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
102 const char *src;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
103 size_t len;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
104 char *dst;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
105 size_t dstlen;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
106
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
107 /* allocate temporary space for reversed strings; we grow this
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
108 * if we need more */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
109 dstlen = 1024;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
110 dst = GDKmalloc(dstlen);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
111 if (dst == NULL)
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
112 throw(MAL, "batreverse.reverse", MAL_MALLOC_FAIL);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
113
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
114 b = BATdescriptor(*arg);
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
115 if (b == NULL) {
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
116 GDKfree(dst);
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
117 throw(MAL, "batreverse.reverse", RUNTIME_OBJECT_MISSING);
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
118 }
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
119
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
120 /* we should only get called for string BATs */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
121 assert(b->ttype == TYPE_str);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
122
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
123 /* allocate result BAT */
2
22a95811ba05 Updated to new interface of BATnew.
Sjoerd Mullender <sjoerd@acm.org>
parents: 0
diff changeset
124 bn = BATnew(TYPE_void, TYPE_str, BATcount(b), TRANSIENT);
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
125 if (bn == NULL) {
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
126 BBPunfix(b->batCacheid);
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
127 GDKfree(dst);
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
128 throw(MAL, "batreverse.reverse", MAL_MALLOC_FAIL);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
129 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
130
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
131 /* copy seqbase from old to new */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
132 BATseqbase(bn, b->hseqbase);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
133
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
134 /* loop through BAT b; p is index of the entry we're working
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
135 * on, q is used internally by BATloop to do the iterating */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
136 bi = bat_iterator(b);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
137 BATloop(b, p, q) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
138 src = (const char *) BUNtail(bi, p);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
139 len = strlen(src);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
140 /* make sure dst is large enough */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
141 if (len >= dstlen) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
142 char *ndst;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
143
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
144 dstlen = len + 1024;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
145 ndst = GDKrealloc(dst, dstlen);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
146 if (ndst == NULL) {
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
147 /* if GDKrealloc fails, dst is still
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
148 * allocated */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
149 goto bailout;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
150 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
151 dst = ndst;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
152 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
153 do_reverse(dst, src, len);
5
c3f23ea91e48 Updates for current MonetDB release.
Sjoerd Mullender <sjoerd@acm.org>
parents: 3
diff changeset
154 if (BUNappend(bn, dst, 0) != GDK_SUCCEED) {
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
155 /* BUNappend can fail since it may have to
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
156 * grow memory areas--especially true for
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
157 * string BATs */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
158 goto bailout;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
159 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
160 }
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
161 GDKfree(dst);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
162
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
163 BBPunfix(b->batCacheid);
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
164
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
165 *retval = bn->batCacheid;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
166 BBPkeepref(bn->batCacheid);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
167
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
168 return MAL_SUCCEED;
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
169
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
170 bailout:
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
171 /* we only get here in the case of an allocation error; clean
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
172 * up the mess we've created and throw an exception */
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
173 GDKfree(dst);
3
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
174 BBPunfix(b->batCacheid);
de61daddf5ab Updated copyrights and code, added comments, extended tutorial.
Sjoerd Mullender <sjoerd@acm.org>
parents: 2
diff changeset
175 BBPunfix(bn->batCacheid);
0
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
176 throw(MAL, "batreverse.reverse", MAL_MALLOC_FAIL);
a1080ed7fe4d Created an example UDF for a SQL reverse() function.
Sjoerd Mullender <sjoerd@acm.org>
parents:
diff changeset
177 }