Mercurial > hg > MonetDB-extend
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 |
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 } |