Memory: Fix guarded aligned malloc with small alignment
[blender.git] / source / blender / makesrna / intern / rna_text.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup RNA
19  */
20
21 #include <stdlib.h>
22 #include <limits.h>
23
24 #include "MEM_guardedalloc.h"
25
26 #include "BLT_translation.h"
27
28 #include "BKE_text.h"
29
30 #include "ED_text.h"
31
32 #include "RNA_define.h"
33
34 #include "rna_internal.h"
35
36 #include "DNA_text_types.h"
37
38 #include "WM_types.h"
39
40 #ifdef RNA_RUNTIME
41
42 static void rna_Text_filename_get(PointerRNA *ptr, char *value)
43 {
44   Text *text = (Text *)ptr->data;
45
46   if (text->name) {
47     strcpy(value, text->name);
48   }
49   else {
50     value[0] = '\0';
51   }
52 }
53
54 static int rna_Text_filename_length(PointerRNA *ptr)
55 {
56   Text *text = (Text *)ptr->data;
57   return (text->name) ? strlen(text->name) : 0;
58 }
59
60 static void rna_Text_filename_set(PointerRNA *ptr, const char *value)
61 {
62   Text *text = (Text *)ptr->data;
63
64   if (text->name) {
65     MEM_freeN(text->name);
66   }
67
68   if (value[0]) {
69     text->name = BLI_strdup(value);
70   }
71   else {
72     text->name = NULL;
73   }
74 }
75
76 static bool rna_Text_modified_get(PointerRNA *ptr)
77 {
78   Text *text = (Text *)ptr->data;
79   return BKE_text_file_modified_check(text) != 0;
80 }
81
82 static int rna_Text_current_line_index_get(PointerRNA *ptr)
83 {
84   Text *text = (Text *)ptr->data;
85   return BLI_findindex(&text->lines, text->curl);
86 }
87
88 static void rna_Text_current_line_index_set(PointerRNA *ptr, int value)
89 {
90   Text *text = (Text *)ptr->data;
91   txt_move_toline(text, value, 0);
92 }
93
94 static void rna_TextLine_body_get(PointerRNA *ptr, char *value)
95 {
96   TextLine *line = (TextLine *)ptr->data;
97
98   if (line->line) {
99     strcpy(value, line->line);
100   }
101   else {
102     value[0] = '\0';
103   }
104 }
105
106 static int rna_TextLine_body_length(PointerRNA *ptr)
107 {
108   TextLine *line = (TextLine *)ptr->data;
109   return line->len;
110 }
111
112 static void rna_TextLine_body_set(PointerRNA *ptr, const char *value)
113 {
114   TextLine *line = (TextLine *)ptr->data;
115   int len = strlen(value);
116
117   if (line->line) {
118     MEM_freeN(line->line);
119   }
120
121   line->line = MEM_mallocN((len + 1) * sizeof(char), "rna_text_body");
122   line->len = len;
123   memcpy(line->line, value, len + 1);
124
125   if (line->format) {
126     MEM_freeN(line->format);
127     line->format = NULL;
128   }
129 }
130
131 #else
132
133 static void rna_def_text_line(BlenderRNA *brna)
134 {
135   StructRNA *srna;
136   PropertyRNA *prop;
137
138   srna = RNA_def_struct(brna, "TextLine", NULL);
139   RNA_def_struct_ui_text(srna, "Text Line", "Line of text in a Text data-block");
140
141   prop = RNA_def_property(srna, "body", PROP_STRING, PROP_NONE);
142   RNA_def_property_string_funcs(
143       prop, "rna_TextLine_body_get", "rna_TextLine_body_length", "rna_TextLine_body_set");
144   RNA_def_property_ui_text(prop, "Line", "Text in the line");
145   RNA_def_property_update(prop, NC_TEXT | NA_EDITED, NULL);
146   RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_TEXT);
147 }
148
149 static void rna_def_text(BlenderRNA *brna)
150 {
151
152   static const EnumPropertyItem indentation_items[] = {
153       {0, "TABS", 0, "Tabs", "Indent using tabs"},
154       {TXT_TABSTOSPACES, "SPACES", 0, "Spaces", "Indent using spaces"},
155       {0, NULL, 0, NULL, NULL},
156   };
157
158   StructRNA *srna;
159   PropertyRNA *prop;
160
161   srna = RNA_def_struct(brna, "Text", "ID");
162   RNA_def_struct_ui_text(
163       srna, "Text", "Text data-block referencing an external or packed text file");
164   RNA_def_struct_ui_icon(srna, ICON_TEXT);
165   RNA_def_struct_clear_flag(srna, STRUCT_ID_REFCOUNT);
166
167   prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_NONE);
168   RNA_def_property_string_funcs(
169       prop, "rna_Text_filename_get", "rna_Text_filename_length", "rna_Text_filename_set");
170   RNA_def_property_ui_text(prop, "File Path", "Filename of the text file");
171
172   prop = RNA_def_property(srna, "is_dirty", PROP_BOOLEAN, PROP_NONE);
173   RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISDIRTY);
174   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
175   RNA_def_property_ui_text(prop, "Dirty", "Text file has been edited since last save");
176
177   prop = RNA_def_property(srna, "is_modified", PROP_BOOLEAN, PROP_NONE);
178   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
179   RNA_def_property_boolean_funcs(prop, "rna_Text_modified_get", NULL);
180   RNA_def_property_ui_text(
181       prop, "Modified", "Text file on disk is different than the one in memory");
182
183   prop = RNA_def_property(srna, "is_in_memory", PROP_BOOLEAN, PROP_NONE);
184   RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISMEM);
185   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
186   RNA_def_property_ui_text(
187       prop, "Memory", "Text file is in memory, without a corresponding file on disk");
188
189   prop = RNA_def_property(srna, "use_module", PROP_BOOLEAN, PROP_NONE);
190   RNA_def_property_boolean_sdna(prop, NULL, "flags", TXT_ISSCRIPT);
191   RNA_def_property_ui_text(
192       prop, "Register", "Run this text as a script on loading, Text name must end with \".py\"");
193
194   prop = RNA_def_property(srna, "indentation", PROP_ENUM, PROP_NONE); /* as an enum */
195   RNA_def_property_enum_bitflag_sdna(prop, NULL, "flags");
196   RNA_def_property_enum_items(prop, indentation_items);
197   RNA_def_property_ui_text(prop, "Indentation", "Use tabs or spaces for indentation");
198
199   prop = RNA_def_property(srna, "lines", PROP_COLLECTION, PROP_NONE);
200   RNA_def_property_struct_type(prop, "TextLine");
201   RNA_def_property_ui_text(prop, "Lines", "Lines of text");
202
203   prop = RNA_def_property(srna, "current_line", PROP_POINTER, PROP_NONE);
204   RNA_def_property_flag(prop, PROP_NEVER_NULL);
205   RNA_def_property_pointer_sdna(prop, NULL, "curl");
206   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
207   RNA_def_property_struct_type(prop, "TextLine");
208   RNA_def_property_ui_text(
209       prop, "Current Line", "Current line, and start line of selection if one exists");
210
211   prop = RNA_def_property(srna, "current_character", PROP_INT, PROP_UNSIGNED);
212   RNA_def_property_int_sdna(prop, NULL, "curc");
213   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
214   RNA_def_property_ui_text(prop,
215                            "Current Character",
216                            "Index of current character in current line, and also start index of "
217                            "character in selection if one exists");
218
219   prop = RNA_def_property(srna, "current_line_index", PROP_INT, PROP_NONE);
220   RNA_def_property_int_funcs(
221       prop, "rna_Text_current_line_index_get", "rna_Text_current_line_index_set", NULL);
222   RNA_def_property_ui_text(
223       prop, "Current Line Index", "Index of current TextLine in TextLine collection");
224   RNA_def_property_update(prop, NC_TEXT | ND_CURSOR, NULL);
225
226   prop = RNA_def_property(srna, "select_end_line", PROP_POINTER, PROP_NONE);
227   RNA_def_property_flag(prop, PROP_NEVER_NULL);
228   RNA_def_property_pointer_sdna(prop, NULL, "sell");
229   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
230   RNA_def_property_struct_type(prop, "TextLine");
231   RNA_def_property_ui_text(prop, "Selection End Line", "End line of selection");
232
233   prop = RNA_def_property(srna, "select_end_character", PROP_INT, PROP_UNSIGNED);
234   RNA_def_property_int_sdna(prop, NULL, "selc");
235   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
236   RNA_def_property_ui_text(prop,
237                            "Selection End Character",
238                            "Index of character after end of selection in the selection end line");
239
240   RNA_api_text(srna);
241 }
242
243 void RNA_def_text(BlenderRNA *brna)
244 {
245   rna_def_text_line(brna);
246   rna_def_text(brna);
247 }
248
249 #endif