mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-11-18 21:14:11 +01:00
aea7715261
use multibyte versions of nicechar wherever possible.
183 lines
4.0 KiB
C
183 lines
4.0 KiB
C
/*
|
|
* string.c - string manipulation
|
|
*
|
|
* This file is part of zsh, the Z shell.
|
|
*
|
|
* Copyright (c) 2000 Peter Stephenson
|
|
* All rights reserved.
|
|
*
|
|
* Permission is hereby granted, without written agreement and without
|
|
* license or royalty fees, to use, copy, modify, and distribute this
|
|
* software and to distribute modified versions of this software for any
|
|
* purpose, provided that the above copyright notice and the following
|
|
* two paragraphs appear in all copies of this software.
|
|
*
|
|
* In no event shall Peter Stephenson or the Zsh Development Group be liable
|
|
* to any party for direct, indirect, special, incidental, or consequential
|
|
* damages arising out of the use of this software and its documentation,
|
|
* even if Peter Stephenson and the Zsh Development Group have been advised of
|
|
* the possibility of such damage.
|
|
*
|
|
* Peter Stephenson and the Zsh Development Group specifically disclaim any
|
|
* warranties, including, but not limited to, the implied warranties of
|
|
* merchantability and fitness for a particular purpose. The software
|
|
* provided hereunder is on an "as is" basis, and Peter Stephenson and the
|
|
* Zsh Development Group have no obligation to provide maintenance,
|
|
* support, updates, enhancements, or modifications.
|
|
*/
|
|
|
|
#include "zsh.mdh"
|
|
|
|
/**/
|
|
mod_export char *
|
|
dupstring(const char *s)
|
|
{
|
|
char *t;
|
|
|
|
if (!s)
|
|
return NULL;
|
|
t = (char *) zhalloc(strlen((char *)s) + 1);
|
|
strcpy(t, s);
|
|
return t;
|
|
}
|
|
|
|
/**/
|
|
mod_export char *
|
|
ztrdup(const char *s)
|
|
{
|
|
char *t;
|
|
|
|
if (!s)
|
|
return NULL;
|
|
t = (char *)zalloc(strlen((char *)s) + 1);
|
|
strcpy(t, s);
|
|
return t;
|
|
}
|
|
|
|
/**/
|
|
#ifdef MULTIBYTE_SUPPORT
|
|
/**/
|
|
mod_export wchar_t *
|
|
wcs_ztrdup(const wchar_t *s)
|
|
{
|
|
wchar_t *t;
|
|
|
|
if (!s)
|
|
return NULL;
|
|
t = (wchar_t *)zalloc(wcslen((wchar_t *)s) + 1);
|
|
wcscpy(t, s);
|
|
return t;
|
|
}
|
|
/**/
|
|
#endif /* MULTIBYTE_SUPPORT */
|
|
|
|
|
|
/* concatenate s1, s2, and s3 in dynamically allocated buffer */
|
|
|
|
/**/
|
|
mod_export char *
|
|
tricat(char const *s1, char const *s2, char const *s3)
|
|
{
|
|
/* This version always uses permanently-allocated space. */
|
|
char *ptr;
|
|
size_t l1 = strlen(s1);
|
|
size_t l2 = strlen(s2);
|
|
|
|
ptr = (char *)zalloc(l1 + l2 + strlen(s3) + 1);
|
|
strcpy(ptr, s1);
|
|
strcpy(ptr + l1, s2);
|
|
strcpy(ptr + l1 + l2, s3);
|
|
return ptr;
|
|
}
|
|
|
|
/**/
|
|
mod_export char *
|
|
zhtricat(char const *s1, char const *s2, char const *s3)
|
|
{
|
|
char *ptr;
|
|
size_t l1 = strlen(s1);
|
|
size_t l2 = strlen(s2);
|
|
|
|
ptr = (char *)zhalloc(l1 + l2 + strlen(s3) + 1);
|
|
strcpy(ptr, s1);
|
|
strcpy(ptr + l1, s2);
|
|
strcpy(ptr + l1 + l2, s3);
|
|
return ptr;
|
|
}
|
|
|
|
/* concatenate s1 and s2 in dynamically allocated buffer */
|
|
|
|
/**/
|
|
mod_export char *
|
|
dyncat(char *s1, char *s2)
|
|
{
|
|
/* This version always uses space from the current heap. */
|
|
char *ptr;
|
|
size_t l1 = strlen(s1);
|
|
|
|
ptr = (char *)zhalloc(l1 + strlen(s2) + 1);
|
|
strcpy(ptr, s1);
|
|
strcpy(ptr + l1, s2);
|
|
return ptr;
|
|
}
|
|
|
|
/**/
|
|
mod_export char *
|
|
bicat(const char *s1, const char *s2)
|
|
{
|
|
/* This version always uses permanently-allocated space. */
|
|
char *ptr;
|
|
size_t l1 = strlen(s1);
|
|
|
|
ptr = (char *)zalloc(l1 + strlen(s2) + 1);
|
|
strcpy(ptr, s1);
|
|
strcpy(ptr + l1, s2);
|
|
return ptr;
|
|
}
|
|
|
|
/* like strdup(), but with a specified length */
|
|
|
|
/**/
|
|
mod_export char *
|
|
dupstrpfx(const char *s, int len)
|
|
{
|
|
char *r = zhalloc(len + 1);
|
|
|
|
memcpy(r, s, len);
|
|
r[len] = '\0';
|
|
return r;
|
|
}
|
|
|
|
/**/
|
|
mod_export char *
|
|
ztrduppfx(const char *s, int len)
|
|
{
|
|
/* This version always uses permanently-allocated space. */
|
|
char *r = zalloc(len + 1);
|
|
|
|
memcpy(r, s, len);
|
|
r[len] = '\0';
|
|
return r;
|
|
}
|
|
|
|
/* Append a string to an allocated string, reallocating to make room. */
|
|
|
|
/**/
|
|
mod_export char *
|
|
appstr(char *base, char const *append)
|
|
{
|
|
return strcat(realloc(base, strlen(base) + strlen(append) + 1), append);
|
|
}
|
|
|
|
/* Return a pointer to the last character of a string,
|
|
unless the string is empty. */
|
|
|
|
/**/
|
|
mod_export char *
|
|
strend(char *str)
|
|
{
|
|
if (*str == '\0')
|
|
return str;
|
|
return str + strlen (str) - 1;
|
|
}
|