OSDN Git Service

ui: plug multiple command_line_get_word leaks
[android-x86/external-parted.git] / parted / command.c
1 /*
2     parted - a frontend to libparted
3     Copyright (C) 1999-2000, 2007, 2009 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