[Groonga-commit] groonga/groonga [master] functionize libedit-related codes.

Back to archive index

null+****@clear***** null+****@clear*****
2012年 3月 12日 (月) 16:47:34 JST


Susumu Yata	2012-03-12 16:47:34 +0900 (Mon, 12 Mar 2012)

  New Revision: 1aae9073318bad05ed814f2054c376c27119be32

  Log:
    functionize libedit-related codes.

  Modified files:
    src/groonga.c

  Modified: src/groonga.c (+83 -60)
===================================================================
--- src/groonga.c    2012-03-12 16:15:02 +0900 (e4a8de5)
+++ src/groonga.c    2012-03-12 16:47:34 +0900 (520bf96)
@@ -76,18 +76,91 @@ static const char *input_path = NULL;
 #ifdef HAVE_LIBEDIT
 #include <locale.h>
 #include <histedit.h>
-static EditLine   *edit_line;
-static HistoryW   *command_history;
-static HistEventW command_history_event;
-static char       command_history_path[PATH_MAX];
+static EditLine   *line_editor = NULL;
+static HistoryW   *line_editor_history = NULL;
+static HistEventW line_editor_history_event;
+static char       line_editor_history_path[PATH_MAX] = "";
 
-inline static const wchar_t *
-disp_prompt(EditLine *e __attribute__((unused)))
+static const wchar_t *
+line_editor_prompt(EditLine *e __attribute__((unused)))
 {
   return L"> ";
 }
+static const wchar_t * const line_editor_editor = L"emacs";
 
-#endif
+void line_editor_init(int argc __attribute__((unused)), char *argv[])
+{
+  const char * const HOME_PATH = getenv("HOME");
+  const char * const HISTORY_PATH = "/.groonga-history";
+
+  setlocale(LC_ALL, "");
+
+  if (strlen(HOME_PATH) + strlen(HISTORY_PATH) < PATH_MAX) {
+    strcpy(line_editor_history_path, HOME_PATH);
+    strcat(line_editor_history_path, HISTORY_PATH);
+  } else {
+    line_editor_history_path[0] = '\0';
+  }
+
+  line_editor_history = history_winit();
+  history_w(line_editor_history, &line_editor_history_event, H_SETSIZE, 200);
+  if (line_editor_history_path[0]) {
+    history_w(line_editor_history, &line_editor_history_event,
+              H_LOAD, line_editor_history_path);
+  }
+
+  line_editor = el_init(argv[0], stdin, stdout, stderr);
+  el_wset(line_editor, EL_PROMPT, &line_editor_prompt);
+  el_wset(line_editor, EL_EDITOR, line_editor_editor);
+  el_wset(line_editor, EL_HIST, history_w, line_editor_history);
+  el_source(line_editor, NULL);
+}
+
+void line_editor_fin(void)
+{
+  if (line_editor) {
+    el_end(line_editor);
+    if (line_editor_history) {
+      if (line_editor_history_path[0]) {
+        history_w(line_editor_history, &line_editor_history_event,
+                  H_SAVE, line_editor_history_path);
+      }
+      history_wend(line_editor_history);
+    }
+  }
+}
+
+grn_rc
+line_editor_fgets(grn_ctx *ctx, grn_obj *buf)
+{
+  grn_rc rc = GRN_SUCCESS;
+  const wchar_t *line;
+  int nchar;
+  line = el_wgets(line_editor, &nchar);
+  if (nchar > 0) {
+    int i;
+    char multibyte_buf[MB_CUR_MAX];
+    size_t multibyte_len;
+    mbstate_t ps;
+    history_w(line_editor_history, &line_editor_history_event, H_ENTER, line);
+    memset(&ps, 0, sizeof(ps));
+    wcrtomb(NULL, L'\0', &ps);
+    for (i = 0; i < nchar; i++) {
+      multibyte_len = wcrtomb(multibyte_buf, line[i], &ps);
+      if (multibyte_len == (size_t)-1) {
+        GRN_LOG(ctx, GRN_LOG_WARNING,
+                "[prompt][libedit] failed to read input: %s", strerror(errno));
+        rc = GRN_INVALID_ARGUMENT;
+      } else {
+        GRN_TEXT_PUT(ctx, buf, multibyte_buf, multibyte_len);
+      }
+    }
+  } else {
+    rc = GRN_END_OF_DATA;
+  }
+  return rc;
+}
+#endif /* HAVE_LIBEDIT */
 
 static void
 show_usage(FILE *output)
@@ -187,30 +260,7 @@ prompt(grn_ctx *ctx, grn_obj *buf)
   GRN_BULK_REWIND(buf);
   if (!batchmode) {
 #ifdef HAVE_LIBEDIT
-    const wchar_t *line;
-    int nchar;
-    line = el_wgets(edit_line, &nchar);
-    if (nchar > 0) {
-      int i;
-      char multibyte_buf[MB_CUR_MAX];
-      size_t multibyte_len;
-      mbstate_t ps;
-      history_w(command_history, &command_history_event, H_ENTER, line);
-      memset(&ps, 0, sizeof(ps));
-      wcrtomb(NULL, L'\0', &ps);
-      for (i = 0; i < nchar; i++) {
-        multibyte_len = wcrtomb(multibyte_buf, line[i], &ps);
-        if (multibyte_len == (size_t)-1) {
-          GRN_LOG(ctx, GRN_LOG_WARNING,
-                  "[prompt][libedit] failed to read input: %s", strerror(errno));
-          rc = GRN_INVALID_ARGUMENT;
-        } else {
-          GRN_TEXT_PUT(ctx, buf, multibyte_buf, multibyte_len);
-        }
-      }
-    } else {
-      rc = GRN_END_OF_DATA;
-    }
+    rc = line_editor_fgets(ctx, buf);
 #else
     fprintf(stderr, "> ");
     rc = grn_text_fgets(ctx, buf, stdin);
@@ -2350,29 +2400,7 @@ main(int argc, char **argv)
   }
 #ifdef HAVE_LIBEDIT
   if (!batchmode) {
-    static const char groonga_history_path[] = "/.groonga-history";
-
-    setlocale(LC_ALL, "");
-
-    command_history_path[0] = '\0';
-    if (getenv("HOME") &&
-        (strlen(getenv("HOME")) + strlen(groonga_history_path) < PATH_MAX)) {
-      strcat(command_history_path, getenv("HOME"));
-      strcat(command_history_path, "/.groonga-history");
-    }
-
-    command_history = history_winit();
-    history_w(command_history, &command_history_event, H_SETSIZE, 200);
-    if (command_history_path[0]) {
-      history_w(command_history, &command_history_event,
-                H_LOAD, command_history_path);
-    }
-
-    edit_line = el_init(argv[0], stdin, stdout, stderr);
-    el_wset(edit_line, EL_PROMPT, &disp_prompt);
-    el_wset(edit_line, EL_EDITOR, L"emacs");
-    el_wset(edit_line, EL_HIST, history_w, command_history);
-    el_source(edit_line, NULL);
+    line_editor_init(argc, argv);
   }
 #endif
   if (grn_init()) { return -1; }
@@ -2452,12 +2480,7 @@ main(int argc, char **argv)
   }
 #ifdef HAVE_LIBEDIT
   if (!batchmode) {
-    el_end(edit_line);
-    if (command_history_path[0]) {
-      history_w(command_history, &command_history_event,
-                H_SAVE, command_history_path);
-    }
-    history_wend(command_history);
+    line_editor_fin();
   }
 #endif
   grn_fin();




Groonga-commit メーリングリストの案内
Back to archive index