1 /*
2  * Copyright (C) 2020 Linux Studio Plugins Project <https://lsp-plug.in/>
3  *           (C) 2020 Vladimir Sadovnikov <sadko4u@gmail.com>
4  *
5  * This file is part of lsp-plugins
6  * Created on: 6 сент. 2019 г.
7  *
8  * lsp-plugins is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * any later version.
12  *
13  * lsp-plugins is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with lsp-plugins. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #include <core/files/java/wrappers.h>
23 
24 namespace lsp
25 {
26     namespace java
27     {
28         #define WRAPPER_DEF(name, type_t) \
29             const char *name::CLASS_NAME = "java.lang." #name; \
30             \
31             name::name(): Object(CLASS_NAME) {} \
32             \
33             name::~name() {} \
34             \
35             type_t name::value() const \
36             { \
37                 if (nSlots <= 0) return 0; \
38                 object_slot_t *s = &vSlots[nSlots-1]; \
39                 if (s->size < sizeof(type_t)) return 0; \
40                 type_t *ptr = reinterpret_cast<type_t *>(&vData[s->offset]); \
41                 return *ptr; \
42             } \
43             \
44             status_t name::get_value(type_t *dst) const \
45             { \
46                 if (nSlots <= 0) return STATUS_CORRUPTED; \
47                 object_slot_t *s = &vSlots[nSlots-1]; \
48                 if (s->size < sizeof(type_t)) return STATUS_CORRUPTED; \
49                 type_t *ptr = reinterpret_cast<type_t *>(&vData[s->offset]); \
50                 if (dst != NULL) *dst = *ptr; \
51                 return STATUS_OK; \
52             } \
53 
54         WRAPPER_DEF(Byte, byte_t);
55         WRAPPER_DEF(Short, short_t);
56         WRAPPER_DEF(Integer, int_t);
57         WRAPPER_DEF(Long, long_t);
58         WRAPPER_DEF(Double, double_t);
59         WRAPPER_DEF(Float, float_t);
60         WRAPPER_DEF(Boolean, bool_t);
61         WRAPPER_DEF(Character, char_t);
62 
to_string_padded(LSPString * dst,size_t pad)63         status_t Byte::to_string_padded(LSPString *dst, size_t pad)
64         {
65             return (dst->fmt_append_ascii("*%p = new Byte(%d)\n", this, int(value()))) ? STATUS_OK : STATUS_NO_MEM;
66         }
67 
to_string_padded(LSPString * dst,size_t pad)68         status_t Short::to_string_padded(LSPString *dst, size_t pad)
69         {
70             return (dst->fmt_append_ascii("*%p = new Short(%d)\n", this, int(value()))) ? STATUS_OK : STATUS_NO_MEM;
71         }
72 
to_string_padded(LSPString * dst,size_t pad)73         status_t Integer::to_string_padded(LSPString *dst, size_t pad)
74         {
75             return (dst->fmt_append_ascii("*%p = new Integer(%d)\n", this, int(value()))) ? STATUS_OK : STATUS_NO_MEM;
76         }
77 
to_string_padded(LSPString * dst,size_t pad)78         status_t Long::to_string_padded(LSPString *dst, size_t pad)
79         {
80             return (dst->fmt_append_ascii("*%p = new Long(%d)\n", this, int(value()))) ? STATUS_OK : STATUS_NO_MEM;
81         }
82 
to_string_padded(LSPString * dst,size_t pad)83         status_t Double::to_string_padded(LSPString *dst, size_t pad)
84         {
85             return (dst->fmt_append_ascii("*%p = new Double(%f)\n", this, value())) ? STATUS_OK : STATUS_NO_MEM;
86         }
87 
to_string_padded(LSPString * dst,size_t pad)88         status_t Float::to_string_padded(LSPString *dst, size_t pad)
89         {
90             return (dst->fmt_append_ascii("*%p = new Float(%f)\n", this, value())) ? STATUS_OK : STATUS_NO_MEM;
91         }
92 
to_string_padded(LSPString * dst,size_t pad)93         status_t Boolean::to_string_padded(LSPString *dst, size_t pad)
94         {
95             return (dst->fmt_append_ascii("*%p = new Boolean(%s)\n", this, (value()) ? "true" : "false")) ? STATUS_OK : STATUS_NO_MEM;
96         }
97 
to_string_padded(LSPString * dst,size_t pad)98         status_t Character::to_string_padded(LSPString *dst, size_t pad)
99         {
100             if (!dst->fmt_append_ascii("*%p = new Character('", this))
101                 return STATUS_NO_MEM;
102             dst->append(lsp_wchar_t(value()));
103             return (dst->append_ascii("')\n")) ? STATUS_OK : STATUS_NO_MEM;
104         }
105 
106         #undef WRAPPER_DEF
107     }
108 }
109 
110