summaryrefslogtreecommitdiff
path: root/fluid/nodes/Function_Node.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'fluid/nodes/Function_Node.cxx')
-rw-r--r--fluid/nodes/Function_Node.cxx786
1 files changed, 136 insertions, 650 deletions
diff --git a/fluid/nodes/Function_Node.cxx b/fluid/nodes/Function_Node.cxx
index a70b10462..095b3fc5f 100644
--- a/fluid/nodes/Function_Node.cxx
+++ b/fluid/nodes/Function_Node.cxx
@@ -35,6 +35,8 @@
#include <zlib.h>
+extern void open_panel();
+
using namespace fld;
using namespace fld::io;
using namespace fld::proj;
@@ -191,9 +193,9 @@ Function_Node Function_Node::prototype;
*/
Function_Node::Function_Node() :
Node(),
- return_type(nullptr),
+ return_type_(nullptr),
public_(0),
- cdecl_(0),
+ declare_c_(0),
constructor(0),
havewidgets(0)
{ }
@@ -202,7 +204,7 @@ Function_Node::Function_Node() :
Destructor.
*/
Function_Node::~Function_Node() {
- if (return_type) free((void*)return_type);
+ if (return_type_) free((void*)return_type_);
}
/**
@@ -221,11 +223,11 @@ Node *Function_Node::make(Strategy strategy) {
}
Function_Node *o = new Function_Node();
o->name("make_window()");
- o->return_type = nullptr;
+ o->return_type_ = nullptr;
o->add(anchor, strategy);
o->factory = this;
o->public_ = 1;
- o->cdecl_ = 0;
+ o->declare_c_ = 0;
return o;
}
@@ -241,10 +243,10 @@ void Function_Node::write_properties(fld::io::Project_Writer &f) {
case 0: f.write_string("private"); break;
case 2: f.write_string("protected"); break;
}
- if (cdecl_) f.write_string("C");
- if (return_type) {
+ if (declare_c_) f.write_string("C");
+ if (return_type_) {
f.write_string("return_type");
- f.write_word(return_type);
+ f.write_word(return_type_);
}
}
@@ -258,9 +260,9 @@ void Function_Node::read_property(fld::io::Project_Reader &f, const char *c) {
} else if (!strcmp(c,"protected")) {
public_ = 2;
} else if (!strcmp(c,"C")) {
- cdecl_ = 1;
+ declare_c_ = 1;
} else if (!strcmp(c,"return_type")) {
- storestring(f.read_word(),return_type);
+ storestring(f.read_word(),return_type_);
} else {
Node::read_property(f, c);
}
@@ -270,90 +272,7 @@ void Function_Node::read_property(fld::io::Project_Reader &f, const char *c) {
Open the function_panel dialog box to edit this function.
*/
void Function_Node::open() {
- // fill dialog box
- if (!function_panel) make_function_panel();
- f_return_type_input->value(return_type);
- f_name_input->value(name());
- if (is_in_class()) {
- f_public_member_choice->value(public_);
- f_public_member_choice->show();
- f_public_choice->hide();
- f_c_button->hide();
- } else {
- f_public_choice->value(public_);
- f_public_choice->show();
- f_public_member_choice->hide();
- f_c_button->show();
- }
- f_c_button->value(cdecl_);
- const char *c = comment();
- f_comment_input->buffer()->text(c?c:"");
- function_panel->show();
- const char* message = nullptr;
- for (;;) { // repeat as long as there are errors
- // - message loop until OK or cancel is pressed
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == f_panel_cancel) goto BREAK2;
- else if (w == f_panel_ok) break;
- else if (!w) Fl::wait();
- }
- // - check syntax
- const char *c = f_name_input->value();
- while (isspace(*c)) c++;
- message = c_check(c);
- if (!message) {
- const char *d = c;
- for (; *d != '('; d++) if (isspace(*d) || !*d) break;
- if (*c && *d != '(')
- message = "must be 'name(arguments)'";
- }
- if (!message) {
- c = f_return_type_input->value();
- message = c_check(c);
- }
- // - alert user
- if (message) {
- int v = fl_choice("Potential syntax error detected: %s",
- "Continue Editing", "Ignore Error", nullptr, message);
- if (v==0) continue; // Continue Editing
- //if (v==1) { } // Ignore Error and close dialog
- }
- // - copy dialog data to target variables
- int mod = 0;
- name(f_name_input->value());
- storestring(f_return_type_input->value(), return_type);
- if (is_in_class()) {
- if (public_ != f_public_member_choice->value()) {
- mod = 1;
- public_ = f_public_member_choice->value();
- redraw_browser();
- }
- } else {
- if (public_ != f_public_choice->value()) {
- mod = 1;
- public_ = f_public_choice->value();
- redraw_browser();
- }
- }
- if (cdecl_ != f_c_button->value()) {
- mod = 1;
- cdecl_ = f_c_button->value();
- }
- c = f_comment_input->buffer()->text();
- if (c && *c) {
- if (!comment() || strcmp(c, comment())) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(c);
- } else {
- if (comment()) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(nullptr);
- }
- if (c) free((void*)c);
- if (mod) Fluid.proj.set_modflag(1);
- break;
- }
-BREAK2:
- function_panel->hide();
+ open_panel();
}
/**
@@ -435,7 +354,7 @@ void Function_Node::write_code1(fld::io::Code_Writer& f) {
if (havechildren)
f.write_c("int main(int argc, char **argv) {\n");
} else {
- const char* rtype = return_type;
+ const char* rtype = return_type_;
const char* star = "";
// from matt: let the user type "static " at the start of type
// in order to declare a static method;
@@ -503,7 +422,7 @@ void Function_Node::write_code1(fld::io::Code_Writer& f) {
if (havechildren)
write_comment_c(f);
if (public_==1) {
- if (cdecl_)
+ if (declare_c_)
f.write_h("extern \"C\" { %s%s %s; }\n", rtype, star, name());
else
f.write_h("%s%s %s;\n", rtype, star, name());
@@ -547,7 +466,7 @@ void Function_Node::write_code2(fld::io::Code_Writer& f) {
f.write_c("%s%s->show(argc, argv);\n", f.indent(1), var);
if (havechildren)
f.write_c("%sreturn Fl::run();\n", f.indent(1));
- } else if (havewidgets && !constructor && !return_type) {
+ } else if (havewidgets && !constructor && !return_type_) {
f.write_c("%sreturn %s;\n", f.indent(1), var);
}
if (havechildren)
@@ -562,9 +481,9 @@ void Function_Node::write_code2(fld::io::Code_Writer& f) {
\return 1 if they match, 0 if not
*/
int Function_Node::has_signature(const char *rtype, const char *sig) const {
- if (rtype && !return_type) return 0;
+ if (rtype && !return_type_) return 0;
if (!name()) return 0;
- if ( (rtype==nullptr || strcmp(return_type, rtype)==0)
+ if ( (rtype==nullptr || strcmp(return_type_, rtype)==0)
&& fl_filename_match(name(), sig)) {
return 1;
}
@@ -632,38 +551,7 @@ void Code_Node::open() {
if ( editor_.open_editor(cmd, code) == 0 )
return; // return if editor opened ok, fall thru to built-in if not
}
- // Use built-in code editor..
- if (!code_panel) make_code_panel();
- const char *text = name();
- code_input->buffer()->text( text ? text : "" );
- code_input->insert_position(cursor_position_);
- code_input->scroll(code_input_scroll_row, code_input_scroll_col);
- code_panel->show();
- const char* message = nullptr;
- for (;;) { // repeat as long as there are errors
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == code_panel_cancel) goto BREAK2;
- else if (w == code_panel_ok) break;
- else if (!w) Fl::wait();
- }
- char*c = code_input->buffer()->text();
- message = c_check(c);
- if (message) {
- int v = fl_choice("Potential syntax error detected: %s",
- "Continue Editing", "Ignore Error", nullptr, message);
- if (v==0) continue; // Continue Editing
- //if (v==1) { } // Ignore Error and close dialog
- }
- name(c);
- free(c);
- break;
- }
- cursor_position_ = code_input->insert_position();
- code_input_scroll_row = code_input->scroll_row();
- code_input_scroll_col = code_input->scroll_col();
-BREAK2:
- code_panel->hide();
+ open_panel();
}
/**
@@ -817,38 +705,7 @@ void CodeBlock_Node::read_property(fld::io::Project_Reader &f, const char *c) {
Open the codeblock_panel.
*/
void CodeBlock_Node::open() {
- if (!codeblock_panel) make_codeblock_panel();
- code_before_input->value(name());
- code_after_input->value(after);
- codeblock_panel->show();
- const char* message = nullptr;
- for (;;) { // repeat as long as there are errors
- // event loop
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == codeblock_panel_cancel) goto BREAK2;
- else if (w == codeblock_panel_ok) break;
- else if (!w) Fl::wait();
- }
- // check for syntax errors
- message = c_check(code_before_input->value());
- if (!message) {
- message = c_check(code_after_input->value());
- }
- // alert user
- if (message) {
- int v = fl_choice("Potential syntax error detected: %s",
- "Continue Editing", "Ignore Error", nullptr, message);
- if (v==0) continue; // Continue Editing
- //if (v==1) { } // Ignore Error and close dialog
- }
- // write to variables
- name(code_before_input->value());
- storestring(code_after_input->value(), after);
- break;
- }
-BREAK2:
- codeblock_panel->hide();
+ open_panel();
}
/**
@@ -969,70 +826,7 @@ void Decl_Node::read_property(fld::io::Project_Reader &f, const char *c) {
Open the decl_panel to edit this node.
*/
void Decl_Node::open() {
- if (!decl_panel) make_decl_panel();
- decl_input->buffer()->text(name());
- if (is_in_class()) {
- decl_class_choice->value(public_);
- decl_class_choice->show();
- decl_choice->hide();
- } else {
- decl_choice->value((public_&1)|((static_&1)<<1));
- decl_choice->show();
- decl_class_choice->hide();
- }
- const char *c = comment();
- decl_comment_input->buffer()->text(c?c:"");
- decl_panel->show();
- const char* message = nullptr;
- for (;;) { // repeat as long as there are errors
- // event loop
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == decl_panel_cancel) goto BREAK2;
- else if (w == decl_panel_ok) break;
- else if (!w) Fl::wait();
- }
- // check values
- const char*c = decl_input->buffer()->text();
- while (isspace(*c)) c++;
- message = c_check(c&&c[0]=='#' ? c+1 : c);
- // alert user
- if (message) {
- int v = fl_choice("Potential syntax error detected: %s",
- "Continue Editing", "Ignore Error", nullptr, message);
- if (v==0) continue; // Continue Editing
- //if (v==1) { } // Ignore Error and close dialog
- }
- // copy vlaues
- name(c);
- if (is_in_class()) {
- if (public_!=decl_class_choice->value()) {
- Fluid.proj.set_modflag(1);
- public_ = decl_class_choice->value();
- }
- } else {
- if (public_!=(decl_choice->value()&1)) {
- Fluid.proj.set_modflag(1);
- public_ = (decl_choice->value()&1);
- }
- if (static_!=((decl_choice->value()>>1)&1)) {
- Fluid.proj.set_modflag(1);
- static_ = ((decl_choice->value()>>1)&1);
- }
- }
- c = decl_comment_input->buffer()->text();
- if (c && *c) {
- if (!comment() || strcmp(c, comment())) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(c);
- } else {
- if (comment()) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(nullptr);
- }
- if (c) free((void*)c);
- break;
- }
-BREAK2:
- decl_panel->hide();
+ open_panel();
}
/**
@@ -1120,9 +914,7 @@ Data_Node Data_Node::prototype;
Constructor.
*/
Data_Node::Data_Node() :
- Decl_Node(),
- filename_(nullptr),
- text_mode_(0)
+ Decl_Node()
{ }
/**
@@ -1151,7 +943,7 @@ Node *Data_Node::make(Strategy strategy) {
o->public_ = 1;
o->static_ = 1;
o->filename_ = nullptr;
- o->text_mode_ = 0;
+ o->output_format_ = 0;
o->name("myInlineData");
o->add(anchor, strategy);
o->factory = this;
@@ -1169,11 +961,12 @@ void Data_Node::write_properties(fld::io::Project_Writer &f) {
f.write_string("filename");
f.write_word(filename_);
}
- if (text_mode_ == 1) {
- f.write_string("textmode");
- }
- if (text_mode_ == 2) {
- f.write_string("compressed");
+ switch (output_format_) {
+ case 1: f.write_string("textmode"); break;
+ case 2: f.write_string("compressed"); break;
+ case 3: f.write_string("std_binary"); break;
+ case 4: f.write_string("std_textmode"); break;
+ case 5: f.write_string("std_compressed"); break;
}
}
@@ -1184,9 +977,15 @@ void Data_Node::read_property(fld::io::Project_Reader &f, const char *c) {
if (!strcmp(c,"filename")) {
storestring(f.read_word(), filename_, 1);
} else if (!strcmp(c,"textmode")) {
- text_mode_ = 1;
+ output_format_ = 1;
} else if (!strcmp(c,"compressed")) {
- text_mode_ = 2;
+ output_format_ = 2;
+ } else if (!strcmp(c,"std_binary")) {
+ output_format_ = 3;
+ } else if (!strcmp(c,"std_textmode")) {
+ output_format_ = 4;
+ } else if (!strcmp(c,"std_compressed")) {
+ output_format_ = 5;
} else {
Decl_Node::read_property(f, c);
}
@@ -1196,110 +995,7 @@ void Data_Node::read_property(fld::io::Project_Reader &f, const char *c) {
Open the data_panel to edit this node.
*/
void Data_Node::open() {
- if (!data_panel) make_data_panel();
- data_input->value(name());
- if (is_in_class()) {
- data_class_choice->value(public_);
- data_class_choice->show();
- data_choice->hide();
- } else {
- data_choice->value((public_&1)|((static_&1)<<1));
- data_choice->show();
- data_class_choice->hide();
- }
- data_mode->value(text_mode_);
- data_filename->value(filename_?filename_:"");
- const char *c = comment();
- data_comment_input->buffer()->text(c?c:"");
- data_panel->show();
- for (;;) { // repeat as long as there are errors
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == data_panel_cancel) goto BREAK2;
- else if (w == data_panel_ok) break;
- else if (w == data_filebrowser) {
- Fluid.proj.enter_project_dir();
- const char *fn = fl_file_chooser("Load Inline Data", nullptr, data_filename->value(), 1);
- Fluid.proj.leave_project_dir();
- if (fn) {
- if (strcmp(fn, data_filename->value()))
- Fluid.proj.set_modflag(1);
- data_filename->value(fn);
- }
- }
- else if (!w) Fl::wait();
- }
- // store the variable name:
- const char*c = data_input->value();
- char *s = fl_strdup(c), *p = s, *q, *n;
- for (;;++p) { // remove leading spaces
- if (!isspace((unsigned char)(*p))) break;
- }
- n = p;
- if ( (!isalpha((unsigned char)(*p))) && ((*p)!='_') && ((*p)!=':') ) goto OOPS;
- ++p;
- for (;;++p) {
- if ( (!isalnum((unsigned char)(*p))) && ((*p)!='_') && ((*p)!=':') ) break;
- }
- q = p;
- for (;;++q) {
- if (!*q) break;
- if (!isspace((unsigned char)(*q))) goto OOPS;
- }
- *p = 0; // remove trailing spaces
- if (n==q) {
- OOPS:
- int v = fl_choice("%s",
- "Continue Editing", "Ignore Error", nullptr,
- "Variable name must be a C identifier");
- if (v==0) { free(s); continue; } // Continue Editing
- //if (v==1) { } // Ignore Error and close dialog
- }
- Fluid.proj.undo.checkpoint();
- name(n);
- free(s);
- // store flags
- if (is_in_class()) {
- if (public_!=data_class_choice->value()) {
- Fluid.proj.set_modflag(1);
- public_ = data_class_choice->value();
- }
- } else {
- if (public_!=(data_choice->value()&1)) {
- Fluid.proj.set_modflag(1);
- public_ = (data_choice->value()&1);
- }
- if (static_!=((data_choice->value()>>1)&1)) {
- Fluid.proj.set_modflag(1);
- static_ = ((data_choice->value()>>1)&1);
- }
- }
- text_mode_ = data_mode->value();
- if (text_mode_ < 0) text_mode_ = 0;
- if (text_mode_ > 2) text_mode_ = 2;
- // store the filename
- c = data_filename->value();
- if (filename_ && strcmp(filename_, data_filename->value()))
- Fluid.proj.set_modflag(1);
- else if (!filename_ && *c)
- Fluid.proj.set_modflag(1);
- if (filename_) { free((void*)filename_); filename_ = nullptr; }
- if (c && *c) filename_ = fl_strdup(c);
- // store the comment
- c = data_comment_input->buffer()->text();
- if (c && *c) {
- if (!comment() || strcmp(c, comment())) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(c);
- } else {
- if (comment()) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(nullptr);
- }
- if (c) free((void*)c);
- Fluid.proj.set_modflag(1);
- break;
- }
-BREAK2:
- data_panel->hide();
+ open_panel();
}
/**
@@ -1327,7 +1023,7 @@ void Data_Node::write_code1(fld::io::Code_Writer& f) {
if (nData) {
data = (char*)calloc(nData, 1);
if (fread(data, nData, 1, f)==0) { /* use default */ }
- if (text_mode_ == 2) {
+ if ((output_format_ == 2) || (output_format_ == 5)) {
uncompressedDataSize = nData;
uLong nzData = compressBound(nData);
Bytef *zdata = (Bytef*)::malloc(nzData);
@@ -1344,27 +1040,47 @@ void Data_Node::write_code1(fld::io::Code_Writer& f) {
}
if (is_in_class()) {
f.write_public(public_);
- if (text_mode_ == 1) {
- f.write_h("%sstatic const char *%s;\n", f.indent(1), c);
+ if ((output_format_ == 1) || (output_format_ == 4)) {
f.write_c("\n");
write_comment_c(f);
- f.write_c("const char *%s::%s = /* text inlined from %s */\n", class_name(1), c, fn);
+ if (output_format_ == 1) {
+ f.write_h("%sstatic const char *%s;\n", f.indent(1), c);
+ f.write_c("const char *%s::%s = /* text inlined from %s */\n", class_name(1), c, fn);
+ } else {
+ f.write_h_once("#include <string>");
+ f.write_h("%sstatic const std::string %s;\n", f.indent(1), c);
+ f.write_c("const std::string %s::%s = /* text inlined from %s */\n", class_name(1), c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cstring(data, nData);
- } else if (text_mode_ == 2) {
+ } else if ((output_format_ == 2) || (output_format_ == 5)) {
f.write_h("%sstatic int %s_size;\n", f.indent(1), c);
- f.write_h("%sstatic unsigned char %s[%d];\n", f.indent(1), c, nData);
f.write_c("\n");
write_comment_c(f);
f.write_c("int %s::%s_size = %d;\n", class_name(1), c, uncompressedDataSize);
- f.write_c("unsigned char %s::%s[%d] = /* data compressed and inlined from %s */\n", class_name(1), c, nData, fn);
+ if (output_format_ == 2) {
+ f.write_h("%sstatic unsigned char %s[%d];\n", f.indent(1), c, nData);
+ f.write_c("unsigned char %s::%s[%d] = /* data compressed and inlined from %s */\n", class_name(1), c, nData, fn);
+ } else {
+ f.write_h_once("#include <stdint.h>");
+ f.write_h_once("#include <vector>");
+ f.write_h("%sstatic std::vector<uint8_t> %s;\n", f.indent(1), c);
+ f.write_c("std::vector<uint8_t> %s::%s = /* data compressed and inlined from %s */\n", class_name(1), c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cdata(data, nData);
} else {
- f.write_h("%sstatic unsigned char %s[%d];\n", f.indent(1), c, nData);
f.write_c("\n");
write_comment_c(f);
- f.write_c("unsigned char %s::%s[%d] = /* data inlined from %s */\n", class_name(1), c, nData, fn);
+ if (output_format_ == 0) {
+ f.write_h("%sstatic unsigned char %s[%d];\n", f.indent(1), c, nData);
+ f.write_c("unsigned char %s::%s[%d] = /* data inlined from %s */\n", class_name(1), c, nData, fn);
+ } else {
+ f.write_h_once("#include <stdint.h>");
+ f.write_h_once("#include <vector>");
+ f.write_h("%sstatic std::vector<uint8_t> %s;\n", f.indent(1), c);
+ f.write_c("std::vector<uint8_t> %s::%s = /* data inlined from %s */\n", class_name(1), c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cdata(data, nData);
}
@@ -1373,27 +1089,47 @@ void Data_Node::write_code1(fld::io::Code_Writer& f) {
// the "header only" option does not apply here!
if (public_) {
if (static_) {
- if (text_mode_ == 1) {
- f.write_h("extern const char *%s;\n", c);
+ if ((output_format_ == 1) || (output_format_ == 4)) {
f.write_c("\n");
write_comment_c(f);
- f.write_c("const char *%s = /* text inlined from %s */\n", c, fn);
+ if (output_format_ == 1) {
+ f.write_h("extern const char *%s;\n", c);
+ f.write_c("const char *%s = /* text inlined from %s */\n", c, fn);
+ } else {
+ f.write_h_once("#include <string>");
+ f.write_h("extern const std::string %s;\n", c);
+ f.write_c("const std::string %s = /* text inlined from %s */\n", c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cstring(data, nData);
- } else if (text_mode_ == 2) {
+ } else if ((output_format_ == 2) || (output_format_ == 5)) {
f.write_h("extern int %s_size;\n", c);
- f.write_h("extern unsigned char %s[%d];\n", c, nData);
f.write_c("\n");
write_comment_c(f);
f.write_c("int %s_size = %d;\n", c, uncompressedDataSize);
- f.write_c("unsigned char %s[%d] = /* data compressed and inlined from %s */\n", c, nData, fn);
+ if (output_format_ == 2) {
+ f.write_h("extern unsigned char %s[%d];\n", c, nData);
+ f.write_c("unsigned char %s[%d] = /* data compressed and inlined from %s */\n", c, nData, fn);
+ } else {
+ f.write_h_once("#include <stdint.h>");
+ f.write_h_once("#include <vector>");
+ f.write_h("extern std::vector<uint8_t> %s;\n", c);
+ f.write_c("std::vector<uint8_t> %s = /* data compressed and inlined from %s */\n", c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cdata(data, nData);
} else {
- f.write_h("extern unsigned char %s[%d];\n", c, nData);
f.write_c("\n");
write_comment_c(f);
- f.write_c("unsigned char %s[%d] = /* data inlined from %s */\n", c, nData, fn);
+ if (output_format_ == 0) {
+ f.write_h("extern unsigned char %s[%d];\n", c, nData);
+ f.write_c("unsigned char %s[%d] = /* data inlined from %s */\n", c, nData, fn);
+ } else {
+ f.write_h_once("#include <stdint.h>");
+ f.write_h_once("#include <vector>");
+ f.write_h("extern std::vector<uint8_t> %s;\n", c);
+ f.write_c("std::vector<uint8_t> %s = /* data inlined from %s */\n", c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cdata(data, nData);
}
@@ -1401,7 +1137,7 @@ void Data_Node::write_code1(fld::io::Code_Writer& f) {
} else {
write_comment_h(f);
f.write_h("#error Unsupported declaration loading inline data %s\n", fn);
- if (text_mode_ == 1)
+ if (output_format_ == 1)
f.write_h("const char *%s = \"abc...\";\n", c);
else
f.write_h("unsigned char %s[3] = { 1, 2, 3 };\n", c);
@@ -1409,20 +1145,41 @@ void Data_Node::write_code1(fld::io::Code_Writer& f) {
} else {
f.write_c("\n");
write_comment_c(f);
- if (static_)
- f.write_c("static ");
- if (text_mode_ == 1) {
- f.write_c("const char *%s = /* text inlined from %s */\n", c, fn);
+ if ((output_format_ == 1) || (output_format_ == 4)) {
+ if (output_format_ == 1) {
+ if (static_) f.write_c("static ");
+ f.write_c("const char *%s = /* text inlined from %s */\n", c, fn);
+ } else {
+ f.write_c_once("#include <string>");
+ if (static_) f.write_c("static ");
+ f.write_c("const std::string %s = /* text inlined from %s */\n", c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cstring(data, nData);
- } else if (text_mode_ == 2) {
- f.write_c("int %s_size = %d;\n", c, uncompressedDataSize);
+ } else if ((output_format_ == 2) || (output_format_ == 5)) {
if (static_) f.write_c("static ");
- f.write_c("unsigned char %s[%d] = /* data compressed and inlined from %s */\n", c, nData, fn);
+ f.write_c("int %s_size = %d;\n", c, uncompressedDataSize);
+ if (output_format_ == 2) {
+ if (static_) f.write_c("static ");
+ f.write_c("unsigned char %s[%d] = /* data compressed and inlined from %s */\n", c, nData, fn);
+ } else {
+ f.write_c_once("#include <stdint.h>");
+ f.write_c_once("#include <vector>");
+ if (static_) f.write_c("static ");
+ f.write_c("std::vector<uint8_t> %s = /* data compressed and inlined from %s */\n", c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cdata(data, nData);
} else {
- f.write_c("unsigned char %s[%d] = /* data inlined from %s */\n", c, nData, fn);
+ if (output_format_ == 0) {
+ if (static_) f.write_c("static ");
+ f.write_c("unsigned char %s[%d] = /* data inlined from %s */\n", c, nData, fn);
+ } else {
+ f.write_c_once("#include <stdint.h>");
+ f.write_c_once("#include <vector>");
+ if (static_) f.write_c("static ");
+ f.write_c("std::vector<uint8_t> %s = /* data inlined from %s */\n", c, fn);
+ }
if (message) f.write_c("#error %s %s\n", message, fn);
f.write_cdata(data, nData);
}
@@ -1440,6 +1197,11 @@ void Data_Node::write_code1(fld::io::Code_Writer& f) {
if (data) free(data);
}
+void Data_Node::filename(const char* fn) {
+ storestring(fn, filename_);
+}
+
+
// ---- DeclBlock_Node declaration
/** \class DeclBlock_Node
@@ -1456,10 +1218,8 @@ DeclBlock_Node DeclBlock_Node::prototype;
/**
Constructor.
*/
-DeclBlock_Node::DeclBlock_Node() :
- Node(),
- after(nullptr),
- write_map_(CODE_IN_SOURCE)
+DeclBlock_Node::DeclBlock_Node()
+: Node()
{ }
/**
@@ -1536,101 +1296,7 @@ void DeclBlock_Node::read_property(fld::io::Project_Reader &f, const char *c) {
Open the declblock_panel to edit this node.
*/
void DeclBlock_Node::open() {
- // build dialog box
- if (!declblock_panel) make_declblock_panel();
- // preset all values
- declblock_before_input->value(name());
- declblock_after_input->value(after);
- declblock_static_header->value(write_map_ & STATIC_IN_HEADER);
- declblock_static_source->value(write_map_ & STATIC_IN_SOURCE);
- declblock_code_header->value(write_map_ & CODE_IN_HEADER);
- declblock_code_source->value(write_map_ & CODE_IN_SOURCE);
- const char *c = comment();
- declblock_comment_input->buffer()->text(c?c:"");
- // show modal dialog and loop until satisfied
- declblock_panel->show();
- const char* message = nullptr;
- for (;;) { // repeat as long as there are errors
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == declblock_panel_cancel) goto BREAK2;
- else if (w == declblock_panel_ok) break;
- else if (!w) Fl::wait();
- }
- // verify user input
- const char* a = declblock_before_input->value();
- while (isspace(*a)) a++;
- const char* b = declblock_after_input->value();
- while (isspace(*b)) b++;
- message = c_check(a&&a[0]=='#' ? a+1 : a);
- if (!message)
- message = c_check(b&&b[0]=='#' ? b+1 : b);
- if (message) {
- int v = fl_choice("Potential syntax error detected: %s",
- "Continue Editing", "Ignore Error", nullptr, message);
- if (v==0) continue; // Continue Editing
- //if (v==1) { } // Ignore Error and close dialog
- }
- // store user choices in data structure
- name(a);
- storestring(b, after);
- if (write_map_ & STATIC_IN_HEADER) {
- if (declblock_static_header->value()==0) {
- write_map_ &= ~STATIC_IN_HEADER;
- Fluid.proj.set_modflag(1);
- }
- } else {
- if (declblock_static_header->value()) {
- write_map_ |= STATIC_IN_HEADER;
- Fluid.proj.set_modflag(1);
- }
- }
- if (write_map_ & STATIC_IN_SOURCE) {
- if (declblock_static_source->value()==0) {
- write_map_ &= ~STATIC_IN_SOURCE;
- Fluid.proj.set_modflag(1);
- }
- } else {
- if (declblock_static_source->value()) {
- write_map_ |= STATIC_IN_SOURCE;
- Fluid.proj.set_modflag(1);
- }
- }
- if (write_map_ & CODE_IN_HEADER) {
- if (declblock_code_header->value()==0) {
- write_map_ &= ~CODE_IN_HEADER;
- Fluid.proj.set_modflag(1);
- }
- } else {
- if (declblock_code_header->value()) {
- write_map_ |= CODE_IN_HEADER;
- Fluid.proj.set_modflag(1);
- }
- }
- if (write_map_ & CODE_IN_SOURCE) {
- if (declblock_code_source->value()==0) {
- write_map_ &= ~CODE_IN_SOURCE;
- Fluid.proj.set_modflag(1);
- }
- } else {
- if (declblock_code_source->value()) {
- write_map_ |= CODE_IN_SOURCE;
- Fluid.proj.set_modflag(1);
- }
- }
- c = declblock_comment_input->buffer()->text();
- if (c && *c) {
- if (!comment() || strcmp(c, comment())) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(c);
- } else {
- if (comment()) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(nullptr);
- }
- if (c) free((void*)c);
- break;
- }
-BREAK2:
- declblock_panel->hide();
+ open_panel();
}
/**
@@ -1767,7 +1433,7 @@ void Comment_Node::read_property(fld::io::Project_Reader &f, const char *c) {
add their own presets which are stored per user in a separate
preferences database.
*/
-static void load_comments_preset(Fl_Preferences &menu) {
+void load_comments_preset(Fl_Preferences &menu) {
static const char * const predefined_comment[] = {
"GNU Public License v3/GPL Header", "GNU Public License v3/GPL Footer",
"GNU Public License v3/LGPL Header", "GNU Public License v3/LGPL Footer",
@@ -1787,119 +1453,7 @@ static void load_comments_preset(Fl_Preferences &menu) {
Open the comment_panel to edit this node.
*/
void Comment_Node::open() {
- if (!comment_panel) make_comment_panel();
- const char *text = name();
- {
- int i=0, n=0, version = 0;
- Fl_Preferences menu(Fl_Preferences::USER_L, "fltk.org", "fluid_comments_menu");
- comment_predefined->clear();
- comment_predefined->add("_Edit/Add current comment...");
- comment_predefined->add("_Edit/Remove last selection...");
- menu.get("version", version, -1);
- if (version < 10400) load_comments_preset(menu);
- menu.get("n", n, 0);
- for (i=0;i<n;i++) {
- char *text;
- menu.get(Fl_Preferences::Name(i), text, "");
- comment_predefined->add(text);
- free(text);
- }
- }
- comment_input->buffer()->text( text ? text : "" );
- comment_in_source->value(in_c_);
- comment_in_header->value(in_h_);
- comment_panel->show();
- char itempath[FL_PATH_MAX]; itempath[0] = 0;
- int last_selected_item = 0;
- for (;;) { // repeat as long as there are errors
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == comment_panel_cancel) goto BREAK2;
- else if (w == comment_panel_ok) break;
- else if (w == comment_predefined) {
- if (comment_predefined->value()==1) {
- // add the current comment to the database
- const char *xname = fl_input(
- "Please enter a name to reference the current\ncomment in your database.\n\n"
- "Use forward slashes '/' to create submenus.",
- "My Comment");
- if (xname) {
- char *name = fl_strdup(xname);
- for (char*s=name;*s;s++) if (*s==':') *s = ';';
- int n;
- Fl_Preferences db(Fl_Preferences::USER_L, "fltk.org", "fluid_comments");
- db.set(name, comment_input->buffer()->text());
- Fl_Preferences menu(Fl_Preferences::USER_L, "fltk.org", "fluid_comments_menu");
- menu.get("n", n, 0);
- menu.set(Fl_Preferences::Name(n), name);
- menu.set("n", ++n);
- comment_predefined->add(name);
- free(name);
- }
- } else if (comment_predefined->value()==2) {
- // remove the last selected comment from the database
- if (itempath[0]==0 || last_selected_item==0) {
- fl_message("Please select an entry from this menu first.");
- } else if (fl_choice("Are you sure that you want to delete the entry\n"
- "\"%s\"\nfrom the database?", "Cancel", "Delete",
- nullptr, itempath)) {
- Fl_Preferences db(Fl_Preferences::USER_L, "fltk.org", "fluid_comments");
- db.deleteEntry(itempath);
- comment_predefined->remove(last_selected_item);
- Fl_Preferences menu(Fl_Preferences::USER_L, "fltk.org", "fluid_comments_menu");
- int i, n;
- for (i=4, n=0; i<comment_predefined->size(); i++) {
- const Fl_Menu_Item *mi = comment_predefined->menu()+i;
- if (comment_predefined->item_pathname(itempath, 255, mi)==0) {
- if (itempath[0]=='/') memmove(itempath, itempath+1, 255);
- if (itempath[0]) menu.set(Fl_Preferences::Name(n++), itempath);
- }
- }
- menu.set("n", n);
- }
- } else {
- // load the selected comment from the database
- if (comment_predefined->item_pathname(itempath, 255)==0) {
- if (itempath[0]=='/') memmove(itempath, itempath+1, 255);
- Fl_Preferences db(Fl_Preferences::USER_L, "fltk.org", "fluid_comments");
- char *text;
- db.get(itempath, text, "(no text found in data base)");
- comment_input->buffer()->text(text);
- free(text);
- last_selected_item = comment_predefined->value();
- }
- }
- }
- else if (w == comment_load) {
- // load a comment from disk
- fl_file_chooser_ok_label("Use File");
- const char *fname = fl_file_chooser("Pick a comment", nullptr, nullptr);
- fl_file_chooser_ok_label(nullptr);
- if (fname) {
- if (comment_input->buffer()->loadfile(fname)) {
- fl_alert("Error loading file\n%s", fname);
- }
- }
- }
- else if (!w) Fl::wait();
- }
- char*c = comment_input->buffer()->text();
- name(c);
- free(c);
- int mod = 0;
- if (in_c_ != comment_in_source->value()) {
- in_c_ = comment_in_source->value();
- mod = 1;
- }
- if (in_h_ != comment_in_header->value()) {
- in_h_ = comment_in_header->value();
- mod = 1;
- }
- if (mod) Fluid.proj.set_modflag(1);
- break;
- }
-BREAK2:
- comment_panel->hide();
+ open_panel();
}
/**
@@ -2049,75 +1603,7 @@ void Class_Node::read_property(fld::io::Project_Reader &f, const char *c) {
Open the class_panel to edit the class name and superclass name.
*/
void Class_Node::open() {
- if (!class_panel) make_class_panel();
- char fullname[FL_PATH_MAX]="";
- if (prefix() && strlen(prefix()))
- sprintf(fullname,"%s %s",prefix(),name());
- else
- strcpy(fullname, name());
- c_name_input->value(fullname);
- c_subclass_input->value(subclass_of);
- c_public_button->value(public_);
- const char *c = comment();
- c_comment_input->buffer()->text(c?c:"");
- class_panel->show();
- const char* message = nullptr;
-
- char *na=nullptr,*pr=nullptr,*p=nullptr; // name and prefix substrings
-
- for (;;) { // repeat as long as there are errors
- // we don;t give the option to ignore this error here because code depends
- // on this being a C++ identifier
- if (message) fl_alert("%s", message);
- for (;;) {
- Fl_Widget* w = Fl::readqueue();
- if (w == c_panel_cancel) goto BREAK2;
- else if (w == c_panel_ok) break;
- else if (!w) Fl::wait();
- }
- const char*c = c_name_input->value();
- char *s = fl_strdup(c);
- size_t len = strlen(s);
- if (!*s) goto OOPS;
- p = (char*) (s+len-1);
- while (p>=s && isspace(*p)) *(p--)='\0';
- if (p<s) goto OOPS;
- while (p>=s && is_id(*p)) p--;
- if ( (p<s && !is_id(*(p+1))) || !*(p+1) ) {
- OOPS: message = "class name must be C++ identifier";
- free((void*)s);
- continue;
- }
- na=p+1; // now we have the name
- if(p>s) *p--='\0';
- while (p>=s && isspace(*p)) *(p--)='\0';
- while (p>=s && is_id(*p)) p--;
- if (p<s) p++;
- if (is_id(*p) && p<na) pr=p; // prefix detected
- c = c_subclass_input->value();
- message = c_check(c);
- if (message) { free((void*)s);continue;}
- name(na);
- prefix(pr);
- free((void*)s);
- storestring(c, subclass_of);
- if (public_ != c_public_button->value()) {
- public_ = c_public_button->value();
- Fluid.proj.set_modflag(1);
- }
- c = c_comment_input->buffer()->text();
- if (c && *c) {
- if (!comment() || strcmp(c, comment())) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(c);
- } else {
- if (comment()) { Fluid.proj.set_modflag(1); redraw_browser(); }
- comment(nullptr);
- }
- if (c) free((void*)c);
- break;
- }
-BREAK2:
- class_panel->hide();
+ open_panel();
}
/**