mirror of
https://github.com/pgbackrest/pgbackrest.git
synced 2025-01-30 05:39:12 +02:00
Add String object to simplify string handling.
This commit is contained in:
parent
7cf955425e
commit
1b3e8e0a5b
@ -22,6 +22,10 @@
|
|||||||
<release-item>
|
<release-item>
|
||||||
<p>Add <code>memGrowRaw()</code> to memory context module.</p>
|
<p>Add <code>memGrowRaw()</code> to memory context module.</p>
|
||||||
</release-item>
|
</release-item>
|
||||||
|
|
||||||
|
<release-item>
|
||||||
|
<p>Add <code>String</code> object to simplify string handling.</p>
|
||||||
|
</release-item>
|
||||||
</release-development-list>
|
</release-development-list>
|
||||||
</release-core-list>
|
</release-core-list>
|
||||||
|
|
||||||
|
@ -29,4 +29,9 @@ typedef int16_t int16;
|
|||||||
typedef int32_t int32;
|
typedef int32_t int32;
|
||||||
typedef int64_t int64;
|
typedef int64_t int64;
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Include all header files in type directory for convenience
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
#include "common/type/string.h"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
132
src/common/type/string.c
Normal file
132
src/common/type/string.c
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
/***********************************************************************************************************************************
|
||||||
|
String Handler
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "common/memContext.h"
|
||||||
|
#include "common/type/string.h"
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Contains information about the string
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
struct String
|
||||||
|
{
|
||||||
|
size_t size;
|
||||||
|
char *buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Create a new string from another string
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
String *
|
||||||
|
strNew(const char *string)
|
||||||
|
{
|
||||||
|
// Create object
|
||||||
|
String *this = memNew(sizeof(String));
|
||||||
|
this->size = strlen(string);
|
||||||
|
|
||||||
|
// Allocate and assign string
|
||||||
|
this->buffer = memNewRaw(this->size + 1);
|
||||||
|
strcpy(this->buffer, string);
|
||||||
|
|
||||||
|
// Return buffer
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Create a new string from a format string with parameters (i.e. sprintf)
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
String *
|
||||||
|
strNewFmt(const char *format, ...)
|
||||||
|
{
|
||||||
|
// Create object
|
||||||
|
String *this = memNew(sizeof(String));
|
||||||
|
|
||||||
|
// Determine how long the allocated string needs to be
|
||||||
|
va_list argumentList;
|
||||||
|
va_start(argumentList, format);
|
||||||
|
this->size = vsnprintf(NULL, 0, format, argumentList);
|
||||||
|
va_end(argumentList);
|
||||||
|
|
||||||
|
// Allocate and assign string
|
||||||
|
this->buffer = memNewRaw(this->size + 1);
|
||||||
|
va_start(argumentList, format);
|
||||||
|
vsnprintf(this->buffer, this->size + 1, format, argumentList);
|
||||||
|
va_end(argumentList);
|
||||||
|
|
||||||
|
// Return buffer
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Append a string
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
String *
|
||||||
|
strCat(String *this, const char *cat)
|
||||||
|
{
|
||||||
|
// Determine length of string to append
|
||||||
|
int sizeGrow = strlen(cat);
|
||||||
|
|
||||||
|
// Allocate and append string
|
||||||
|
this->buffer = memGrowRaw(this->buffer, this->size + sizeGrow + 1);
|
||||||
|
strcpy(this->buffer + this->size, cat);
|
||||||
|
|
||||||
|
this->size += sizeGrow;
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Append a formatted string
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
String *
|
||||||
|
strCatFmt(String *this, const char *format, ...)
|
||||||
|
{
|
||||||
|
// Determine how long the allocated string needs to be
|
||||||
|
va_list argumentList;
|
||||||
|
va_start(argumentList, format);
|
||||||
|
int sizeGrow = vsnprintf(NULL, 0, format, argumentList);
|
||||||
|
va_end(argumentList);
|
||||||
|
|
||||||
|
// Allocate and append string
|
||||||
|
this->buffer = memGrowRaw(this->buffer, this->size + sizeGrow + 1);
|
||||||
|
|
||||||
|
va_start(argumentList, format);
|
||||||
|
vsnprintf(this->buffer + this->size, sizeGrow + 1, format, argumentList);
|
||||||
|
va_end(argumentList);
|
||||||
|
|
||||||
|
this->size += sizeGrow;
|
||||||
|
|
||||||
|
// Return buffer
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Return string ptr
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
const char *
|
||||||
|
strPtr(const String *this)
|
||||||
|
{
|
||||||
|
return (const char *)this->buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Return string size
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
size_t
|
||||||
|
strSize(const String *this)
|
||||||
|
{
|
||||||
|
return this->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Free the string
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
void
|
||||||
|
strFree(String *this)
|
||||||
|
{
|
||||||
|
memFree(this->buffer);
|
||||||
|
memFree(this);
|
||||||
|
}
|
23
src/common/type/string.h
Normal file
23
src/common/type/string.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/***********************************************************************************************************************************
|
||||||
|
String Handler
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
#ifndef COMMON_TYPE_STRING_H
|
||||||
|
#define COMMON_TYPE_STRING_H
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
String object
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
typedef struct String String;
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Functions
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
String *strNew(const char *string);
|
||||||
|
String *strNewFmt(const char *format, ...);
|
||||||
|
size_t strSize(const String *this);
|
||||||
|
String *strCat(String *this, const char *cat);
|
||||||
|
String *strCatFmt(String *this, const char *format, ...);
|
||||||
|
const char *strPtr(const String *this);
|
||||||
|
void strFree(String *this);
|
||||||
|
|
||||||
|
#endif
|
@ -125,6 +125,16 @@ my $oTestDef =
|
|||||||
'common/memContext' => TESTDEF_COVERAGE_FULL,
|
'common/memContext' => TESTDEF_COVERAGE_FULL,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
&TESTDEF_NAME => 'type-string',
|
||||||
|
&TESTDEF_TOTAL => 2,
|
||||||
|
&TESTDEF_C => true,
|
||||||
|
|
||||||
|
&TESTDEF_COVERAGE =>
|
||||||
|
{
|
||||||
|
'common/type/string' => TESTDEF_COVERAGE_FULL,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
&TESTDEF_NAME => 'encode',
|
&TESTDEF_NAME => 'encode',
|
||||||
&TESTDEF_TOTAL => 1,
|
&TESTDEF_TOTAL => 1,
|
||||||
|
@ -149,6 +149,13 @@ Macros to ease the use of common data types
|
|||||||
#define TEST_RESULT_BOOL(statement, resultExpected, ...) \
|
#define TEST_RESULT_BOOL(statement, resultExpected, ...) \
|
||||||
TEST_RESULT_BOOL_PARAM(statement, resultExpected, ==, __VA_ARGS__);
|
TEST_RESULT_BOOL_PARAM(statement, resultExpected, ==, __VA_ARGS__);
|
||||||
|
|
||||||
|
#define TEST_RESULT_CHAR_PARAM(statement, resultExpected, typeOp, ...) \
|
||||||
|
TEST_RESULT(statement, resultExpected, char, "%c", TEST_TYPE_FORMAT, typeOp, TEST_TYPE_COMPARE, __VA_ARGS__);
|
||||||
|
#define TEST_RESULT_CHAR(statement, resultExpected, ...) \
|
||||||
|
TEST_RESULT_CHAR_PARAM(statement, resultExpected, ==, __VA_ARGS__);
|
||||||
|
#define TEST_RESULT_CHAR_NE(statement, resultExpected, ...) \
|
||||||
|
TEST_RESULT_CHAR_PARAM(statement, resultExpected, !=, __VA_ARGS__);
|
||||||
|
|
||||||
#define TEST_RESULT_DOUBLE_PARAM(statement, resultExpected, typeOp, ...) \
|
#define TEST_RESULT_DOUBLE_PARAM(statement, resultExpected, typeOp, ...) \
|
||||||
TEST_RESULT(statement, resultExpected, double, "%f", TEST_TYPE_FORMAT, typeOp, TEST_TYPE_COMPARE, __VA_ARGS__);
|
TEST_RESULT(statement, resultExpected, double, "%f", TEST_TYPE_FORMAT, typeOp, TEST_TYPE_COMPARE, __VA_ARGS__);
|
||||||
#define TEST_RESULT_DOUBLE(statement, resultExpected, ...) \
|
#define TEST_RESULT_DOUBLE(statement, resultExpected, ...) \
|
||||||
|
42
test/src/module/common/typeStringTest.c
Normal file
42
test/src/module/common/typeStringTest.c
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/***********************************************************************************************************************************
|
||||||
|
Test Strings
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
|
||||||
|
/***********************************************************************************************************************************
|
||||||
|
Test Run
|
||||||
|
***********************************************************************************************************************************/
|
||||||
|
void testRun()
|
||||||
|
{
|
||||||
|
// *****************************************************************************************************************************
|
||||||
|
if (testBegin("strNew() and strFree()"))
|
||||||
|
{
|
||||||
|
String *string = strNew("static string");
|
||||||
|
TEST_RESULT_STR(strPtr(string), "static string", "new with static string");
|
||||||
|
TEST_RESULT_INT(strSize(string), 13, "check size");
|
||||||
|
TEST_RESULT_INT(strlen(strPtr(string)), 13, "check size with strlen()");
|
||||||
|
TEST_RESULT_CHAR(strPtr(string)[2], 'a', "check character");
|
||||||
|
strFree(string);
|
||||||
|
|
||||||
|
string = strNewFmt("formatted %s %04d", "string", 1);
|
||||||
|
TEST_RESULT_STR(strPtr(string), "formatted string 0001", "new with formatted string");
|
||||||
|
strFree(string);
|
||||||
|
}
|
||||||
|
|
||||||
|
// *****************************************************************************************************************************
|
||||||
|
if (testBegin("strCat and strCatFmt()"))
|
||||||
|
{
|
||||||
|
String *string = strNew("XXXX");
|
||||||
|
String *string2 = strNew("ZZZZ");
|
||||||
|
|
||||||
|
strCat(string, "YYYY");
|
||||||
|
TEST_RESULT_STR(strPtr(string), "XXXXYYYY", "cat string");
|
||||||
|
|
||||||
|
strCatFmt(string, "%05d", 777);
|
||||||
|
TEST_RESULT_STR(strPtr(string), "XXXXYYYY00777", "cat formatted string");
|
||||||
|
|
||||||
|
TEST_RESULT_STR(strPtr(string2), "ZZZZ", "check unaltered string");
|
||||||
|
|
||||||
|
strFree(string);
|
||||||
|
strFree(string2);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user