1 /*
   2     parted - a frontend to libparted
   3     Copyright (C) 1999, 2000, 2007 Free Software Foundation, Inc.
   4 
   5     This program is free software; you can redistribute it and/or modify
   6     it under the terms of the GNU General Public License as published by
   7     the Free Software Foundation; either version 3 of the License, or
   8     (at your option) any later version.
   9 
  10     This program is distributed in the hope that it will be useful,
  11     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13     GNU General Public License for more details.
  14 
  15     You should have received a copy of the GNU General Public License
  16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17 */
  18 
  19 #include <config.h>
  20 #include "command.h"
  21 #include "ui.h"
  22 
  23 #include <parted/debug.h>
  24 
  25 #include <stdlib.h>
  26 #include <string.h>
  27 #include "xalloc.h"
  28 
  29 Command*
  30 command_create (const StrList* names,
  31                 int (*method) (PedDevice** dev),
  32                 const StrList* summary,
  33                 const StrList* help,
  34                 const int non_interactive)
  35 {
  36         Command*        cmd;
  37 
  38         cmd = xmalloc (sizeof (Command));
  39         
  40         if (non_interactive)
  41                 cmd->non_interactive = 1;
  42         else
  43                 cmd->non_interactive = 0;
  44                 
  45         cmd->names = (StrList*) names;
  46         cmd->method = method;
  47         cmd->summary = (StrList*) summary;
  48         cmd->help = (StrList*) help;
  49 
  50         return cmd;
  51 }
  52 
  53 void
  54 command_destroy (Command* cmd)
  55 {
  56         str_list_destroy (cmd->names);
  57         str_list_destroy (cmd->summary);
  58         str_list_destroy (cmd->help);
  59         free (cmd);
  60 }
  61 
  62 void
  63 command_register (Command** list, Command* cmd)
  64 {
  65         int     i;
  66 
  67         for (i = 0; list [i]; i++);
  68 
  69         list [i] = cmd;
  70         list [i + 1] = (Command*) NULL;
  71 }
  72 
  73 Command*
  74 command_get (Command** list, char* name)
  75 {
  76         int             i;
  77         int             partial_match = -1;
  78         int             ambiguous = 0;
  79 
  80         if (!name)
  81                 return NULL;
  82 
  83         for (i=0; list [i]; i++) {
  84                 switch (str_list_match_any (list [i]->names, name)) {
  85                 case 2:
  86                         return list [i];
  87 
  88                 case 1:
  89                         if (!ambiguous) {
  90                                 if (partial_match == -1) {
  91                                         partial_match = i;
  92                                 } else {
  93                                         partial_match = -1;
  94                                         ambiguous = 1;
  95                                 }
  96                         }
  97                 }
  98         }
  99 
 100         if (partial_match == -1)
 101                 return NULL;
 102         else
 103                 return list [partial_match];
 104 }
 105 
 106 StrList*
 107 command_get_names (Command** list)
 108 {
 109         Command**       walk;
 110         StrList*        result = NULL;
 111 
 112         for (walk = list; *walk; walk++)
 113                 result = str_list_join (result,
 114                                         str_list_duplicate ((*walk)->names));
 115         return result;
 116 }
 117 
 118 void
 119 command_print_summary (Command* cmd)
 120 {
 121         fputs ("  ", stdout);
 122         str_list_print_wrap (cmd->summary, screen_width(), 2, 8);
 123         putchar ('\n');
 124 }
 125 
 126 void
 127 command_print_help (Command* cmd)
 128 {
 129         command_print_summary (cmd);
 130         if (cmd->help) {
 131                 fputs ("\n\t", stdout);
 132                 str_list_print_wrap (cmd->help, screen_width(), 8, 8);
 133         }
 134 }
 135 
 136 int
 137 command_run (Command* cmd, PedDevice** dev)
 138 {
 139         return cmd->method (dev);
 140 }
 141