inline STDMETHODIMP get_command_string(void *p, UINT id, UINT flags, UINT *reserved, LPSTR name, UINT size) { const char *text; if (!(flags & GCS_HELPTEXT)) return E_INVALIDARG; text = get_menu_item_text(id); if (!text) return E_INVALIDARG; if (flags & GCS_UNICODE) { size_t len = strlen(text) + 1; LPWSTR tw = xmalloc(len * sizeof(wchar_t)); /* need to convert terminating NULL as well */ mbstowcs(tw, text, len); lstrcpynW((LPWSTR)name, tw, size); free(tw); } else lstrcpynA(name, text, size); return S_OK; }
static int menu_branch(struct git_data *this_, UINT id) { int status; char *wd = wd_from_path(this_->name, NULL); struct strbuf err; const char *menu_item_text; const char **argv; free_func_t argv_free; void *argv_data; const char *generic_argv[] = { "git", "checkout", NULL, NULL }; menu_item_text = get_menu_item_text(id); generic_argv[2] = menu_item_text; argv = menu_get_platform_argv(MENU_BRANCH, NULL, &argv_free, &argv_data); if (!argv) argv = generic_argv; strbuf_init(&err, 0); status = exec_program_v(wd, NULL, &err, HIDDENMODE | WAITMODE, argv); /* if nothing, terribly wrong happened, show the confirmation */ if (-1 != status) /* strangely enough even success message is on stderr */ debug_git_mbox(err.buf); if (argv_free) argv_free(argv_data); free(wd); return 1; }