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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }