Mercurial > hg > MonetDB-extend
annotate cxx-reverse/reverse.cpp @ 55:68263b10998e
Updated: added bat_iterator_end.
author | Sjoerd Mullender <sjoerd@acm.org> |
---|---|
date | Wed, 26 Jan 2022 14:59:05 +0100 (2022-01-26) |
parents | 9ff721585946 |
children | 8122094c79b1 |
rev | line source |
---|---|
53
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
1 /* |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
2 * This Source Code Form is subject to the terms of the Mozilla Public |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
5 * |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
6 * Copyright 2013-2021 MonetDB B.V. |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
7 */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
8 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
9 /* monetdb_config.h must be included as the first include file */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
10 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
11 using namespace std; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
12 |
54
9ff721585946
Simplify a little. This works with current default branch.
Sjoerd Mullender <sjoerd@acm.org>
parents:
53
diff
changeset
|
13 #include <monetdb_config.h> |
53
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
14 |
54
9ff721585946
Simplify a little. This works with current default branch.
Sjoerd Mullender <sjoerd@acm.org>
parents:
53
diff
changeset
|
15 /* mal_exception.h actually contains everything we need */ |
9ff721585946
Simplify a little. This works with current default branch.
Sjoerd Mullender <sjoerd@acm.org>
parents:
53
diff
changeset
|
16 #include <mal_exception.h> |
53
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
17 |
54
9ff721585946
Simplify a little. This works with current default branch.
Sjoerd Mullender <sjoerd@acm.org>
parents:
53
diff
changeset
|
18 /* system include files */ |
9ff721585946
Simplify a little. This works with current default branch.
Sjoerd Mullender <sjoerd@acm.org>
parents:
53
diff
changeset
|
19 #include <string.h> |
53
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
20 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
21 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
22 /* dst is a buffer of length larger than len (i.e. dst[len] exists), |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
23 * src is a UTF-8-encoded string of length exactly len bytes */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
24 static void |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
25 do_reverse(char *dst, const char *src, size_t len) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
26 { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
27 dst[len] = 0; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
28 if (strNil(src)) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
29 /* special case for nil:str */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
30 assert(len == strlen(str_nil)); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
31 strcpy(dst, str_nil); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
32 return; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
33 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
34 /* all strings in MonetDB are encoded using UTF-8; we must |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
35 * make sure that the reversed string is also encoded in valid |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
36 * UTF-8, so we treat multibyte characters as single units */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
37 while (*src) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
38 if ((*src & 0xF8) == 0xF0) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
39 /* 4 byte UTF-8 sequence */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
40 assert(len >= 4); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
41 dst[len - 4] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
42 assert((*src & 0xC0) == 0x80); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
43 dst[len - 3] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
44 assert((*src & 0xC0) == 0x80); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
45 dst[len - 2] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
46 assert((*src & 0xC0) == 0x80); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
47 dst[len - 1] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
48 len -= 4; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
49 } else if ((*src & 0xF0) == 0xE0) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
50 /* 3 byte UTF-8 sequence */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
51 assert(len >= 3); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
52 dst[len - 3] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
53 assert((*src & 0xC0) == 0x80); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
54 dst[len - 2] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
55 assert((*src & 0xC0) == 0x80); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
56 dst[len - 1] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
57 len -= 3; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
58 } else if ((*src & 0xE0) == 0xC0) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
59 /* 2 byte UTF-8 sequence */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
60 assert(len >= 2); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
61 dst[len - 2] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
62 assert((*src & 0xC0) == 0x80); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
63 dst[len - 1] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
64 len -= 2; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
65 } else { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
66 /* 1 byte UTF-8 "sequence" */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
67 assert(len >= 1); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
68 assert((*src & 0x80) == 0); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
69 dst[--len] = *src++; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
70 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
71 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
72 assert(len == 0); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
73 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
74 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
75 extern "C" char * |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
76 UDFreverse(char **retval, const char **arg) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
77 { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
78 size_t len; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
79 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
80 len = strlen(*arg); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
81 *retval = (char*) GDKmalloc(len + 1); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
82 if (*retval == NULL) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
83 throw(MAL, "revstr.revstr", MAL_MALLOC_FAIL); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
84 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
85 do_reverse(*retval, *arg, len); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
86 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
87 return MAL_SUCCEED; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
88 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
89 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
90 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
91 extern "C" char * |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
92 UDFBATreverse(bat *retval, const bat *arg) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
93 { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
94 BAT *b, *bn; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
95 BATiter bi; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
96 BUN p, q; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
97 const char *src; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
98 size_t len; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
99 char *dst; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
100 size_t dstlen; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
101 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
102 /* allocate temporary space for reversed strings; we grow this |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
103 * if we need more */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
104 dstlen = 1024; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
105 dst = (char*) GDKmalloc(dstlen); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
106 if (dst == NULL) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
107 throw(MAL, "batrevstr.revstr", MAL_MALLOC_FAIL); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
108 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
109 b = BATdescriptor(*arg); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
110 if (b == NULL) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
111 GDKfree(dst); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
112 throw(MAL, "batrevstr.revstr", RUNTIME_OBJECT_MISSING); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
113 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
114 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
115 /* we should only get called for string BATs */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
116 assert(b->ttype == TYPE_str); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
117 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
118 /* allocate result BAT */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
119 bn = COLnew(b->hseqbase, TYPE_str, BATcount(b), TRANSIENT); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
120 if (bn == NULL) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
121 BBPunfix(b->batCacheid); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
122 GDKfree(dst); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
123 throw(MAL, "batrevstr.revstr", MAL_MALLOC_FAIL); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
124 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
125 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
126 /* loop through BAT b; p is index of the entry we're working |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
127 * on, q is used internally by BATloop to do the iterating */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
128 bi = bat_iterator(b); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
129 BATloop(b, p, q) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
130 src = (const char *) BUNtail(bi, p); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
131 len = strlen(src); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
132 /* make sure dst is large enough */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
133 if (len >= dstlen) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
134 char *ndst; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
135 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
136 dstlen = len + 1024; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
137 ndst = (char*) GDKrealloc(dst, dstlen); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
138 if (ndst == NULL) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
139 /* if GDKrealloc fails, dst is still |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
140 * allocated */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
141 goto bailout; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
142 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
143 dst = ndst; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
144 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
145 do_reverse(dst, src, len); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
146 if (BUNappend(bn, dst, false) != GDK_SUCCEED) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
147 /* BUNappend can fail since it may have to |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
148 * grow memory areas--especially true for |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
149 * string BATs */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
150 goto bailout; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
151 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
152 } |
55
68263b10998e
Updated: added bat_iterator_end.
Sjoerd Mullender <sjoerd@acm.org>
parents:
54
diff
changeset
|
153 bat_iterator_end(&bi); |
53
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
154 GDKfree(dst); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
155 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
156 BBPunfix(b->batCacheid); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
157 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
158 *retval = bn->batCacheid; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
159 BBPkeepref(bn->batCacheid); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
160 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
161 return MAL_SUCCEED; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
162 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
163 bailout: |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
164 /* we only get here in the case of an allocation error; clean |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
165 * up the mess we've created and throw an exception */ |
55
68263b10998e
Updated: added bat_iterator_end.
Sjoerd Mullender <sjoerd@acm.org>
parents:
54
diff
changeset
|
166 bat_iterator_end(&bi); |
53
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
167 GDKfree(dst); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
168 BBPunfix(b->batCacheid); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
169 BBPunfix(bn->batCacheid); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
170 throw(MAL, "batrevstr.revstr", MAL_MALLOC_FAIL); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
171 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
172 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
173 extern "C" { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
174 #include "mel.h" |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
175 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
176 static unsigned char reverse_sql[] = "CREATE FUNCTION reverse(src STRING)" |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
177 " RETURNS STRING EXTERNAL NAME reverse.revstr;"; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
178 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
179 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
180 #include "mal_import.h" |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
181 #include "sql_import.h" |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
182 #ifdef _MSC_VER |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
183 #undef read |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
184 #pragma section(".CRT$XCU",read) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
185 #endif |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
186 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
187 /* Only C++2x supports restricted C99 designator features. For once it does not support nested designators. |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
188 * So the helper macro's for declaring and registering are currently not useful for registering the MAL functions. |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
189 * There is also a bug in gcc that prevents the use of designators https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55227 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
190 * |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
191 * static mel_func reverse_init_funcs[] = { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
192 * command("reverse", "revstr", UDFreverse, false, "Reverse a string", args(1,2, arg("",str),arg("ra1",str))), |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
193 * command("batreverse", "revstr", UDFBATreverse, false, "Reverse a BAT of strings", args(1,2, batarg("",str),batarg("b",str))), |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
194 * { .imp=NULL }}; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
195 */ |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
196 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
197 static void set_arg(mel_arg& arg, uint8_t isbat) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
198 arg.isbat = isbat; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
199 strcpy(arg.type, "str"); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
200 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
201 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
202 static void set_func(mel_func& func, const char* mod, const char* fcn, fptr imp, uint8_t retc, uint8_t argc, mel_arg* args) { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
203 strcpy(func.mod, mod); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
204 strcpy(func.fcn, fcn); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
205 func.comment = NULL; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
206 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
207 func.imp = imp; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
208 func.command = 1; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
209 func.retc = retc; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
210 func.argc = argc; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
211 func.args = args; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
212 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
213 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
214 static mel_func reverse_init_funcs[2] = {0}; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
215 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
216 static mel_arg args[2] = {0}; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
217 static mel_arg batargs[2] = {0}; |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
218 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
219 LIB_STARTUP_FUNC(init_reverse) |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
220 { |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
221 set_arg(args[0], 0); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
222 set_arg(args[1], 0); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
223 set_func(reverse_init_funcs[0], "reverse", "revstr", (fptr) &UDFreverse, 1, 2, args); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
224 |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
225 set_arg(batargs[0], 1); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
226 set_arg(batargs[1], 1); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
227 set_func(reverse_init_funcs[1], "batreverse", "revstr", (fptr) &UDFBATreverse, 1, 2, batargs); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
228 mal_module("reverse", NULL, reverse_init_funcs); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
229 sql_register("reverse", reverse_sql); |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
230 } |
781ffab3a87a
Add c++ (in compilation only) version for reverse
Aris Koning <aris.koning@monetdbsolutions.com>
parents:
diff
changeset
|
231 } |