X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/putty/blobdiff_plain/2285d016cf0103f03e05e53e22025282c104a164..8d90b8b27bf086da6245030459ab3e5977313eb0:/windows/winutils.c diff --git a/windows/winutils.c b/windows/winutils.c index 2f21c767..f68405bc 100644 --- a/windows/winutils.c +++ b/windows/winutils.c @@ -6,7 +6,6 @@ #include #include -#include "winstuff.h" #include "putty.h" #include "misc.h" @@ -95,28 +94,20 @@ void filereq_free(filereq *state) /* Callback function to launch context help. */ static VOID CALLBACK message_box_help_callback(LPHELPINFO lpHelpInfo) { - if (help_path) { - char *context = NULL; + char *context = NULL; #define CHECK_CTX(name) \ - do { \ - if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ - context = WINHELP_CTX_ ## name; \ - } while (0) - CHECK_CTX(errors_hostkey_absent); - CHECK_CTX(errors_hostkey_changed); - CHECK_CTX(errors_cantloadkey); - CHECK_CTX(option_cleanup); - CHECK_CTX(pgp_fingerprints); + do { \ + if (lpHelpInfo->dwContextId == WINHELP_CTXID_ ## name) \ + context = WINHELP_CTX_ ## name; \ + } while (0) + CHECK_CTX(errors_hostkey_absent); + CHECK_CTX(errors_hostkey_changed); + CHECK_CTX(errors_cantloadkey); + CHECK_CTX(option_cleanup); + CHECK_CTX(pgp_fingerprints); #undef CHECK_CTX - if (context) { - /* We avoid using malloc, in case we're in a situation where - * it would be awkward to do so. */ - char cmd[WINHELP_CTX_MAXLEN+10]; - sprintf(cmd, "JI(`',`%.*s')", WINHELP_CTX_MAXLEN, context); - WinHelp(hwnd, help_path, HELP_COMMAND, (DWORD)cmd); - requested_help = TRUE; - } - } + if (context) + launch_help(hwnd, context); } int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid) @@ -137,7 +128,7 @@ int message_box(LPCTSTR text, LPCTSTR caption, DWORD style, DWORD helpctxid) mbox.lpszCaption = caption; mbox.dwContextHelpId = helpctxid; mbox.dwStyle = style; - if (helpctxid != 0 && help_path) mbox.dwStyle |= MB_HELP; + if (helpctxid != 0 && has_help()) mbox.dwStyle |= MB_HELP; return MessageBoxIndirect(&mbox); } @@ -160,12 +151,31 @@ void pgp_fingerprints(void) } /* - * Split a complete command line into argc/argv, attempting to do - * it exactly the same way Windows itself would do it (so that - * console utilities, which receive argc and argv from Windows, - * will have their command lines processed in the same way as GUI - * utilities which get a whole command line and must break it - * themselves). + * Handy wrapper around GetDlgItemText which doesn't make you invent + * an arbitrary length limit on the output string. Returned string is + * dynamically allocated; caller must free. + */ +char *GetDlgItemText_alloc(HWND hwnd, int id) +{ + char *ret = NULL; + int size = 0; + + do { + size = size * 4 / 3 + 512; + ret = sresize(ret, size, char); + GetDlgItemText(hwnd, id, ret, size); + } while (!memchr(ret, '\0', size-1)); + + return ret; +} + +/* + * Split a complete command line into argc/argv, attempting to do it + * exactly the same way the Visual Studio C library would do it (so + * that our console utilities, which receive argc and argv already + * broken apart by the C library, will have their command lines + * processed in the same way as the GUI utilities which get a whole + * command line and must call this function). * * Does not modify the input command line. * @@ -186,7 +196,17 @@ void split_into_argv(char *cmdline, int *argc, char ***argv, int outputargc; /* - * At first glance the rules appeared to be: + * These argument-breaking rules apply to Visual Studio 7, which + * is currently the compiler expected to be used for PuTTY. Visual + * Studio 10 has different rules, lacking the curious mod 3 + * behaviour of consecutive quotes described below; I presume they + * fixed a bug. As and when we migrate to a newer compiler, we'll + * have to adjust this to match; however, for the moment we + * faithfully imitate in our GUI utilities what our CLI utilities + * can't be prevented from doing. + * + * When I investigated this, at first glance the rules appeared to + * be: * * - Single quotes are not special characters. *