📄 string.h
字号:
/* $Id: string.h 1210 2007-04-22 12:48:30Z bennylp $ */
/*
* Copyright (C)2003-2007 Benny Prijono <benny@prijono.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __PJ_STRING_H__
#define __PJ_STRING_H__
/**
* @file string.h
* @brief PJLIB String Operations.
*/
#include <pj/types.h>
#include <pj/compat/string.h>
PJ_BEGIN_DECL
/**
* @defgroup PJ_PSTR String Operations
* @ingroup PJ_DS
* @{
* This module provides string manipulation API.
*
* \section pj_pstr_not_null_sec PJLIB String is NOT Null Terminated!
*
* That is the first information that developers need to know. Instead
* of using normal C string, strings in PJLIB are represented as
* pj_str_t structure below:
*
* <pre>
* typedef struct pj_str_t
* {
* char *ptr;
* pj_size_t slen;
* } pj_str_t;
* </pre>
*
* There are some advantages of using this approach:
* - the string can point to arbitrary location in memory even
* if the string in that location is not null terminated. This is
* most usefull for text parsing, where the parsed text can just
* point to the original text in the input. If we use C string,
* then we will have to copy the text portion from the input
* to a string variable.
* - because the length of the string is known, string copy operation
* can be made more efficient.
*
* Most of APIs in PJLIB that expect or return string will represent
* the string as pj_str_t instead of normal C string.
*
* \section pj_pstr_examples_sec Examples
*
* For some examples, please see:
* - @ref page_pjlib_string_test
*/
/**
* Create string initializer from a normal C string.
*
* @param str Null terminated string to be stored.
*
* @return pj_str_t.
*/
PJ_IDECL(pj_str_t) pj_str(char *str);
/**
* Create constant string from normal C string.
*
* @param str The string to be initialized.
* @param s Null terminated string.
*
* @return pj_str_t.
*/
PJ_INLINE(const pj_str_t*) pj_cstr(pj_str_t *str, const char *s)
{
str->ptr = (char*)s;
str->slen = s ? (pj_ssize_t)strlen(s) : 0;
return str;
}
/**
* Set the pointer and length to the specified value.
*
* @param str the string.
* @param ptr pointer to set.
* @param length length to set.
*
* @return the string.
*/
PJ_INLINE(pj_str_t*) pj_strset( pj_str_t *str, char *ptr, pj_size_t length)
{
str->ptr = ptr;
str->slen = (pj_ssize_t)length;
return str;
}
/**
* Set the pointer and length of the string to the source string, which
* must be NULL terminated.
*
* @param str the string.
* @param src pointer to set.
*
* @return the string.
*/
PJ_INLINE(pj_str_t*) pj_strset2( pj_str_t *str, char *src)
{
str->ptr = src;
str->slen = src ? (pj_ssize_t)strlen(src) : 0;
return str;
}
/**
* Set the pointer and the length of the string.
*
* @param str The target string.
* @param begin The start of the string.
* @param end The end of the string.
*
* @return the target string.
*/
PJ_INLINE(pj_str_t*) pj_strset3( pj_str_t *str, char *begin, char *end )
{
str->ptr = begin;
str->slen = (pj_ssize_t)(end-begin);
return str;
}
/**
* Assign string.
*
* @param dst The target string.
* @param src The source string.
*
* @return the target string.
*/
PJ_IDECL(pj_str_t*) pj_strassign( pj_str_t *dst, pj_str_t *src );
/**
* Copy string contents.
*
* @param dst The target string.
* @param src The source string.
*
* @return the target string.
*/
PJ_IDECL(pj_str_t*) pj_strcpy(pj_str_t *dst, const pj_str_t *src);
/**
* Copy string contents.
*
* @param dst The target string.
* @param src The source string.
*
* @return the target string.
*/
PJ_IDECL(pj_str_t*) pj_strcpy2(pj_str_t *dst, const char *src);
/**
* Copy source string to destination up to the specified max length.
*
* @param dst The target string.
* @param src The source string.
* @param max Maximum characters to copy.
*
* @return the target string.
*/
PJ_IDECL(pj_str_t*) pj_strncpy(pj_str_t *dst, const pj_str_t *src,
pj_ssize_t max);
/**
* Copy source string to destination up to the specified max length,
* and NULL terminate the destination. If source string length is
* greater than or equal to max, then max-1 will be copied.
*
* @param dst The target string.
* @param src The source string.
* @param max Maximum characters to copy.
*
* @return the target string.
*/
PJ_IDECL(pj_str_t*) pj_strncpy_with_null(pj_str_t *dst, const pj_str_t *src,
pj_ssize_t max);
/**
* Duplicate string.
*
* @param pool The pool.
* @param dst The string result.
* @param src The string to duplicate.
*
* @return the string result.
*/
PJ_IDECL(pj_str_t*) pj_strdup(pj_pool_t *pool,
pj_str_t *dst,
const pj_str_t *src);
/**
* Duplicate string and NULL terminate the destination string.
*
* @param pool The pool.
* @param dst The string result.
* @param src The string to duplicate.
*
* @return The string result.
*/
PJ_IDECL(pj_str_t*) pj_strdup_with_null(pj_pool_t *pool,
pj_str_t *dst,
const pj_str_t *src);
/**
* Duplicate string.
*
* @param pool The pool.
* @param dst The string result.
* @param src The string to duplicate.
*
* @return the string result.
*/
PJ_IDECL(pj_str_t*) pj_strdup2(pj_pool_t *pool,
pj_str_t *dst,
const char *src);
/**
* Duplicate string and NULL terminate the destination string.
*
* @param pool The pool.
* @param dst The string result.
* @param src The string to duplicate.
*
* @return The string result.
*/
PJ_IDECL(pj_str_t*) pj_strdup2_with_null(pj_pool_t *pool,
pj_str_t *dst,
const char *src);
/**
* Duplicate string.
*
* @param pool The pool.
* @param src The string to duplicate.
*
* @return the string result.
*/
PJ_IDECL(pj_str_t) pj_strdup3(pj_pool_t *pool, const char *src);
/**
* Return the length of the string.
*
* @param str The string.
*
* @return the length of the string.
*/
PJ_INLINE(pj_size_t) pj_strlen( const pj_str_t *str )
{
return str->slen;
}
/**
* Return the pointer to the string data.
*
* @param str The string.
*
* @return the pointer to the string buffer.
*/
PJ_INLINE(const char*) pj_strbuf( const pj_str_t *str )
{
return str->ptr;
}
/**
* Compare strings.
*
* @param str1 The string to compare.
* @param str2 The string to compare.
*
* @return
* - < 0 if str1 is less than str2
* - 0 if str1 is identical to str2
* - > 0 if str1 is greater than str2
*/
PJ_IDECL(int) pj_strcmp( const pj_str_t *str1, const pj_str_t *str2);
/**
* Compare strings.
*
* @param str1 The string to compare.
* @param str2 The string to compare.
*
* @return
* - < 0 if str1 is less than str2
* - 0 if str1 is identical to str2
* - > 0 if str1 is greater than str2
*/
PJ_IDECL(int) pj_strcmp2( const pj_str_t *str1, const char *str2 );
/**
* Compare strings.
*
* @param str1 The string to compare.
* @param str2 The string to compare.
* @param len The maximum number of characters to compare.
*
* @return
* - < 0 if str1 is less than str2
* - 0 if str1 is identical to str2
* - > 0 if str1 is greater than str2
*/
PJ_IDECL(int) pj_strncmp( const pj_str_t *str1, const pj_str_t *str2,
pj_size_t len);
/**
* Compare strings.
*
* @param str1 The string to compare.
* @param str2 The string to compare.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -