summaryrefslogtreecommitdiff
path: root/src/misc2.c
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2021-07-10 21:29:18 +0200
committerBram Moolenaar <Bram@vim.org>2021-07-10 21:29:18 +0200
commita2438132a675be4dde3acbdf03ba1fdb2f09427c (patch)
tree973f677bea21a7f41bbb9d49ad0038550e6e665b /src/misc2.c
parent31e21766d6fb0a386e15ccc8c2192f6a3a210f53 (diff)
downloadvim-git-a2438132a675be4dde3acbdf03ba1fdb2f09427c.tar.gz
patch 8.2.3139: functions for string manipulation are spread outv8.2.3139
Problem: Functions for string manipulation are spread out. Solution: Move string related functions to a new source file. (Yegappan Lakshmanan, closes #8470)
Diffstat (limited to 'src/misc2.c')
-rw-r--r--src/misc2.c706
1 files changed, 0 insertions, 706 deletions
diff --git a/src/misc2.c b/src/misc2.c
index ead1e6355..a8e34df7e 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1268,42 +1268,6 @@ free_all_mem(void)
#endif
/*
- * Copy "string" into newly allocated memory.
- */
- char_u *
-vim_strsave(char_u *string)
-{
- char_u *p;
- size_t len;
-
- len = STRLEN(string) + 1;
- p = alloc(len);
- if (p != NULL)
- mch_memmove(p, string, len);
- return p;
-}
-
-/*
- * Copy up to "len" bytes of "string" into newly allocated memory and
- * terminate with a NUL.
- * The allocated memory always has size "len + 1", also when "string" is
- * shorter.
- */
- char_u *
-vim_strnsave(char_u *string, size_t len)
-{
- char_u *p;
-
- p = alloc(len + 1);
- if (p != NULL)
- {
- STRNCPY(p, string, len);
- p[len] = NUL;
- }
- return p;
-}
-
-/*
* Copy "p[len]" into allocated memory, ignoring NUL characters.
* Returns NULL when out of memory.
*/
@@ -1318,465 +1282,6 @@ vim_memsave(char_u *p, size_t len)
}
/*
- * Same as vim_strsave(), but any characters found in esc_chars are preceded
- * by a backslash.
- */
- char_u *
-vim_strsave_escaped(char_u *string, char_u *esc_chars)
-{
- return vim_strsave_escaped_ext(string, esc_chars, '\\', FALSE);
-}
-
-/*
- * Same as vim_strsave_escaped(), but when "bsl" is TRUE also escape
- * characters where rem_backslash() would remove the backslash.
- * Escape the characters with "cc".
- */
- char_u *
-vim_strsave_escaped_ext(
- char_u *string,
- char_u *esc_chars,
- int cc,
- int bsl)
-{
- char_u *p;
- char_u *p2;
- char_u *escaped_string;
- unsigned length;
- int l;
-
- /*
- * First count the number of backslashes required.
- * Then allocate the memory and insert them.
- */
- length = 1; // count the trailing NUL
- for (p = string; *p; p++)
- {
- if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- {
- length += l; // count a multibyte char
- p += l - 1;
- continue;
- }
- if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p)))
- ++length; // count a backslash
- ++length; // count an ordinary char
- }
- escaped_string = alloc(length);
- if (escaped_string != NULL)
- {
- p2 = escaped_string;
- for (p = string; *p; p++)
- {
- if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- {
- mch_memmove(p2, p, (size_t)l);
- p2 += l;
- p += l - 1; // skip multibyte char
- continue;
- }
- if (vim_strchr(esc_chars, *p) != NULL || (bsl && rem_backslash(p)))
- *p2++ = cc;
- *p2++ = *p;
- }
- *p2 = NUL;
- }
- return escaped_string;
-}
-
-/*
- * Return TRUE when 'shell' has "csh" in the tail.
- */
- int
-csh_like_shell(void)
-{
- return (strstr((char *)gettail(p_sh), "csh") != NULL);
-}
-
-/*
- * Escape "string" for use as a shell argument with system().
- * This uses single quotes, except when we know we need to use double quotes
- * (MS-DOS and MS-Windows not using PowerShell and without 'shellslash' set).
- * PowerShell also uses a novel escaping for enclosed single quotes - double
- * them up.
- * Escape a newline, depending on the 'shell' option.
- * When "do_special" is TRUE also replace "!", "%", "#" and things starting
- * with "<" like "<cfile>".
- * When "do_newline" is FALSE do not escape newline unless it is csh shell.
- * Returns the result in allocated memory, NULL if we have run out.
- */
- char_u *
-vim_strsave_shellescape(char_u *string, int do_special, int do_newline)
-{
- unsigned length;
- char_u *p;
- char_u *d;
- char_u *escaped_string;
- int l;
- int csh_like;
- char_u *shname;
- int powershell;
-# ifdef MSWIN
- int double_quotes;
-# endif
-
- // Only csh and similar shells expand '!' within single quotes. For sh and
- // the like we must not put a backslash before it, it will be taken
- // literally. If do_special is set the '!' will be escaped twice.
- // Csh also needs to have "\n" escaped twice when do_special is set.
- csh_like = csh_like_shell();
-
- // PowerShell uses it's own version for quoting single quotes
- shname = gettail(p_sh);
- powershell = strstr((char *)shname, "pwsh") != NULL;
-# ifdef MSWIN
- powershell = powershell || strstr((char *)shname, "powershell") != NULL;
- // PowerShell only accepts single quotes so override shellslash.
- double_quotes = !powershell && !p_ssl;
-# endif
-
- // First count the number of extra bytes required.
- length = (unsigned)STRLEN(string) + 3; // two quotes and a trailing NUL
- for (p = string; *p != NUL; MB_PTR_ADV(p))
- {
-# ifdef MSWIN
- if (double_quotes)
- {
- if (*p == '"')
- ++length; // " -> ""
- }
- else
-# endif
- if (*p == '\'')
- {
- if (powershell)
- length +=2; // ' => ''
- else
- length += 3; // ' => '\''
- }
- if ((*p == '\n' && (csh_like || do_newline))
- || (*p == '!' && (csh_like || do_special)))
- {
- ++length; // insert backslash
- if (csh_like && do_special)
- ++length; // insert backslash
- }
- if (do_special && find_cmdline_var(p, &l) >= 0)
- {
- ++length; // insert backslash
- p += l - 1;
- }
- }
-
- // Allocate memory for the result and fill it.
- escaped_string = alloc(length);
- if (escaped_string != NULL)
- {
- d = escaped_string;
-
- // add opening quote
-# ifdef MSWIN
- if (double_quotes)
- *d++ = '"';
- else
-# endif
- *d++ = '\'';
-
- for (p = string; *p != NUL; )
- {
-# ifdef MSWIN
- if (double_quotes)
- {
- if (*p == '"')
- {
- *d++ = '"';
- *d++ = '"';
- ++p;
- continue;
- }
- }
- else
-# endif
- if (*p == '\'')
- {
- if (powershell)
- {
- *d++ = '\'';
- *d++ = '\'';
- }
- else
- {
- *d++ = '\'';
- *d++ = '\\';
- *d++ = '\'';
- *d++ = '\'';
- }
- ++p;
- continue;
- }
- if ((*p == '\n' && (csh_like || do_newline))
- || (*p == '!' && (csh_like || do_special)))
- {
- *d++ = '\\';
- if (csh_like && do_special)
- *d++ = '\\';
- *d++ = *p++;
- continue;
- }
- if (do_special && find_cmdline_var(p, &l) >= 0)
- {
- *d++ = '\\'; // insert backslash
- while (--l >= 0) // copy the var
- *d++ = *p++;
- continue;
- }
-
- MB_COPY_CHAR(p, d);
- }
-
- // add terminating quote and finish with a NUL
-# ifdef MSWIN
- if (double_quotes)
- *d++ = '"';
- else
-# endif
- *d++ = '\'';
- *d = NUL;
- }
-
- return escaped_string;
-}
-
-/*
- * Like vim_strsave(), but make all characters uppercase.
- * This uses ASCII lower-to-upper case translation, language independent.
- */
- char_u *
-vim_strsave_up(char_u *string)
-{
- char_u *p1;
-
- p1 = vim_strsave(string);
- vim_strup(p1);
- return p1;
-}
-
-/*
- * Like vim_strnsave(), but make all characters uppercase.
- * This uses ASCII lower-to-upper case translation, language independent.
- */
- char_u *
-vim_strnsave_up(char_u *string, size_t len)
-{
- char_u *p1;
-
- p1 = vim_strnsave(string, len);
- vim_strup(p1);
- return p1;
-}
-
-/*
- * ASCII lower-to-upper case translation, language independent.
- */
- void
-vim_strup(
- char_u *p)
-{
- char_u *p2;
- int c;
-
- if (p != NULL)
- {
- p2 = p;
- while ((c = *p2) != NUL)
-#ifdef EBCDIC
- *p2++ = isalpha(c) ? toupper(c) : c;
-#else
- *p2++ = (c < 'a' || c > 'z') ? c : (c - 0x20);
-#endif
- }
-}
-
-#if defined(FEAT_EVAL) || defined(FEAT_SPELL) || defined(PROTO)
-/*
- * Make string "s" all upper-case and return it in allocated memory.
- * Handles multi-byte characters as well as possible.
- * Returns NULL when out of memory.
- */
- char_u *
-strup_save(char_u *orig)
-{
- char_u *p;
- char_u *res;
-
- res = p = vim_strsave(orig);
-
- if (res != NULL)
- while (*p != NUL)
- {
- int l;
-
- if (enc_utf8)
- {
- int c, uc;
- int newl;
- char_u *s;
-
- c = utf_ptr2char(p);
- l = utf_ptr2len(p);
- if (c == 0)
- {
- // overlong sequence, use only the first byte
- c = *p;
- l = 1;
- }
- uc = utf_toupper(c);
-
- // Reallocate string when byte count changes. This is rare,
- // thus it's OK to do another malloc()/free().
- newl = utf_char2len(uc);
- if (newl != l)
- {
- s = alloc(STRLEN(res) + 1 + newl - l);
- if (s == NULL)
- {
- vim_free(res);
- return NULL;
- }
- mch_memmove(s, res, p - res);
- STRCPY(s + (p - res) + newl, p + l);
- p = s + (p - res);
- vim_free(res);
- res = s;
- }
-
- utf_char2bytes(uc, p);
- p += newl;
- }
- else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- p += l; // skip multi-byte character
- else
- {
- *p = TOUPPER_LOC(*p); // note that toupper() can be a macro
- p++;
- }
- }
-
- return res;
-}
-
-/*
- * Make string "s" all lower-case and return it in allocated memory.
- * Handles multi-byte characters as well as possible.
- * Returns NULL when out of memory.
- */
- char_u *
-strlow_save(char_u *orig)
-{
- char_u *p;
- char_u *res;
-
- res = p = vim_strsave(orig);
-
- if (res != NULL)
- while (*p != NUL)
- {
- int l;
-
- if (enc_utf8)
- {
- int c, lc;
- int newl;
- char_u *s;
-
- c = utf_ptr2char(p);
- l = utf_ptr2len(p);
- if (c == 0)
- {
- // overlong sequence, use only the first byte
- c = *p;
- l = 1;
- }
- lc = utf_tolower(c);
-
- // Reallocate string when byte count changes. This is rare,
- // thus it's OK to do another malloc()/free().
- newl = utf_char2len(lc);
- if (newl != l)
- {
- s = alloc(STRLEN(res) + 1 + newl - l);
- if (s == NULL)
- {
- vim_free(res);
- return NULL;
- }
- mch_memmove(s, res, p - res);
- STRCPY(s + (p - res) + newl, p + l);
- p = s + (p - res);
- vim_free(res);
- res = s;
- }
-
- utf_char2bytes(lc, p);
- p += newl;
- }
- else if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
- p += l; // skip multi-byte character
- else
- {
- *p = TOLOWER_LOC(*p); // note that tolower() can be a macro
- p++;
- }
- }
-
- return res;
-}
-#endif
-
-/*
- * delete spaces at the end of a string
- */
- void
-del_trailing_spaces(char_u *ptr)
-{
- char_u *q;
-
- q = ptr + STRLEN(ptr);
- while (--q > ptr && VIM_ISWHITE(q[0]) && q[-1] != '\\' && q[-1] != Ctrl_V)
- *q = NUL;
-}
-
-/*
- * Like strncpy(), but always terminate the result with one NUL.
- * "to" must be "len + 1" long!
- */
- void
-vim_strncpy(char_u *to, char_u *from, size_t len)
-{
- STRNCPY(to, from, len);
- to[len] = NUL;
-}
-
-/*
- * Like strcat(), but make sure the result fits in "tosize" bytes and is
- * always NUL terminated. "from" and "to" may overlap.
- */
- void
-vim_strcat(char_u *to, char_u *from, size_t tosize)
-{
- size_t tolen = STRLEN(to);
- size_t fromlen = STRLEN(from);
-
- if (tolen + fromlen + 1 > tosize)
- {
- mch_memmove(to + tolen, from, tosize - tolen - 1);
- to[tosize - 1] = NUL;
- }
- else
- mch_memmove(to + tolen, from, fromlen + 1);
-}
-
-/*
* Isolate one part of a string option where parts are separated with
* "sep_chars".
* The part is copied into "buf[maxlen]".
@@ -1848,180 +1353,6 @@ vim_memset(void *ptr, int c, size_t size)
}
#endif
-#if (!defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)) || defined(PROTO)
-/*
- * Compare two strings, ignoring case, using current locale.
- * Doesn't work for multi-byte characters.
- * return 0 for match, < 0 for smaller, > 0 for bigger
- */
- int
-vim_stricmp(char *s1, char *s2)
-{
- int i;
-
- for (;;)
- {
- i = (int)TOLOWER_LOC(*s1) - (int)TOLOWER_LOC(*s2);
- if (i != 0)
- return i; // this character different
- if (*s1 == NUL)
- break; // strings match until NUL
- ++s1;
- ++s2;
- }
- return 0; // strings match
-}
-#endif
-
-#if (!defined(HAVE_STRNCASECMP) && !defined(HAVE_STRNICMP)) || defined(PROTO)
-/*
- * Compare two strings, for length "len", ignoring case, using current locale.
- * Doesn't work for multi-byte characters.
- * return 0 for match, < 0 for smaller, > 0 for bigger
- */
- int
-vim_strnicmp(char *s1, char *s2, size_t len)
-{
- int i;
-
- while (len > 0)
- {
- i = (int)TOLOWER_LOC(*s1) - (int)TOLOWER_LOC(*s2);
- if (i != 0)
- return i; // this character different
- if (*s1 == NUL)
- break; // strings match until NUL
- ++s1;
- ++s2;
- --len;
- }
- return 0; // strings match
-}
-#endif
-
-/*
- * Search for first occurrence of "c" in "string".
- * Version of strchr() that handles unsigned char strings with characters from
- * 128 to 255 correctly. It also doesn't return a pointer to the NUL at the
- * end of the string.
- */
- char_u *
-vim_strchr(char_u *string, int c)
-{
- char_u *p;
- int b;
-
- p = string;
- if (enc_utf8 && c >= 0x80)
- {
- while (*p != NUL)
- {
- int l = utfc_ptr2len(p);
-
- // Avoid matching an illegal byte here.
- if (utf_ptr2char(p) == c && l > 1)
- return p;
- p += l;
- }
- return NULL;
- }
- if (enc_dbcs != 0 && c > 255)
- {
- int n2 = c & 0xff;
-
- c = ((unsigned)c >> 8) & 0xff;
- while ((b = *p) != NUL)
- {
- if (b == c && p[1] == n2)
- return p;
- p += (*mb_ptr2len)(p);
- }
- return NULL;
- }
- if (has_mbyte)
- {
- while ((b = *p) != NUL)
- {
- if (b == c)
- return p;
- p += (*mb_ptr2len)(p);
- }
- return NULL;
- }
- while ((b = *p) != NUL)
- {
- if (b == c)
- return p;
- ++p;
- }
- return NULL;
-}
-
-/*
- * Version of strchr() that only works for bytes and handles unsigned char
- * strings with characters above 128 correctly. It also doesn't return a
- * pointer to the NUL at the end of the string.
- */
- char_u *
-vim_strbyte(char_u *string, int c)
-{
- char_u *p = string;
-
- while (*p != NUL)
- {
- if (*p == c)
- return p;
- ++p;
- }
- return NULL;
-}
-
-/*
- * Search for last occurrence of "c" in "string".
- * Version of strrchr() that handles unsigned char strings with characters from
- * 128 to 255 correctly. It also doesn't return a pointer to the NUL at the
- * end of the string.
- * Return NULL if not found.
- * Does not handle multi-byte char for "c"!
- */
- char_u *
-vim_strrchr(char_u *string, int c)
-{
- char_u *retval = NULL;
- char_u *p = string;
-
- while (*p)
- {
- if (*p == c)
- retval = p;
- MB_PTR_ADV(p);
- }
- return retval;
-}
-
-/*
- * Vim's version of strpbrk(), in case it's missing.
- * Don't generate a prototype for this, causes problems when it's not used.
- */
-#ifndef PROTO
-# ifndef HAVE_STRPBRK
-# ifdef vim_strpbrk
-# undef vim_strpbrk
-# endif
- char_u *
-vim_strpbrk(char_u *s, char_u *charset)
-{
- while (*s)
- {
- if (vim_strchr(charset, *s) != NULL)
- return s;
- MB_PTR_ADV(s);
- }
- return NULL;
-}
-# endif
-#endif
-
/*
* Vim has its own isspace() function, because on some machines isspace()
* can't handle characters above 128.
@@ -3975,25 +3306,6 @@ qsort(
#endif
/*
- * Sort an array of strings.
- */
-static int sort_compare(const void *s1, const void *s2);
-
- static int
-sort_compare(const void *s1, const void *s2)
-{
- return STRCMP(*(char **)s1, *(char **)s2);
-}
-
- void
-sort_strings(
- char_u **files,
- int count)
-{
- qsort((void *)files, (size_t)count, sizeof(char_u *), sort_compare);
-}
-
-/*
* The putenv() implementation below comes from the "screen" program.
* Included with permission from Juergen Weigert.
* See pty.c for the copyright notice.
@@ -4304,24 +3616,6 @@ put_bytes(FILE *fd, long_u nr, int len)
#endif
-#if defined(FEAT_QUICKFIX) || defined(FEAT_SPELL) || defined(PROTO)
-/*
- * Return TRUE if string "s" contains a non-ASCII character (128 or higher).
- * When "s" is NULL FALSE is returned.
- */
- int
-has_non_ascii(char_u *s)
-{
- char_u *p;
-
- if (s != NULL)
- for (p = s; *p != NUL; ++p)
- if (*p >= 128)
- return TRUE;
- return FALSE;
-}
-#endif
-
#ifndef PROTO // proto is defined in vim.h
# ifdef ELAPSED_TIMEVAL
/*