string: Introduce compute_word_num().
authorAndre Noll <maan@systemlinux.org>
Sun, 28 Aug 2011 21:36:17 +0000 (23:36 +0200)
committerAndre Noll <maan@systemlinux.org>
Sun, 20 Nov 2011 14:08:41 +0000 (15:08 +0100)
The completion code needs to determine the word the curser is
currently on.  Libreadline only provides the start and end position
of the current word in the line buffer, but not the word number.

This patch adds compute_word_num() to string.c which uses the same
algorithm as create_argv() to determine the word boundaries.

string.c
string.h

index cefb45d674075cf1fcb2e42b42e5b0a929a52c16..d226af963af82c6c99e557402694b919b26c2192 100644 (file)
--- a/string.c
+++ b/string.c
@@ -711,6 +711,32 @@ out:
        return ret;
 }
 
+/**
+ * Get the number of the word the cursor is on.
+ *
+ * \param buf The zero-terminated line buffer.
+ * \param delim Characters that separate words.
+ * \param point The cursor position.
+ *
+ * \return Zero-based word number.
+ */
+int compute_word_num(const char *buf, const char *delim, int point)
+{
+       int ret, num_words;
+       const char *p;
+       char *word;
+
+       for (p = buf, num_words = 0; ; p += ret, num_words++) {
+               ret = get_next_word(p, delim, &word);
+               if (ret <= 0)
+                       break;
+               free(word);
+               if (p + ret >= buf + point)
+                       break;
+       }
+       return num_words;
+}
+
 /**
  * Free an array of words created by create_argv().
  *
index 06f4d3e6ca88646fbe531b42af49089be23680ba..23b790021277475ea281e12a9b2a39d05e7ffb62 100644 (file)
--- a/string.h
+++ b/string.h
@@ -83,3 +83,4 @@ int create_argv(const char *buf, const char *delim, char ***result);
 void free_argv(char **argv);
 int para_regcomp(regex_t *preg, const char *regex, int cflags);
 void freep(void *arg);
+int compute_word_num(const char *buf, const char *delim, int offset);