Blame bin/gegl-options.c

Packit Service 2781ba
/* This file is part of GEGL editor -- a gtk frontend for GEGL
Packit Service 2781ba
 *
Packit Service 2781ba
 * This program is free software; you can redistribute it and/or modify
Packit Service 2781ba
 * it under the terms of the GNU General Public License as published by
Packit Service 2781ba
 * the Free Software Foundation; either version 3 of the License, or
Packit Service 2781ba
 * (at your option) any later version.
Packit Service 2781ba
 *
Packit Service 2781ba
 * This program is distributed in the hope that it will be useful,
Packit Service 2781ba
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 2781ba
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 2781ba
 * GNU General Public License for more details.
Packit Service 2781ba
 *
Packit Service 2781ba
 * You should have received a copy of the GNU General Public License
Packit Service 2781ba
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit Service 2781ba
 *
Packit Service 2781ba
 * Copyright (C) 2003, 2004, 2006 Øyvind Kolås
Packit Service 2781ba
 */
Packit Service 2781ba
Packit Service 2781ba
#include "config.h"
Packit Service 2781ba
Packit Service 2781ba
#include <string.h>
Packit Service 2781ba
#include <stdlib.h>
Packit Service 2781ba
#include <stdio.h>
Packit Service 2781ba
Packit Service 2781ba
#include "gegl-options.h"
Packit Service 2781ba
Packit Service 2781ba
static GeglOptions *opts_new (void)
Packit Service 2781ba
{
Packit Service 2781ba
  GeglOptions *o = g_malloc0 (sizeof (GeglOptions));
Packit Service 2781ba
Packit Service 2781ba
  o->mode     = GEGL_RUN_MODE_DISPLAY;
Packit Service 2781ba
  o->xml      = NULL;
Packit Service 2781ba
  o->output   = NULL;
Packit Service 2781ba
  o->files    = NULL;
Packit Service 2781ba
  o->file     = NULL;
Packit Service 2781ba
  o->rest     = NULL;
Packit Service 2781ba
  return o;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
static G_GNUC_NORETURN void
Packit Service 2781ba
usage (char *application_name)
Packit Service 2781ba
{
Packit Service 2781ba
    fprintf (stderr,
Packit Service 2781ba
"usage: %s [options] <file | -- [op [op] ..]>\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"  Options:\n"
Packit Service 2781ba
"     -h, --help      this help information\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     -i, --file      read xml from named file\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     -x, --xml       use xml provided in next argument\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     --dot           output a graphviz graph description\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     -o, --output    output generated image to named file, type based\n"
Packit Service 2781ba
"                     on extension.\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     -p              increment frame counters of various elements when\n"
Packit Service 2781ba
"                     processing is done.\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     -X              output the XML that was read in\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"     -v, --verbose   print diagnostics while running\n"
Packit Service 2781ba
"\n"
Packit Service 2781ba
"All parameters following -- are considered ops to be chained together\n"
Packit Service 2781ba
"into a small composition instead of using an xml file, this allows for\n"
Packit Service 2781ba
"easy testing of filters. Be aware that the default value will be used\n"
Packit Service 2781ba
"for all properties.\n"
Packit Service 2781ba
, application_name);
Packit Service 2781ba
    exit (0);
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
#define match(string) (!strcmp (*curr, (string)))
Packit Service 2781ba
#define assert_argument() do {\
Packit Service 2781ba
    if (!curr[1] || curr[1][0]=='-') {\
Packit Service 2781ba
        fprintf (stderr, "ERROR: '%s' option expected argument\n", *curr);\
Packit Service 2781ba
        exit(-1);\
Packit Service 2781ba
    }\
Packit Service 2781ba
}while(0)
Packit Service 2781ba
Packit Service 2781ba
#define get_float(var) do{\
Packit Service 2781ba
    assert_argument();\
Packit Service 2781ba
    curr++;\
Packit Service 2781ba
    (var)=atof(*curr);\
Packit Service 2781ba
}while(0)
Packit Service 2781ba
Packit Service 2781ba
#define get_int(var) do{\
Packit Service 2781ba
    assert_argument();\
Packit Service 2781ba
    curr++;\
Packit Service 2781ba
    (var)=atoi(*curr);\
Packit Service 2781ba
}while(0)
Packit Service 2781ba
Packit Service 2781ba
#define get_string(var) do{\
Packit Service 2781ba
    assert_argument();\
Packit Service 2781ba
    curr++;\
Packit Service 2781ba
    (var)=*curr;\
Packit Service 2781ba
}while(0)
Packit Service 2781ba
Packit Service 2781ba
#define get_string_forced(var) do{\
Packit Service 2781ba
    curr++;\
Packit Service 2781ba
    (var)=*curr;\
Packit Service 2781ba
}while(0)
Packit Service 2781ba
Packit Service 2781ba
static GeglOptions *
Packit Service 2781ba
parse_args (gint    argc,
Packit Service 2781ba
            gchar **argv);
Packit Service 2781ba
Packit Service 2781ba
static void
Packit Service 2781ba
print_opts (GeglOptions *o)
Packit Service 2781ba
{
Packit Service 2781ba
  char *mode_str;
Packit Service 2781ba
  switch (o->mode)
Packit Service 2781ba
    {
Packit Service 2781ba
      case GEGL_RUN_MODE_DISPLAY:
Packit Service 2781ba
        mode_str = "Display on screen"; break;
Packit Service 2781ba
      case GEGL_RUN_MODE_XML:
Packit Service 2781ba
        mode_str = "Print XML"; break;
Packit Service 2781ba
      case GEGL_RUN_MODE_OUTPUT:
Packit Service 2781ba
        mode_str = "Output in a file"; break;
Packit Service 2781ba
      case GEGL_RUN_MODE_HELP:
Packit Service 2781ba
        mode_str = "Display help information"; break;
Packit Service 2781ba
      default:
Packit Service 2781ba
        g_warning ("Unknown GeglOption mode: %d", o->mode);
Packit Service 2781ba
        break;
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
    fprintf (stderr,
Packit Service 2781ba
"Parsed commandline:\n"
Packit Service 2781ba
"\tmode:   %s\n"
Packit Service 2781ba
"\tfile:   %s\n"
Packit Service 2781ba
"\txml:    %s\n"
Packit Service 2781ba
"\toutput: %s\n"
Packit Service 2781ba
"\trest:   %s\n"
Packit Service 2781ba
"\t\n",
Packit Service 2781ba
    mode_str,
Packit Service 2781ba
    o->file==NULL?"(null)":o->file,
Packit Service 2781ba
    o->xml==NULL?"(null)":o->xml,
Packit Service 2781ba
    o->output==NULL?"(null)":o->output,
Packit Service 2781ba
    o->rest==NULL?"":"yes"
Packit Service 2781ba
);
Packit Service 2781ba
    {
Packit Service 2781ba
      GList *files = o->files;
Packit Service 2781ba
      while (files)
Packit Service 2781ba
        {
Packit Service 2781ba
          fprintf (stderr, "\t%s\n", (gchar*)files->data);
Packit Service 2781ba
          files = g_list_next (files);
Packit Service 2781ba
        }
Packit Service 2781ba
    }
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
GeglOptions *
Packit Service 2781ba
gegl_options_parse (gint    argc,
Packit Service 2781ba
                    gchar **argv)
Packit Service 2781ba
{
Packit Service 2781ba
    GeglOptions *o;
Packit Service 2781ba
Packit Service 2781ba
    o = parse_args (argc, argv);
Packit Service 2781ba
    if (o->verbose)
Packit Service 2781ba
        print_opts (o);
Packit Service 2781ba
    return o;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
gboolean
Packit Service 2781ba
gegl_options_next_file (GeglOptions *o)
Packit Service 2781ba
{
Packit Service 2781ba
  GList *current = g_list_find (o->files, o->file);
Packit Service 2781ba
  current = g_list_next (current);
Packit Service 2781ba
  if (current)
Packit Service 2781ba
    {
Packit Service 2781ba
      g_warning ("%s", o->file);
Packit Service 2781ba
      o->file = current->data;
Packit Service 2781ba
      g_warning ("%s", o->file);
Packit Service 2781ba
      return TRUE;
Packit Service 2781ba
    }
Packit Service 2781ba
  return FALSE;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
gboolean
Packit Service 2781ba
gegl_options_previous_file (GeglOptions *o)
Packit Service 2781ba
{
Packit Service 2781ba
  GList *current = g_list_find (o->files, o->file);
Packit Service 2781ba
  current = g_list_previous (current);
Packit Service 2781ba
  if (current)
Packit Service 2781ba
    {
Packit Service 2781ba
      o->file = current->data;
Packit Service 2781ba
      return TRUE;
Packit Service 2781ba
    }
Packit Service 2781ba
  return FALSE;
Packit Service 2781ba
}
Packit Service 2781ba
Packit Service 2781ba
Packit Service 2781ba
static GeglOptions *
Packit Service 2781ba
parse_args (int    argc,
Packit Service 2781ba
            char **argv)
Packit Service 2781ba
{
Packit Service 2781ba
    GeglOptions *o;
Packit Service 2781ba
    char **curr;
Packit Service 2781ba
Packit Service 2781ba
    if (argc==1) {
Packit Service 2781ba
        usage (argv[0]);
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
    o = opts_new ();
Packit Service 2781ba
    curr = argv+1;
Packit Service 2781ba
Packit Service 2781ba
    while (*curr && !o->rest) {
Packit Service 2781ba
        if (match ("-h")    ||
Packit Service 2781ba
            match ("--help")) {
Packit Service 2781ba
            o->mode = GEGL_RUN_MODE_HELP;
Packit Service 2781ba
            usage (argv[0]);
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("--verbose") ||
Packit Service 2781ba
                 match ("-v")) {
Packit Service 2781ba
            o->verbose=1;
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("--g-fatal-warnings") ||
Packit Service 2781ba
                 match ("-v")) {
Packit Service 2781ba
            o->fatal_warnings=1;
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("-p")){
Packit Service 2781ba
            o->play=TRUE;
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("--file") ||
Packit Service 2781ba
                 match ("-i")) {
Packit Service 2781ba
            const gchar *file_path;
Packit Service 2781ba
            get_string (file_path);
Packit Service 2781ba
            o->files = g_list_append (o->files, g_strdup (file_path));
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("--xml") ||
Packit Service 2781ba
                 match ("-x")) {
Packit Service 2781ba
            get_string (o->xml);
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("--output") ||
Packit Service 2781ba
                 match ("-o")) {
Packit Service 2781ba
            get_string_forced (o->output);
Packit Service 2781ba
            o->mode = GEGL_RUN_MODE_OUTPUT;
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("-X")) {
Packit Service 2781ba
            o->mode = GEGL_RUN_MODE_XML;
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (match ("--")) {
Packit Service 2781ba
            o->rest = curr+1;
Packit Service 2781ba
            break;
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else if (*curr[0]=='-') {
Packit Service 2781ba
            fprintf (stderr, "\n\nunknown parameter '%s' giving you help instead\n\n\n", *curr);
Packit Service 2781ba
            usage (argv[0]);
Packit Service 2781ba
        }
Packit Service 2781ba
Packit Service 2781ba
        else
Packit Service 2781ba
          {
Packit Service 2781ba
            o->files = g_list_append (o->files, g_strdup (*curr));
Packit Service 2781ba
          }
Packit Service 2781ba
        curr++;
Packit Service 2781ba
    }
Packit Service 2781ba
Packit Service 2781ba
    if (o->files)
Packit Service 2781ba
      o->file = o->files->data;
Packit Service 2781ba
    return o;
Packit Service 2781ba
}
Packit Service 2781ba
#undef match
Packit Service 2781ba
#undef assert_argument