From 0a920fa7332d8bc4b80ce6cf8ab107ac3a8990c3 Mon Sep 17 00:00:00 2001 From: Jakob Unterwurzacher Date: Sat, 13 Dec 2014 13:01:03 +0100 Subject: [PATCH] Use standard "[y]/n" / "y/[n]" prompt This removes the need for a translated prompt. Fixes issue #20. Also, * merge boolDefaultNo() and boolDefaultYes() into boolDefault() * do not accept arbitrary answers, but prompt again --- encfs/FileUtils.cpp | 65 ++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 24 deletions(-) diff --git a/encfs/FileUtils.cpp b/encfs/FileUtils.cpp index ccfaf0b..f658bf8 100644 --- a/encfs/FileUtils.cpp +++ b/encfs/FileUtils.cpp @@ -805,19 +805,51 @@ static int selectBlockSize(const Cipher::CipherAlgorithm &alg) { return blockSize; } -static bool boolDefaultNo(const char *prompt) { - cout << prompt << "\n"; - cout << _("The default here is No.\n" - "Any response that does not begin with 'y' will mean No: "); +/** + * Prompt the user for a "y" or "n" answer. + * An empty answer returns defaultValue. + */ +static bool boolDefault(const char *prompt, bool defaultValue) { - char answer[10]; - char *res = fgets(answer, sizeof(answer), stdin); + cout << prompt; cout << "\n"; - if (res != 0 && tolower(answer[0]) == 'y') - return true; + string yesno; + + if (defaultValue == true) + yesno = "[y]/n: "; else - return false; + yesno = "y/[n]: "; + + string response; + bool value; + + while(true) { + cout << yesno; + getline(cin, response); + + if (cin.fail() || response == "") { + value = defaultValue; + break; + } else if (response == "y") { + value = true; + break; + } else if (response == "n") { + value = false; + break; + } + } + + cout << "\n"; + return value; +} + +static bool boolDefaultNo(const char *prompt) { + return boolDefault(prompt, false); +} + +static bool boolDefaultYes(const char *prompt) { + return boolDefault(prompt, true); } /** @@ -858,21 +890,6 @@ static void selectBlockMAC(int *macBytes, int *macRandBytes) { *macRandBytes = randSize; } -static bool boolDefaultYes(const char *prompt) { - cout << prompt << "\n"; - cout << _("The default here is Yes.\n" - "Any response that does not begin with 'n' will mean Yes: "); - - char answer[10]; - char *res = fgets(answer, sizeof(answer), stdin); - cout << "\n"; - - if (res != 0 && tolower(answer[0]) == 'n') - return false; - else - return true; -} - /** * Ask the user if per-file unique IVs should be used */