--- old/usr/src/cmd/parted/ui.c	2014-07-17 16:13:39.026268885 +0200
+++ /dev/null	2014-07-17 16:13:39.000000000 +0200
@@ -1,1542 +0,0 @@
-/*
-    parted - a frontend to libparted
-    Copyright (C) 1999, 2000, 2001, 2002, 2006, 2007
-    Free Software Foundation, Inc.
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <parted/parted.h>
-#include <parted/debug.h>
-
-#include <ctype.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <setjmp.h>
-
-#include <config.h>
-#include "command.h"
-#include "strlist.h"
-#include "ui.h"
-#include "error.h"
-
-#define N_(String) String
-#if ENABLE_NLS
-#  include <libintl.h>
-#  include <locale.h>
-#  define _(String) dgettext (PACKAGE, String)
-#else
-#  define _(String) (String)
-#endif /* ENABLE_NLS */
-
-#ifdef HAVE_LIBREADLINE
-
-#ifdef HAVE_TERMCAP_H
-#include <termcap.h>
-#else
-extern int tgetnum (char* key);
-#endif
-
-#include <readline/readline.h>
-#include <readline/history.h>
-
-#ifndef HAVE_RL_COMPLETION_MATCHES
-#define rl_completion_matches completion_matches
-#endif
-
-#ifndef rl_compentry_func_t
-#define rl_compentry_func_t void
-#endif
-
-#endif /* HAVE_LIBREADLINE */
-
-#ifndef SA_SIGINFO
-#  ifndef HAVE_SIGACTION
-
-struct sigaction {
-};
-
-static inline int
-sigaction (int signum, const struct* sigaction, struct* sigaction)
-{
-}
-
-#  endif /* HAVE_SIGACTON */
-
-struct siginfo_t {
-        int si_code;
-};
-
-#endif /* SA_SIGINFO */
-
-#ifndef SEGV_MAPERR
-#  define SEGV_MAPERR (INTMAX - 1)
-#endif
-
-#ifndef SEGV_ACCERR
-#  define SEGV_ACCERR (INTMAX - 2)
-#endif
-
-#ifndef FPE_INTDIV
-#  define FPE_INTDIV (INTMAX - 1)
-#endif
-
-#ifndef FPE_INTOVF
-#  define FPE_INTOVF (INTMAX - 2)
-#endif
-
-#ifndef FPE_FLTDIV
-#  define FPE_FLTDIV (INTMAX - 3)
-#endif
-
-#ifndef FPE_FLTOVF
-#  define FPE_FLTOVF (INTMAX - 4)
-#endif
-
-#ifndef FPE_FLTUND
-#  define FPE_FLTUND (INTMAX - 5)
-#endif
-
-#ifndef FPE_FLTRES
-#  define FPE_FLTRES (INTMAX - 6)
-#endif
-
-#ifndef FPE_FLTINV
-#  define FPE_FLTINV (INTMAX - 7)
-#endif
-
-#ifndef FPE_FLTSUB
-#  define FPE_FLTSUB (INTMAX - 8)
-#endif
-
-#ifndef ILL_ILLOPC
-#  define ILL_ILLOPC (INTMAX - 1)
-#endif
-
-#ifndef ILL_ILLOPN
-#  define ILL_ILLOPN (INTMAX - 2)
-#endif
-
-#ifndef ILL_ILLADR
-#  define ILL_ILLADR (INTMAX - 3)
-#endif
-
-#ifndef ILL_ILLTRP
-#  define ILL_ILLTRP (INTMAX - 4)
-#endif
-
-#ifndef ILL_PRVOPC
-#  define ILL_PRVOPC (INTMAX - 5)
-#endif
-
-#ifndef ILL_PRVREG
-#  define ILL_PRVREG (INTMAX - 6)
-#endif
-
-#ifndef ILL_COPROC
-#  define ILL_COPROC (INTMAX - 7)
-#endif
-
-#ifndef ILL_BADSTK
-#  define ILL_BADSTK (INTMAX - 8)
-#endif
-
-char* prog_name = "GNU Parted " VERSION "\n";
-
-static char* banner_msg = N_(
-"Welcome to GNU Parted! Type 'help' to view a list of commands.\n");
-
-static char* usage_msg = N_(
-"Usage: parted [OPTION]... [DEVICE [COMMAND [PARAMETERS]...]...]\n"
-"Apply COMMANDs with PARAMETERS to DEVICE.  If no COMMAND(s) are given, "
-"run in\ninteractive mode.\n");
-
-static char* bug_msg = N_(
-"\n\nYou found a bug in GNU Parted! Here's what you have to do:\n\n"
-"Don't panic! The bug has most likely not affected any of your data.\n"
-"Help us to fix this bug by doing the following:\n\n"
-"Check whether the bug has already been fixed by checking\n"
-"the last version of GNU Parted that you can find at:\n\n"
-"\thttp://ftp.gnu.org/gnu/parted/\n\n"
-"Please check this version prior to bug reporting.\n\n"
-"If this has not been fixed yet or if you don't know how to check,\n"
-"please visit the GNU Parted website:\n\n"
-"\thttp://www.gnu.org/software/parted\n\n"
-"for further information.\n\n"
-"Your report should contain the version of this release (%s)\n"
-"along with the error message below, the output of\n\n"
-"\tparted DEVICE unit co print unit s print\n\n"
-"and the following history of commands you entered.\n"
-"Also include any additional information about your setup you\n"
-"consider important.\n");
-
-#define MAX_WORDS    1024
-
-static StrList*     command_line;
-static Command**    commands;
-static StrList*     ex_opt_str [64];
-static StrList*     on_list;
-static StrList*     off_list;
-static StrList*     on_off_list;
-static StrList*     fs_type_list;
-static StrList*     disk_type_list;
-
-static struct {
-        const StrList*    possibilities;
-        const StrList*    cur_pos;
-        int               in_readline;
-        sigjmp_buf        jmp_state;
-} readline_state;
-
-static struct sigaction    sig_segv;
-static struct sigaction    sig_int;
-static struct sigaction    sig_fpe;
-static struct sigaction    sig_ill;
-
-volatile int got_ctrl_c = 0;    /* used in exception_handler */
-
-int
-screen_width ()
-{
-        int    width = 0;
-
-        if (opt_script_mode || pretend_input_tty)
-                return 32768;    /* no wrapping ;) */
-
-/* HACK: don't specify termcap separately - it'll annoy the users. */
-#ifdef HAVE_LIBREADLINE
-        width = tgetnum ("co");
-#endif
-
-        if (width <= 0)
-                width = 80;
-
-        return width;
-}
-
-void
-wipe_line ()
-{
-        if (opt_script_mode)
-                return;
-
-        /* yuck */
-        fputs ("\r                                     "
-               "                                     \r", stdout);
-}
-
-#ifdef HAVE_LIBREADLINE
-/* returns matching commands for text */
-static char*
-command_generator (char* text, int state)
-{
-        if (!state)
-                readline_state.cur_pos = readline_state.possibilities;
-
-        while (readline_state.cur_pos) {
-                const StrList*    cur = readline_state.cur_pos;
-                readline_state.cur_pos = cur->next;
-                if (str_list_match_node (cur, text))
-                        return str_list_convert_node (cur);
-        }
-
-        return NULL;
-}
-
-/* completion function for readline() */
-char**
-complete_function (char* text, int start, int end)
-{
-        return rl_completion_matches (text,
-                (rl_compentry_func_t*) command_generator);
-}
-
-static void
-_add_history_unique (const char* line)
-{
-        HIST_ENTRY*    last_entry = current_history ();
-        if (!strlen (line))
-                return;
-        if (!last_entry || strcmp (last_entry->line, line))
-                add_history ((char*) line);
-}
-
-/* Prints command history, to be used before aborting */
-static void
-_dump_history ()
-{
-        int             i = 0;
-        HIST_ENTRY**    all_entries = history_list ();
-
-        fputs (_("\nCommand History:\n"), stdout);
-        while (all_entries[i]) {
-                puts(all_entries[i++]->line);
-        }
-}
-
-#else
-
-/* Print nothing because Readline is absent. */
-static inline void
-_dump_history (void)
-{
-}
-
-#endif /* HAVE_LIBREADLINE */
-
-static void
-mask_signal()
-{
-        sigset_t    curr;
-        sigset_t    prev;
-  
-        sigfillset(&curr);
-        sigprocmask(SIG_SETMASK, &curr, &prev);
-}
-
-/* Resets the environment by jumping to the initial state
- * saved during ui intitialisation.
- * Pass 1 as the parameter if you want to quit parted, 
- * 0 if you just want to reset to the command prompt.
- */
-static void
-reset_env (int quit)
-{
-        int    in_readline = readline_state.in_readline;
-
-        readline_state.in_readline = 0;
-        
-        if (in_readline) {
-                putchar ('\n');
-                if (quit)    
-                        exit (0);
-
-                siglongjmp (readline_state.jmp_state, 1);
-        }
-}
-
-/* Signal handler for SIGINT using 'sigaction'. */
-static void
-sa_sigint_handler (int signum, siginfo_t* info, void *ucontext)
-{
-        if (info)
-                sigaction (SIGINT, &sig_int, NULL);
-
-        got_ctrl_c = 1;
-        reset_env (0);
-}
-
-/* Signal handler for SIGINT using 'signal'. */
-static void
-s_sigint_handler (int signum)
-{
-        signal (SIGINT, &s_sigint_handler);
-        mask_signal ();
-        sa_sigint_handler (signum, NULL, NULL);
-}
-
-/* Signal handler for SIGSEGV using 'sigaction'. */
-static void
-sa_sigsegv_handler (int signum, siginfo_t* info, void* ucontext)
-{
-        printf (bug_msg, VERSION);
-        _dump_history ();
-
-        if (!info)
-                abort ();
-
-        sigaction (SIGSEGV, &sig_segv, NULL);
-
-        switch (info->si_code) {
-
-                case SEGV_MAPERR:
-                        fputs(_("\nError: SEGV_MAPERR (Address not mapped "
-                                "to object)\n"), stdout);
-                        PED_ASSERT(0, break); /* Force a backtrace */
-                        break;
-
-                case SEGV_ACCERR:
-                        fputs(_("\nError: SEGV_ACCERR (Invalid permissions "
-                                "for mapped object)\n"), stdout);
-                        break;
-
-                default:
-                        fputs(_("\nError: A general SIGSEGV signal was "
-                                "encountered.\n"), stdout);
-                        PED_ASSERT(0, break); /* Force a backtrace */
-                        break;
-        }
-
-        abort ();
-}
-
-/* Signal handler for SIGSEGV using 'signal'. */
-static void
-s_sigsegv_handler (int signum)
-{
-        signal (SIGSEGV, &s_sigsegv_handler);
-        mask_signal ();
-        sa_sigsegv_handler (signum, NULL, NULL);
-}
-
-/* Signal handler for SIGFPE using 'sigaction'. */
-static void
-sa_sigfpe_handler (int signum, siginfo_t* info, void* ucontext)
-{
-        printf (bug_msg, VERSION);
-        _dump_history ();
-
-        if (!info)
-                abort ();
-
-        sigaction (SIGFPE, &sig_fpe, NULL);
-
-        switch (info->si_code) {
-
-                case FPE_INTDIV:
-                        fputs(_("\nError: FPE_INTDIV (Integer: "
-                                "divide by zero)"), stdout);
-                        break;
-        
-                case FPE_INTOVF:
-                        fputs(_("\nError: FPE_INTOVF (Integer: "
-                                "overflow)"), stdout);
-                        break;
-        
-                case FPE_FLTDIV:
-                        fputs(_("\nError: FPE_FLTDIV (Float: "
-                                "divide by zero)"), stdout);
-                        break;
-
-                case FPE_FLTOVF:
-                        fputs(_("\nError: FPE_FLTOVF (Float: "
-                                "overflow)"), stdout);
-                        break;
-
-                case FPE_FLTUND:
-                        fputs(_("\nError: FPE_FLTUND (Float: "
-                                "underflow)"), stdout);
-                        break;
-
-                case FPE_FLTRES:
-                        fputs(_("\nError: FPE_FLTRES (Float: "
-                                "inexact result)"), stdout);
-                        break;
-
-                case FPE_FLTINV:
-                        fputs(_("\nError: FPE_FLTINV (Float: "
-                                "invalid operation)"), stdout);
-                        break;
-
-                case FPE_FLTSUB:
-                        fputs(_("\nError: FPE_FLTSUB (Float: "
-                                "subscript out of range)"), stdout);
-                        break;
-
-                default:
-                        fputs(_("\nError: A general SIGFPE signal "
-                                "was encountered."), stdout);
-                        break;
-
-        }
-
-        abort ();
-}
-
-/* Signal handler for SIGFPE using 'signal'. */
-static void
-s_sigfpe_handler (int signum)
-{
-        signal (SIGFPE, &s_sigfpe_handler);
-        mask_signal ();
-        sa_sigfpe_handler (signum, NULL, NULL);
-}
-
-/* Signal handler for SIGILL using 'sigaction'. */
-static void
-sa_sigill_handler (int signum, siginfo_t* info, void* ucontext)
-{
-        printf (bug_msg, VERSION);
-        _dump_history ();
-
-        if (!info)
-                abort();
-
-        sigaction (SIGILL, &sig_ill, NULL);
-
-        switch (info->si_code) {
-
-                case ILL_ILLOPC:
-                        fputs(_("\nError: ILL_ILLOPC "
-                                "(Illegal Opcode)"), stdout);
-                        break;
-
-                case ILL_ILLOPN:
-                        fputs(_("\nError: ILL_ILLOPN "
-                                "(Illegal Operand)"), stdout);
-                        break;
-
-                case ILL_ILLADR:
-                        fputs(_("\nError: ILL_ILLADR "
-                                "(Illegal addressing mode)"), stdout);
-                        break;
-
-                case ILL_ILLTRP:
-                        fputs(_("\nError: ILL_ILLTRP "
-                                "(Illegal Trap)"), stdout);
-                        break;
-
-                case ILL_PRVOPC:
-                        fputs(_("\nError: ILL_PRVOPC "
-                                "(Privileged Opcode)"), stdout);
-                        break;
-
-                case ILL_PRVREG:
-                        fputs(_("\nError: ILL_PRVREG "
-                                "(Privileged Register)"), stdout);
-                        break;
-
-                case ILL_COPROC:
-                        fputs(_("\nError: ILL_COPROC "
-                                "(Coprocessor Error)"), stdout);
-                        break;
-
-                case ILL_BADSTK:
-                        fputs(_("\nError: ILL_BADSTK "
-                                "(Internal Stack Error)"), stdout);
-                        break;
-
-                default:
-                        fputs(_("\nError: A general SIGILL "
-                                "signal was encountered."), stdout);
-                        break;
-        }
-   
-        abort ();
-}
-
-/* Signal handler for SIGILL using 'signal'. */
-static void
-s_sigill_handler (int signum)
-{
-        signal (SIGILL, &s_sigill_handler);
-        mask_signal ();
-        sa_sigill_handler (signum, NULL, NULL);
-}
-
-static char*
-_readline (const char* prompt, const StrList* possibilities)
-{
-        char*    line;
-
-        readline_state.possibilities = possibilities;
-        readline_state.cur_pos = NULL;
-        readline_state.in_readline = 1;
-
-        if (sigsetjmp (readline_state.jmp_state,1))
-                return NULL;
-
-        wipe_line ();
-#ifdef HAVE_LIBREADLINE
-        if (!opt_script_mode) {
-                /* XXX: why isn't prompt const? */
-                line = readline ((char*) prompt);
-                if (line)
-                        _add_history_unique (line);
-        } else
-#endif
-        {
-                fputs (prompt, stdout);
-                fflush (stdout);
-                line = (char*) malloc (256);
-                if (fgets (line, 256, stdin) && strcmp (line, "") != 0) {
-#ifndef HAVE_LIBREADLINE
-                        /* Echo the input line, to be consistent with
-                           how readline-5.2 works.  */
-                        fputs (line, stdout);
-                        fflush (stdout);
-#endif
-                        line [strlen (line) - 1] = 0;    /* kill trailing CR */
-                } else {
-                        free (line);
-                        line = NULL;
-                }
-        }
-
-        readline_state.in_readline = 0;
-        return line;
-}
-
-static PedExceptionOption
-option_get_next (PedExceptionOption options, PedExceptionOption current)
-{
-        PedExceptionOption    i;
-
-        if (current == 0)
-                i = PED_EXCEPTION_OPTION_FIRST;
-        else
-                i = current * 2;
-
-        for (; i <= options; i *= 2) {
-                if (options & i)
-                        return i;
-        }
-        return 0;
-}
-
-static void
-_print_exception_text (PedException* ex)
-{
-        StrList*    text;
-
-        wipe_line ();
-
-        if (ex->type == PED_EXCEPTION_BUG) {
-                printf (bug_msg, VERSION);
-                text = str_list_create ("\n", ex->message, "\n\n", NULL);
-        } else {
-                text = str_list_create (
-                           _(ped_exception_get_type_string (ex->type)),
-                           ": ", ex->message, "\n", NULL);
-        }
-
-        str_list_print_wrap (text, screen_width (), 0, 0);
-        str_list_destroy (text);
-}
-
-static PedExceptionOption
-exception_handler (PedException* ex)
-{
-        PedExceptionOption    opt;
-
-        _print_exception_text (ex);
-
-        /* only one choice?  Take it ;-) */
-        opt = option_get_next (ex->options, 0);
-        if (!option_get_next (ex->options, opt))
-                return opt;
-
-        /* script-mode: don't handle the exception */
-        if (opt_script_mode || (!isatty (0) && !pretend_input_tty))
-                return PED_EXCEPTION_UNHANDLED;
-
-        got_ctrl_c = 0;
-
-        do {
-                opt = command_line_get_ex_opt ("", ex->options);
-        } while (opt == PED_EXCEPTION_UNHANDLED
-                 && (isatty (0) || pretend_input_tty) && !got_ctrl_c);
-
-        if (got_ctrl_c) {
-                got_ctrl_c = 0;
-                opt = PED_EXCEPTION_UNHANDLED;
-        }
-
-        return opt;
-}
-
-void
-command_line_push_word (const char* word)
-{
-        command_line = str_list_append (command_line, word);
-}
-
-char*
-command_line_pop_word ()
-{
-        char*       result;
-        StrList*    next;
-
-        PED_ASSERT (command_line != NULL, return NULL);
-
-        result = str_list_convert_node (command_line);
-        next = command_line->next;
-
-        str_list_destroy_node (command_line);
-        command_line = next;
-        return result;
-}
-
-void
-command_line_flush ()
-{
-        str_list_destroy (command_line);
-        command_line = NULL;
-}
-
-char*
-command_line_peek_word ()
-{
-        if (command_line)
-                return str_list_convert_node (command_line);
-        else
-                return NULL;
-}
-
-int
-command_line_get_word_count ()
-{
-        return str_list_length (command_line);
-}
-
-static int
-_str_is_spaces (const char* str)
-{
-        while (isspace (*str))
-                str++;
-
-        return *str == 0;
-}
-
-/* "multi_word mode" is the "normal" mode... many words can be typed,
- * delimited by spaces, etc.
- *         In single-word mode, only one word is parsed per line.
- * Leading and trailing spaces are removed.  For example: " a b c "
- * is a single word "a b c".  The motivation for this mode is partition
- * names, etc.  In single-word mode, the empty string is a word.
- * (but not in multi-word mode).
- */
-void
-command_line_push_line (const char* line, int multi_word)
-{
-        int     quoted = 0;
-        char    quote_char = 0;
-        char    this_word [256];
-        int     i;
-
-        do {
-                while (*line == ' ')
-                        line++;
-
-                i = 0;
-                for (; *line; line++) {
-                        if (*line == ' ' && !quoted) {
-                                if (multi_word)
-                                        break;
-
-                        /* single word: check for trailing spaces + eol */
-                                if (_str_is_spaces (line))
-                                        break;
-                        }
-
-                        if (!quoted && strchr ("'\"", *line)) {
-                                quoted = 1;
-                                quote_char = *line;
-                                continue;
-                        }
-
-                        if (quoted && *line == quote_char) {
-                                quoted = 0;
-                                continue;
-                        }
-
-                        /* hack: escape characters */
-                        if (quoted && line[0] == '\\' && line[1])
-                                line++;
-
-                        this_word [i++] = *line;
-                }
-                if (i || !multi_word) {
-                        this_word [i] = 0;
-                        command_line_push_word (this_word);
-                }
-        } while (*line && multi_word);
-}
-
-static char*
-realloc_and_cat (char* str, const char* append)
-{
-        int      length = strlen (str) + strlen (append) + 1;
-        char*    new_str = realloc (str, length);
-
-        strcat (new_str, append);
-        return new_str;
-}
-
-static char*
-_construct_prompt (const char* head, const char* def,
-                   const StrList* possibilities)
-{
-        char*    prompt = strdup (head);
-
-        if (def && possibilities)
-                PED_ASSERT (str_list_match_any (possibilities, def),
-                            return NULL);
-
-        if (possibilities && str_list_length (possibilities) < 8) {
-                const StrList*    walk;
-
-                if (strlen (prompt))
-                        prompt = realloc_and_cat (prompt, "  ");
-
-                for (walk = possibilities; walk; walk = walk->next) {
-                        if (walk != possibilities)
-                                prompt = realloc_and_cat (prompt, "/");
-
-                        if (def && str_list_match_node (walk, def) == 2) {
-                                prompt = realloc_and_cat (prompt, "[");
-                                prompt = realloc_and_cat (prompt, def);
-                                prompt = realloc_and_cat (prompt, "]");
-                        } else {
-                                char*    text = str_list_convert_node (walk);
-                                prompt = realloc_and_cat (prompt, text);
-                                free (text);
-                        }
-                }
-                prompt = realloc_and_cat (prompt, "? ");
-        } else if (def) {
-                if (strlen (prompt))
-                        prompt = realloc_and_cat (prompt, "  ");
-                prompt = realloc_and_cat (prompt, "[");
-                prompt = realloc_and_cat (prompt, def);
-                prompt = realloc_and_cat (prompt, "]? ");
-        } else {
-                if (strlen (prompt))
-                        prompt = realloc_and_cat (prompt, " ");
-        }
-
-        return prompt;
-}
-
-void
-command_line_prompt_words (const char* prompt, const char* def,
-                           const StrList* possibilities, int multi_word)
-{
-        char*    line;
-        char*    real_prompt;
-        char*    _def = (char*) def;
-        int      _def_needs_free = 0;
-
-        if (!def && str_list_length (possibilities) == 1) {
-                _def = str_list_convert_node (possibilities);
-                _def_needs_free = 1;
-        }
-
-        if (opt_script_mode) {
-                if (_def)
-                        command_line_push_line (_def, 0);
-                return;
-        }
-
-        do {
-                real_prompt = _construct_prompt (prompt, _def, possibilities);
-                line = _readline (real_prompt, possibilities);
-                free (real_prompt);
-                if (!line)
-                        break;
-
-                if (!strlen (line)) {
-                        if (_def)
-                                command_line_push_line (_def, 0);
-                } else {
-                        command_line_push_line (line, multi_word);
-                }
-                free (line);
-        } while (!command_line_get_word_count () && !_def);
-
-        if (_def_needs_free)
-                free (_def);
-}
-
-/**
- * Get a word from command line.
- *
- * \param possibilities a StrList of valid strings, NULL if all are valid.
- * \param multi_word whether multiple words are allowed.
- *
- * \return The word(s), or NULL if empty.
- */
-char*
-command_line_get_word (const char* prompt, const char* def,
-                       const StrList* possibilities, int multi_word)
-{
-        do {
-                if (command_line_get_word_count ()) {
-                        char*       result = command_line_pop_word ();
-                        StrList*    result_node;
-
-                        if (!possibilities)
-                                return result;
-
-                        result_node = str_list_match (possibilities, result);
-                        if (result_node == NULL)
-                                error (0, 0, _("invalid token: %s"), result);
-                        free (result);
-                        if (result_node)
-                                return str_list_convert_node (result_node);
-
-                        command_line_flush ();
-                        if (opt_script_mode)
-                                return NULL;
-                }
-
-                command_line_prompt_words (prompt, def, possibilities,
-                                           multi_word);
-        } while (command_line_get_word_count ());
-
-        return NULL;
-}
-
-int
-command_line_get_integer (const char* prompt, int* value)
-{
-        char     def_str [10];
-        char*    input;
-        int      valid;
-
-        snprintf (def_str, 10, "%d", *value);
-        input = command_line_get_word (prompt, *value ? def_str : NULL,
-                                       NULL, 1);
-        if (!input)
-                return 0;
-        valid = sscanf (input, "%d", value);
-        free (input);
-        return valid;
-}
-
-int
-command_line_get_sector (const char* prompt, PedDevice* dev, PedSector* value,
-                         PedGeometry** range)
-{
-        char*    def_str;
-        char*    input;
-        int      valid;
-
-        def_str = ped_unit_format (dev, *value);
-        input = command_line_get_word (prompt, *value ? def_str : NULL,
-                                       NULL, 1);
-
-        /* def_str might have rounded *value a little bit.  If the user picked
-         * the default, make sure the selected sector is identical to the
-         * default.
-         */
-        if (input && *value && !strcmp (input, def_str)) {
-                if (range) {
-                        *range = ped_geometry_new (dev, *value, 1);
-                        ped_free (def_str);
-                        return *range != NULL;
-                }
-
-                ped_free (def_str);
-                return 1;
-        }
-
-        ped_free (def_str);
-        if (!input) {
-                *value = 0;
-                if (range)
-                        *range = NULL;
-                return 0;
-        }
-
-        valid = ped_unit_parse (input, dev, value, range);
-
-        free (input);
-        return valid;
-}
-
-int
-command_line_get_state (const char* prompt, int* value)
-{
-        char*    def_word;
-        char*    input;
-
-        if (*value)
-                def_word = str_list_convert_node (on_list);
-        else
-                def_word = str_list_convert_node (off_list);
-        input = command_line_get_word (prompt, def_word, on_off_list, 1);
-        free (def_word);
-        if (!input)
-                return 0;
-        if (str_list_match_any (on_list, input))
-                *value = 1;
-        else
-                *value = 0;
-        free (input);
-        return 1;
-}
-
-int
-command_line_get_device (const char* prompt, PedDevice** value)
-{
-        char*         def_dev_name = *value ? (*value)->path : NULL;
-        char*         dev_name;
-        PedDevice*    dev;
-
-        dev_name = command_line_get_word (prompt, def_dev_name, NULL, 1);
-        if (!dev_name)
-                return 0;
-
-        dev = ped_device_get (dev_name);
-        free (dev_name);
-        if (!dev)
-                return 0;
-
-        *value = dev;
-        return 1;
-}
-
-int
-command_line_get_disk (const char* prompt, PedDisk** value)
-{
-        PedDevice*    dev = *value ? (*value)->dev : NULL;
-
-        if (!command_line_get_device (prompt, &dev))
-                return 0;
-
-        if (dev != (*value)->dev) {
-                PedDisk*    new_disk = ped_disk_new (dev);
-                if (!new_disk)
-                        return 0;
-                *value = new_disk;
-        }
-        return 1;
-}
-
-int
-command_line_get_partition (const char* prompt, PedDisk* disk,
-                            PedPartition** value)
-{
-        PedPartition*    part;
-
-        /* Flawed logic, doesn't seem to work?! 
-        check = ped_disk_next_partition (disk, part);
-        part  = ped_disk_next_partition (disk, check);
-
-        if (part == NULL) {
-
-        *value = check;          
-        printf (_("The (only) primary partition has "
-                  "been automatically selected\n"));
-        return 1;          
-
-        } else {
-        */
-        int num = (*value) ? (*value)->num : 0;
-
-        if (!command_line_get_integer (prompt, &num)) {
-                ped_exception_throw (PED_EXCEPTION_ERROR,
-                                     PED_EXCEPTION_CANCEL,
-                                     _("Expecting a partition number."));
-                return 0;
-        }
-
-        part = ped_disk_get_partition (disk, num);
-
-        if (!part) {
-                ped_exception_throw (PED_EXCEPTION_ERROR,
-                                     PED_EXCEPTION_CANCEL,
-                                     _("Partition doesn't exist."));
-            return 0;
-        }
-
-        *value = part;
-        return 1;
-        //}
-}
-
-int
-command_line_get_fs_type (const char* prompt, const PedFileSystemType*(* value))
-{
-        char*                 fs_type_name;
-        PedFileSystemType*    fs_type;
-
-        fs_type_name = command_line_get_word (prompt,
-                                              *value ? (*value)->name : NULL,
-                                                     fs_type_list, 1);
-        if (!fs_type_name) {
-                ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
-                                     _("Expecting a file system type."));
-                return 0;
-        }
-
-        fs_type = ped_file_system_type_get (fs_type_name);
-        if (!fs_type) {
-                ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
-                                     _("Unknown file system type \"%s\"."),
-                                     fs_type_name);
-                return 0;
-        }
-
-        free (fs_type_name);
-        *value = fs_type;
-        return 1;
-}
-
-int
-command_line_get_disk_type (const char* prompt, const PedDiskType*(* value))
-{
-        char*    disk_type_name;
-
-        disk_type_name = command_line_get_word (prompt,
-                                                *value ? (*value)->name : NULL,
-                                                disk_type_list, 1);
-        if (!disk_type_name) {
-                ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
-                                     _("Expecting a disk label type."));
-                return 0;
-        }
-
-        *value = ped_disk_type_get (disk_type_name);
-        free (disk_type_name);
-        PED_ASSERT (*value != NULL, return 0);
-        return 1;
-}
-
-int
-command_line_get_part_flag (const char* prompt, const PedPartition* part,
-                            PedPartitionFlag* flag)
-{
-        StrList*            opts = NULL;
-        PedPartitionFlag    walk = 0;
-        char*               flag_name;
-
-        while ( (walk = ped_partition_flag_next (walk)) ) {
-                if (ped_partition_is_flag_available (part, walk)) {
-                        const char*        walk_name;
-
-                        walk_name = ped_partition_flag_get_name (walk);
-                        opts = str_list_append (opts, walk_name);
-                        opts = str_list_append_unique (opts, _(walk_name));
-                }
-        }
-
-        flag_name = command_line_get_word (prompt, NULL, opts, 1);
-        str_list_destroy (opts);
-
-        if (flag_name) {
-                *flag = ped_partition_flag_get_by_name (flag_name);
-                ped_free (flag_name);
-                return 1;
-        } else
-                return 0;
-}
-
-static int
-_can_create_primary (const PedDisk* disk)
-{
-        int    i;
-
-        for (i = 1; i <= ped_disk_get_max_primary_partition_count (disk); i++) {
-                if (!ped_disk_get_partition (disk, i))
-                        return 1;
-        }
-
-        return 0;
-}
-
-static int
-_can_create_extended (const PedDisk* disk)
-{
-        if (!_can_create_primary (disk))
-                return 0;
-
-        if (!ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_EXTENDED))
-                return 0;
-
-        if (ped_disk_extended_partition (disk))
-                return 0;
-
-        return 1;
-}
-
-static int
-_can_create_logical (const PedDisk* disk)
-{
-        if (!ped_disk_type_check_feature (disk->type, PED_DISK_TYPE_EXTENDED))
-                return 0;
-
-        return ped_disk_extended_partition (disk) != 0;
-}
-
-int
-command_line_get_part_type (const char* prompt, const PedDisk* disk,
-                                   PedPartitionType* type)
-{
-        StrList*    opts = NULL;
-        char*       type_name;
-
-        if (_can_create_primary (disk)) {
-                opts = str_list_append_unique (opts, "primary");
-                opts = str_list_append_unique (opts, _("primary"));
-        }
-        if (_can_create_extended (disk)) {
-                opts = str_list_append_unique (opts, "extended");
-                opts = str_list_append_unique (opts, _("extended"));
-        }
-        if (_can_create_logical (disk)) {
-                opts = str_list_append_unique (opts, "logical");
-                opts = str_list_append_unique (opts, _("logical"));
-        }
-        if (!opts) {
-                ped_exception_throw (
-                        PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
-                        _("Can't create any more partitions."));
-                return 0;
-        }
-
-        type_name = command_line_get_word (prompt, NULL, opts, 1);
-        str_list_destroy (opts);
-
-        if (!type_name) {
-                ped_exception_throw (
-                        PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
-                        _("Expecting a partition type."));
-                return 0;
-        }
-
-        if (!strcmp (type_name, "primary")
-                        || !strcmp (type_name, _("primary"))) {
-                *type = 0;
-        }
-        if (!strcmp (type_name, "extended")
-                        || !strcmp (type_name, _("extended"))) {
-                *type = PED_PARTITION_EXTENDED;
-        }
-        if (!strcmp (type_name, "logical")
-                        || !strcmp (type_name, _("logical"))) {
-                *type = PED_PARTITION_LOGICAL;
-        }
-
-        free (type_name);
-        return 1;
-}
-
-PedExceptionOption
-command_line_get_ex_opt (const char* prompt, PedExceptionOption options)
-{
-        StrList*              options_strlist = NULL;
-        PedExceptionOption    opt;
-        char*                 opt_name;
-
-        for (opt = option_get_next (options, 0); opt; 
-             opt = option_get_next (options, opt)) {
-                options_strlist = str_list_append_unique (options_strlist,
-                                     _(ped_exception_get_option_string (opt)));
-                options_strlist = str_list_append_unique (options_strlist,
-                                     ped_exception_get_option_string (opt));
-        }
-
-        opt_name = command_line_get_word (prompt, NULL, options_strlist, 1);
-        if (!opt_name)
-                return PED_EXCEPTION_UNHANDLED;
-        str_list_destroy (options_strlist);
-
-        opt = PED_EXCEPTION_OPTION_FIRST;
-        while (1) {
-                if (strcmp (opt_name,
-                            ped_exception_get_option_string (opt)) == 0)
-                        break;
-                if (strcmp (opt_name,
-                            _(ped_exception_get_option_string (opt))) == 0)
-                        break;
-                opt = option_get_next (options, opt);
-        }
-        free (opt_name);
-        return opt;
-}
-
-int
-command_line_get_unit (const char* prompt, PedUnit* unit)
-{
-        StrList*       opts = NULL;
-        PedUnit        walk;
-        char*          unit_name;
-        const char*    default_unit_name;
-
-        for (walk = PED_UNIT_FIRST; walk <= PED_UNIT_LAST; walk++)
-                opts = str_list_append (opts, ped_unit_get_name (walk));
-
-        default_unit_name = ped_unit_get_name (ped_unit_get_default ());
-        unit_name = command_line_get_word (prompt, default_unit_name, opts, 1);
-        str_list_destroy (opts);
-
-        if (unit_name) {
-                *unit = ped_unit_get_by_name (unit_name);
-                free (unit_name);
-                return 1;
-        } else
-                return 0;
-}
-
-int
-command_line_is_integer ()
-{
-        char*    word;
-        int      is_integer;
-        int      scratch;
-
-        word = command_line_peek_word ();
-        if (!word)
-                return 0;
-
-        is_integer = sscanf (word, "%d", &scratch);
-        free (word);
-        return is_integer;
-}
-
-static int
-init_ex_opt_str ()
-{
-        int                   i;
-        PedExceptionOption    opt;
-
-        for (i = 0; (1 << i) <= PED_EXCEPTION_OPTION_LAST; i++) {
-                opt = (1 << i);
-                ex_opt_str [i]
-                        = str_list_create (
-                                ped_exception_get_option_string (opt),
-                                _(ped_exception_get_option_string (opt)),
-                                NULL);
-                if (!ex_opt_str [i])
-                        return 0;
-        }
-
-        ex_opt_str [i] = NULL;
-        return 1;
-}
-
-static void
-done_ex_opt_str ()
-{
-        int    i;
-
-        for (i=0; ex_opt_str [i]; i++)
-                str_list_destroy (ex_opt_str [i]);
-}
-
-static int
-init_state_str ()
-{
-        on_list = str_list_create_unique (_("on"), "on", NULL);
-        off_list = str_list_create_unique (_("off"), "off", NULL);
-        on_off_list = str_list_join (str_list_duplicate (on_list),
-                                     str_list_duplicate (off_list));
-        return 1;
-}
-
-static void
-done_state_str ()
-{
-        str_list_destroy (on_list);
-        str_list_destroy (off_list);
-        str_list_destroy (on_off_list);
-}
-
-static int
-init_fs_type_str ()
-{
-        PedFileSystemType*    walk;
-
-        fs_type_list = NULL;
-
-        for (walk = ped_file_system_type_get_next (NULL); walk;
-             walk = ped_file_system_type_get_next (walk))
-        {
-                fs_type_list = str_list_insert (fs_type_list, walk->name);
-                if (!fs_type_list)
-                        return 0;
-        }
-
-        return 1;
-}
-
-static int
-init_disk_type_str ()
-{
-        PedDiskType*    walk;
-
-        disk_type_list = NULL;
-
-        for (walk = ped_disk_type_get_next (NULL); walk;
-             walk = ped_disk_type_get_next (walk))
-        {
-                disk_type_list = str_list_insert (disk_type_list, walk->name);
-                if (!disk_type_list)
-                        return 0;
-        }
-
-        return 1;
-}
-
-int
-init_ui ()
-{
-        if (!init_ex_opt_str ()
-            || !init_state_str ()
-            || !init_fs_type_str ()
-            || !init_disk_type_str ())
-                return 0;
-        ped_exception_set_handler (exception_handler);
-
-#ifdef HAVE_LIBREADLINE
-        rl_initialize ();
-        rl_attempted_completion_function = (CPPFunction*) complete_function;
-        readline_state.in_readline = 0;
-#endif
-
-#ifdef SA_SIGINFO
-        sigset_t curr;
-        sigfillset (&curr);
-
-        sig_segv.sa_sigaction = &sa_sigsegv_handler;
-        sig_int.sa_sigaction = &sa_sigint_handler;
-        sig_fpe.sa_sigaction = &sa_sigfpe_handler;
-        sig_ill.sa_sigaction = &sa_sigill_handler;
-
-        sig_segv.sa_mask = 
-                sig_int.sa_mask = 
-                        sig_fpe.sa_mask = 
-                                sig_ill.sa_mask = curr;
-    
-        sig_segv.sa_flags = 
-                sig_int.sa_flags = 
-                        sig_fpe.sa_flags = 
-                                sig_ill.sa_flags = SA_SIGINFO;
-
-        sigaction (SIGSEGV, &sig_segv, NULL);
-        sigaction (SIGINT, &sig_int, NULL);
-        sigaction (SIGFPE, &sig_fpe, NULL);
-        sigaction (SIGILL, &sig_ill, NULL);
-#else
-        signal (SIGSEGV, s_sigsegv_handler);
-        signal (SIGINT, s_sigint_handler);
-        signal (SIGFPE, s_sigfpe_handler);
-        signal (SIGILL, s_sigill_handler);
-#endif /* SA_SIGINFO */
-
-        return 1;
-}
-
-void
-done_ui ()
-{
-        ped_exception_set_handler (NULL);
-        done_ex_opt_str ();
-        done_state_str ();
-        str_list_destroy (fs_type_list);
-        str_list_destroy (disk_type_list);
-}
-
-void
-help_msg ()
-{
-        fputs (_(usage_msg), stdout);
-
-        putchar ('\n');
-        fputs (_("OPTIONs:"), stdout);
-        putchar ('\n');
-        print_options_help ();
-
-        putchar ('\n');
-        fputs (_("COMMANDs:"), stdout);
-        putchar ('\n');
-        print_commands_help ();
-        exit (0);
-}
-
-void
-print_using_dev (PedDevice* dev)
-{
-        printf (_("Using %s\n"), dev->path);
-}
-
-int
-interactive_mode (PedDevice** dev, Command* cmd_list[])
-{
-        StrList*    list;
-        StrList*    command_names = command_get_names (cmd_list);
-
-        commands = cmd_list;    /* FIXME yucky, nasty, evil hack */
-
-        fputs (prog_name, stdout);
-
-        print_using_dev (*dev);
-
-        list = str_list_create (_(banner_msg), NULL);
-        str_list_print_wrap (list, screen_width (), 0, 0);
-        str_list_destroy (list);
-
-        while (1) {
-                char*       word;
-                Command*    cmd;
-
-                while (!command_line_get_word_count ()) {
-                        if (feof (stdin)) {
-                                putchar ('\n');
-                                return 1;
-                        }
-                        command_line_prompt_words ("(parted)", NULL,
-                                                   command_names, 1);
-                }
-
-                word = command_line_pop_word ();
-                if (word) {
-                        cmd = command_get (commands, word);
-                        free (word);
-                        if (cmd) {
-                                if (!command_run (cmd, dev))
-                                        command_line_flush ();
-                        } else
-                                print_commands_help ();
-                }
-        }
-
-        return 1;
-}
-
-
-int
-non_interactive_mode (PedDevice** dev, Command* cmd_list[],
-                      int argc, char* argv[])
-{
-        int         i;
-        Command*    cmd;
-
-        commands = cmd_list;    /* FIXME yucky, nasty, evil hack */
-
-        for (i = 0; i < argc; i++)
-                command_line_push_line (argv [i], 1);
-
-        while (command_line_get_word_count ()) {
-                char*    word;
-
-                word = command_line_pop_word ();
-                if (!word)
-                        break;
-
-                cmd = command_get (commands, word);
-                free (word);
-                if (!cmd) {
-                        help_msg ();
-                        goto error;
-                }
-                if (!(cmd->non_interactive)) {
-                        fputs(_("This command does not make sense in "
-                                "non-interactive mode.\n"), stdout);
-                        exit(1);
-                        goto error;
-                }
-                
-                if (!command_run (cmd, dev))
-                        goto error;
-        }
-        return 1;
-
-error:
-        return 0;
-}
