summaryrefslogtreecommitdiff
path: root/fluid/app/args.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2025-03-16 17:16:12 -0400
committerGitHub <noreply@github.com>2025-03-16 17:16:12 -0400
commit51a55bc73660f64e8f4b32b8b4d3858f2a786f7b (patch)
tree122ad9f838fcf8f61ed7cf5fa031e8ed69817e10 /fluid/app/args.cxx
parent13a7073a1e007ce5b71ef70bced1a9b15158820d (diff)
Fluid: restructuring and rejuvenation of the source code.
* Add classes for application and project * Removed all globals from Fluid.h * Extracting args and project history into their own classes * Moving globals into Application class * Initialize values inside headers for some classes. * Undo functionality wrapped in a class inside Project. * File reader and writer are now linked to a project. * Avoid global project access * Nodes (former Types) will be managed by a new Tree class. * Removed static members (hidden globals) form Node/Fl_Type. * Adding Tree iterator. * Use nullptr instead of 0, NULL, or 0L * Renamed Fl_..._Type to ..._Node, FL_OVERRIDE -> override * Renaming ..._type to ...::prototype * Splitting Widget Panel into multiple files. * Moved callback code into widget panel file. * Cleaning up Fluid_Image -> Image_asset * Moving Fd_Snap_Action into new namespace fld::app::Snap_Action etc. * Moved mergeback into proj folder. * `enum ID` is now `enum class Type`.
Diffstat (limited to 'fluid/app/args.cxx')
-rw-r--r--fluid/app/args.cxx136
1 files changed, 136 insertions, 0 deletions
diff --git a/fluid/app/args.cxx b/fluid/app/args.cxx
new file mode 100644
index 000000000..b9d958e8c
--- /dev/null
+++ b/fluid/app/args.cxx
@@ -0,0 +1,136 @@
+//
+// Command Line Arguments Handling code for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 1998-2025 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file. If this
+// file is missing or damaged, see the license at:
+//
+// https://www.fltk.org/COPYING.php
+//
+// Please see the following page on how to report bugs and issues:
+//
+// https://www.fltk.org/bugs.php
+//
+
+#include "app/args.h"
+
+#include "Fluid.h"
+
+#include <FL/Fl.H>
+#include <FL/filename.H>
+#include <FL/fl_ask.H>
+
+using namespace fld;
+using namespace fld::app;
+
+/**
+ Load args from command line into variables.
+
+ \param[in] argc number of arguments in the list
+ \param[in] argv pointer to an array of arguments
+ \return 0 if the args were handled successfully, -1 if there was an error
+ and the usage message was shown.
+ */
+int Args::load(int argc,char **argv) {
+ int i = 1;
+ Fl::args_to_utf8(argc, argv); // for MSYS2/MinGW
+ if ( (Fl::args(argc,argv,i,arg_cb) == 0) // unsupported argument found
+ || (Fluid.batch_mode && (i != argc-1)) // .fl filename missing
+ || (!Fluid.batch_mode && (i < argc-1)) // more than one filename found
+ || (argv[i] && (argv[i][0] == '-'))) { // unknown option
+ static const char *msg =
+ "usage: %s <switches> name.fl\n"
+ " -u : update .fl file and exit (may be combined with '-c' or '-cs')\n"
+ " -c : write .cxx and .h and exit\n"
+ " -cs : write .cxx and .h and strings and exit\n"
+ " -o <name> : .cxx output filename, or extension if <name> starts with '.'\n"
+ " -h <name> : .h output filename, or extension if <name> starts with '.'\n"
+ " --help : brief usage information\n"
+ " --version, -v : print fluid version number\n"
+ " -d : enable internal debugging\n";
+ const char *app_name = nullptr;
+ if ( (argc > 0) && argv[0] && argv[0][0] )
+ app_name = fl_filename_name(argv[0]);
+ if ( !app_name || !app_name[0])
+ app_name = "fluid";
+#ifdef _MSC_VER
+ // TODO: if this is fluid-cmd, use stderr and not fl_message
+ fl_message(msg, app_name);
+#else
+ fprintf(stderr, msg, app_name);
+#endif
+ return -1;
+ }
+ return i;
+}
+
+
+int Args::arg_cb(int argc, char** argv, int& i) {
+ return Fluid.args.arg(argc, argv, i);
+}
+
+
+/**
+ Handle command line arguments.
+ \param[in] argc number of arguments in the list
+ \param[in] argv pointer to an array of arguments
+ \param[inout] i current argument index
+ \return number of arguments used; if 0, the argument is not supported
+ */
+int Args::arg(int argc, char** argv, int& i) {
+ if (argv[i][0] != '-')
+ return 0;
+ if (argv[i][1] == 'd' && !argv[i][2]) {
+ Fluid.debug_external_editor=1;
+ i++; return 1;
+ }
+ if (argv[i][1] == 'u' && !argv[i][2]) {
+ update_file++;
+ Fluid.batch_mode++;
+ i++; return 1;
+ }
+ if (argv[i][1] == 'c' && !argv[i][2]) {
+ compile_file++;
+ Fluid.batch_mode++;
+ i++; return 1;
+ }
+ if ((strcmp(argv[i], "-v")==0) || (strcmp(argv[i], "--version")==0)) {
+ show_version = 1;
+ i++; return 1;
+ }
+ if (argv[i][1] == 'c' && argv[i][2] == 's' && !argv[i][3]) {
+ compile_file++;
+ compile_strings++;
+ Fluid.batch_mode++;
+ i++; return 1;
+ }
+ if (argv[i][1] == 'o' && !argv[i][2] && i+1 < argc) {
+ code_filename = argv[i+1];
+ Fluid.batch_mode++;
+ i += 2; return 2;
+ }
+#ifndef NDEBUG
+ if ((i+1 < argc) && (strcmp(argv[i], "--autodoc") == 0)) {
+ autodoc_path = argv[i+1];
+ i += 2; return 2;
+ }
+#endif
+ if (strcmp(argv[i], "--help")==0) {
+ return 0;
+ }
+ if (argv[i][1] == 'h' && !argv[i][2]) {
+ if ( (i+1 < argc) && (argv[i+1][0] != '-') ) {
+ header_filename = argv[i+1];
+ Fluid.batch_mode++;
+ i += 2;
+ return 2;
+ } else {
+ // a lone "-h" without a filename will output the help string
+ return 0;
+ }
+ }
+ return 0;
+}
+