char *argument_completion(char *str, char *cmd) { int i; char *result; int v; char *name; glob_t list; i = ft_strlen(str); while (str[i] != ' ' && i > 0) --i; name = ft_strjoin(str, "*"); glob(name, GLOB_NOCHECK, 0, &list); v = 0; if (list.gl_pathc == 0) { globfree(&list); return (NULL); } result = search_argument(list.gl_pathv, str, &v); if (v == 1) return (return_arguments(result, str, list, cmd)); show_argument_completion(list.gl_pathv, str); globfree(&list); return (ft_strdup("ok")); }
/** * 格式化错误信息 * @param format [description] * @param v [description] * @param ap [description] */ static void format_message(MessageFormat *format, VString *v, va_list ap){ int i; char buf[LINE_BUF_SIZE]; int arg_name_index; char arg_name[LINE_BUF_SIZE]; MessageArgument arg[MESSAGE_ARGUMENT_MAX]; MessageArgument cur_arg; create_message_argument(arg, ap); for (i = 0; format->format[i] != '\0'; i++) { if (format->format[i] != '$') { add_character(v, format->format[i]); continue; } assert(format->format[i + 1] == '('); i += 2; for (arg_name_index = 0; format->format[i] != ')'; arg_name_index++, i++) { arg_name[arg_name_index] = format->format[i]; } arg_name[arg_name_index] = '\0'; assert(format->format[i] == ')'); search_argument(arg, arg_name, &cur_arg); switch (cur_arg.type) { case INT_MESSAGE_ARGUMENT: sprintf(buf, "%d", cur_arg.u.int_val); add_string(v, buf); break; case DOUBLE_MESSAGE_ARGUMENT: sprintf(buf, "%f", cur_arg.u.double_val); add_string(v, buf); break; case STRING_MESSAGE_ARGUMENT: strcpy(buf, cur_arg.u.string_val); add_string(v, cur_arg.u.string_val); break; case POINTER_MESSAGE_ARGUMENT: sprintf(buf, "%c", cur_arg.u.character_val); add_string(v, buf); break; case MESSAGE_ARGUMENT_END: assert(0); break; default: assert(0); } } }
static void format_message(int line_number, ErrorDefinition *format, VWString *v, va_list ap) { int i; char buf[LINE_BUF_SIZE]; DVM_Char wc_buf[LINE_BUF_SIZE]; int arg_name_index; char arg_name[LINE_BUF_SIZE]; MessageArgument arg[MESSAGE_ARGUMENT_MAX]; MessageArgument cur_arg; DVM_Char *wc_format; create_message_argument(arg, ap); wc_format = dkc_mbstowcs_alloc(line_number, format->format); DBG_assert(wc_format != NULL, ("wc_format is null.\n")); for (i = 0; wc_format[i] != L'\0'; i++) { if (wc_format[i] != L'$') { dkc_vwstr_append_character(v, wc_format[i]); continue; } assert(wc_format[i+1] == L'('); i += 2; for (arg_name_index = 0; wc_format[i] != L')'; arg_name_index++, i++) { arg_name[arg_name_index] = dvm_wctochar(wc_format[i]); } arg_name[arg_name_index] = '\0'; assert(wc_format[i] == L')'); search_argument(arg, arg_name, &cur_arg); switch (cur_arg.type) { case INT_MESSAGE_ARGUMENT: sprintf(buf, "%d", cur_arg.u.int_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case DOUBLE_MESSAGE_ARGUMENT: sprintf(buf, "%f", cur_arg.u.double_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case STRING_MESSAGE_ARGUMENT: dvm_mbstowcs(cur_arg.u.string_val, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case POINTER_MESSAGE_ARGUMENT: sprintf(buf, "%p", cur_arg.u.pointer_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case CHARACTER_MESSAGE_ARGUMENT: sprintf(buf, "%c", cur_arg.u.character_val); dvm_mbstowcs(buf, wc_buf); dkc_vwstr_append_string(v, wc_buf); break; case MESSAGE_ARGUMENT_END: assert(0); break; default: assert(0); } } MEM_free(wc_format); }