void g_string_append_c(GString* baseString, char appendedCharacter) { size_t newSizeNeeded = baseString->currentStringLength + 1; ensureStringBufferCanHold(baseString, newSizeNeeded); baseString->str[baseString->currentStringLength] = appendedCharacter; baseString->currentStringLength++; baseString->str[baseString->currentStringLength] = '\0'; }
void g_string_append(GString* baseString, char* appendedString) { if ((appendedString != NULL) && (strlen(appendedString) > 0)) { size_t appendedStringLength = strlen(appendedString); size_t newStringLength = baseString->currentStringLength + appendedStringLength; ensureStringBufferCanHold(baseString, newStringLength); strncat(baseString->str + baseString->currentStringLength, appendedString, appendedStringLength); baseString->currentStringLength = newStringLength; } }
void Test_ensureStringBufferCanHold(CuTest* tc) { char * test = "foo"; DString * result = d_string_new(test); ensureStringBufferCanHold(result, 1024); CuAssertIntEquals(tc, 2048, result->currentStringBufferSize); ensureStringBufferCanHold(result, 1024); CuAssertIntEquals(tc, 2048, result->currentStringBufferSize); /* This becomes 0 after we add 1 for the '\0' */ ensureStringBufferCanHold(result, -1); CuAssertIntEquals(tc, 2048, result->currentStringBufferSize); ensureStringBufferCanHold(result, 1024 * 1024 - 1); CuAssertIntEquals(tc, 1024 * 1024, result->currentStringBufferSize); ensureStringBufferCanHold(result, 1024 * 1024 - 1); CuAssertIntEquals(tc, 1024 * 1024, result->currentStringBufferSize); ensureStringBufferCanHold(NULL, 1024); d_string_free(result, true); }
void g_string_append(GString* baseString, char* appendedString) { if ((appendedString != NULL) && (strlen(appendedString) > 0)) { size_t appendedStringLength = strlen(appendedString); size_t newStringLength = baseString->currentStringLength + appendedStringLength; ensureStringBufferCanHold(baseString, newStringLength); /* We already know where the current string ends, so pass that as the starting address for strncat */ strncat(baseString->str + baseString->currentStringLength, appendedString, appendedStringLength); baseString->currentStringLength = newStringLength; } }
void g_string_prepend(GString* baseString, char* prependedString) { if ((prependedString != NULL) && (strlen(prependedString) > 0)) { size_t prependedStringLength = strlen(prependedString); size_t newStringLength = baseString->currentStringLength + prependedStringLength; ensureStringBufferCanHold(baseString, newStringLength); memmove(baseString->str + prependedStringLength, baseString->str, baseString->currentStringLength); strncpy(baseString->str, prependedString, prependedStringLength); baseString->currentStringLength = newStringLength; baseString->str[baseString->currentStringLength] = '\0'; } }
/// Append null-terminated string to end of dynamic string void d_string_append(DString * baseString, const char * appendedString) { if (baseString && appendedString) { size_t appendedStringLength = strlen(appendedString); if (appendedStringLength > 0) { size_t newStringLength = baseString->currentStringLength + appendedStringLength; ensureStringBufferCanHold(baseString, newStringLength); /* We already know where the current string ends, so pass that as the starting address for strncat */ strncat(baseString->str + baseString->currentStringLength, appendedString, appendedStringLength); baseString->currentStringLength = newStringLength; } } }
/// Prepend null-terminated string to end of dynamic string void d_string_prepend(DString * baseString, const char * prependedString) { if (baseString && prependedString) { size_t prependedStringLength = strlen(prependedString); if (prependedStringLength > 0) { size_t newStringLength = baseString->currentStringLength + prependedStringLength; ensureStringBufferCanHold(baseString, newStringLength); memmove(baseString->str + prependedStringLength, baseString->str, baseString->currentStringLength); strncpy(baseString->str, prependedString, prependedStringLength); baseString->currentStringLength = newStringLength; baseString->str[baseString->currentStringLength] = '\0'; } } }
/// Insert single character inside dynamic string void d_string_insert_c(DString * baseString, size_t pos, char insertedCharacter) { if (baseString && insertedCharacter) { if (pos > baseString->currentStringLength) { pos = baseString->currentStringLength; } size_t newSizeNeeded = baseString->currentStringLength + 1; ensureStringBufferCanHold(baseString, newSizeNeeded); /* Shift following string to 'right' */ memmove(baseString->str + pos + 1, baseString->str + pos, baseString->currentStringLength - pos); baseString->str[pos] = insertedCharacter; baseString->currentStringLength++; baseString->str[baseString->currentStringLength] = '\0'; } }
/// Append array of characters to end of dynamic string void d_string_append_c_array(DString * baseString, const char * appendedChars, size_t bytes) { if (baseString && appendedChars) { if (bytes == -1) { // This is the same as regular append d_string_append(baseString, appendedChars); } else { if (appendedChars) { size_t newSizeNeeded = baseString->currentStringLength + bytes; ensureStringBufferCanHold(baseString, newSizeNeeded); memcpy((void*)baseString->str + baseString->currentStringLength, appendedChars, bytes); baseString->currentStringLength = newSizeNeeded; baseString->str[newSizeNeeded] = '\0'; } } } }
/// Insert null-terminated string inside dynamic string void d_string_insert(DString * baseString, size_t pos, const char * insertedString) { if (baseString && insertedString) { size_t insertedStringLength = strlen(insertedString); if (insertedStringLength > 0) { if (pos > baseString->currentStringLength) { pos = baseString->currentStringLength; } size_t newStringLength = baseString->currentStringLength + insertedStringLength; ensureStringBufferCanHold(baseString, newStringLength); /* Shift following string to 'right' */ memmove(baseString->str + pos + insertedStringLength, baseString->str + pos, baseString->currentStringLength - pos); strncpy(baseString->str + pos, insertedString, insertedStringLength); baseString->currentStringLength = newStringLength; baseString->str[baseString->currentStringLength] = '\0'; } } }