mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-27 04:40:59 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			182 lines
		
	
	
	
		
			4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			182 lines
		
	
	
	
		
			4 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(const char *s1, const 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 dupstring(), 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;
 | |
| }
 |