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 cefb45d..d226af9 100644 (file)
--- a/string.c
+++ b/string.c
@@ -711,6 +711,32 @@ out:
        return ret;
 }
 
        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().
  *
 /**
  * Free an array of words created by create_argv().
  *
index 06f4d3e..23b7900 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);
 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);