X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=string.c;h=d226af963af82c6c99e557402694b919b26c2192;hp=813999bbf1ced122ea8aa1347929ee03ce045c77;hb=b5e5c97342576b3a5f2b09feb68b38abea5dad22;hpb=7584638594109184f329bead008f1dcdd9030767 diff --git a/string.c b/string.c index 813999bb..d226af96 100644 --- a/string.c +++ b/string.c @@ -521,14 +521,15 @@ __printf_2_3 int para_printf(struct para_buffer *b, const char *fmt, ...) } } -/** \cond LLONG_MAX and LLONG_MIN might not be defined. */ +/** \cond llong_minmax */ +/* LLONG_MAX and LLONG_MIN might not be defined. */ #ifndef LLONG_MAX #define LLONG_MAX 9223372036854775807LL #endif #ifndef LLONG_MIN #define LLONG_MIN (-LLONG_MAX - 1LL) #endif -/** \endcond */ +/** \endcond llong_minmax */ /** * Convert a string to a 64-bit signed integer value. @@ -615,7 +616,7 @@ int get_loglevel_by_name(const char *txt) return -1; } -static int get_next_word(const char *buf, const char *delim, char **word) +static int get_next_word(const char *buf, const char *delim, char **word) { enum line_state_flags {LSF_HAVE_WORD = 1, LSF_BACKSLASH = 2, LSF_SINGLE_QUOTE = 4, LSF_DOUBLE_QUOTE = 8}; @@ -710,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(). * @@ -719,6 +746,8 @@ void free_argv(char **argv) { int i; + if (!argv) + return; for (i = 0; argv[i]; i++) free(argv[i]); free(argv); @@ -760,6 +789,7 @@ err: while (num_words > 0) free(argv[--num_words]); free(argv); + *result = NULL; return ret; }