Simple Split 2-iter loop: msg_show_console_dialog

Simply spliting the 2-iter loop into code for computing
size of memory & for copying to allocated memory
This commit is contained in:
Harsh Kumar 2014-05-04 20:57:34 +05:30 committed by Justin M. Keyes
parent 6ec5457308
commit 1b21cf5c26

View File

@ -2846,7 +2846,6 @@ static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfl
char_u *msgp = NULL;
char_u *hotkp = NULL;
char_u *r;
int copy;
#define HAS_HOTKEY_LEN 30
char_u has_hotkey[HAS_HOTKEY_LEN];
int first_hotkey = FALSE; /* first char of button is hotkey */
@ -2854,73 +2853,28 @@ static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfl
has_hotkey[0] = FALSE;
/*
* First loop: compute the size of memory to allocate.
* Second loop: copy to the allocated memory.
*/
for (copy = 0; copy <= 1; ++copy) {
// Compute the size of memory to allocate.
r = buttons;
idx = 0;
while (*r) {
if (*r == DLG_BUTTON_SEP) {
if (copy) {
*msgp++ = ',';
*msgp++ = ' '; /* '\n' -> ', ' */
/* advance to next hotkey and set default hotkey */
if (has_mbyte)
hotkp += STRLEN(hotkp);
else
++hotkp;
hotkp[copy_char(r + 1, hotkp, TRUE)] = NUL;
if (dfltbutton)
--dfltbutton;
/* If no hotkey is specified first char is used. */
if (idx < HAS_HOTKEY_LEN - 1 && !has_hotkey[++idx])
first_hotkey = TRUE;
} else {
len += 3; /* '\n' -> ', '; 'x' -> '(x)' */
lenhotkey += HOTK_LEN; /* each button needs a hotkey */
if (idx < HAS_HOTKEY_LEN - 1)
has_hotkey[++idx] = FALSE;
}
} else if (*r == DLG_HOTKEY_CHAR || first_hotkey) {
if (*r == DLG_HOTKEY_CHAR)
++r;
first_hotkey = FALSE;
if (copy) {
if (*r == DLG_HOTKEY_CHAR) /* '&&a' -> '&a' */
*msgp++ = *r;
else {
/* '&a' -> '[a]' */
*msgp++ = (dfltbutton == 1) ? '[' : '(';
msgp += copy_char(r, msgp, FALSE);
*msgp++ = (dfltbutton == 1) ? ']' : ')';
/* redefine hotkey */
hotkp[copy_char(r, hotkp, TRUE)] = NUL;
}
} else {
++len; /* '&a' -> '[a]' */
if (idx < HAS_HOTKEY_LEN - 1)
has_hotkey[idx] = TRUE;
}
} else {
/* everything else copy literally */
if (copy)
msgp += copy_char(r, msgp, FALSE);
}
/* advance to the next character */
mb_ptr_adv(r);
}
if (copy) {
*msgp++ = ':';
*msgp++ = ' ';
*msgp = NUL;
} else {
len += (int)(STRLEN(message)
+ 2 /* for the NL's */
+ STRLEN(buttons)
@ -2955,9 +2909,55 @@ static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfl
* "hotkp" typed at the more prompt. */
confirm_msg_tail = msgp;
*msgp++ = '\n';
// Copy to the allocated memory.
r = buttons;
idx = 0;
while (*r) {
if (*r == DLG_BUTTON_SEP) {
*msgp++ = ',';
*msgp++ = ' '; /* '\n' -> ', ' */
/* advance to next hotkey and set default hotkey */
if (has_mbyte)
hotkp += STRLEN(hotkp);
else
++hotkp;
hotkp[copy_char(r + 1, hotkp, TRUE)] = NUL;
if (dfltbutton)
--dfltbutton;
/* If no hotkey is specified first char is used. */
if (idx < HAS_HOTKEY_LEN - 1 && !has_hotkey[++idx])
first_hotkey = TRUE;
} else if (*r == DLG_HOTKEY_CHAR || first_hotkey) {
if (*r == DLG_HOTKEY_CHAR)
++r;
first_hotkey = FALSE;
if (*r == DLG_HOTKEY_CHAR) /* '&&a' -> '&a' */
*msgp++ = *r;
else {
/* '&a' -> '[a]' */
*msgp++ = (dfltbutton == 1) ? '[' : '(';
msgp += copy_char(r, msgp, FALSE);
*msgp++ = (dfltbutton == 1) ? ']' : ')';
/* redefine hotkey */
hotkp[copy_char(r, hotkp, TRUE)] = NUL;
}
} else {
/* everything else copy literally */
msgp += copy_char(r, msgp, FALSE);
}
/* advance to the next character */
mb_ptr_adv(r);
}
*msgp++ = ':';
*msgp++ = ' ';
*msgp = NUL;
display_confirm_msg();
return hotk;
}