Path: blob/master/runtime/exelib/common/strbuf.c
6000 views
/*******************************************************************************1* Copyright (c) 1991, 2017 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#include <string.h>23#include "libhlp.h"24#include "exelib_internal.h"2526#define MIN_GROWTH 1282728J9StringBuffer* strBufferCat(struct J9PortLibrary *portLibrary, J9StringBuffer* buffer, const char* string) {29UDATA len = strlen(string);3031buffer = strBufferEnsure(portLibrary, buffer, len);32if (buffer) {33strcat(buffer->data, string);34buffer->remaining -= len;35}3637return buffer;38}394041J9StringBuffer* strBufferEnsure(struct J9PortLibrary *portLibrary, J9StringBuffer* buffer, UDATA len) {4243if (buffer == NULL) {44PORT_ACCESS_FROM_PORT(portLibrary);45UDATA newSize = len > MIN_GROWTH ? len : MIN_GROWTH;46buffer = j9mem_allocate_memory( newSize + 1 + sizeof(UDATA), OMRMEM_CATEGORY_VM); /* 1 for null terminator */47if (buffer != NULL) {48buffer->remaining = newSize;49buffer->data[0] = '\0';50}51return buffer;52}5354if (len > buffer->remaining) {55PORT_ACCESS_FROM_PORT(portLibrary);56UDATA newSize = len > MIN_GROWTH ? len : MIN_GROWTH;57J9StringBuffer* new = j9mem_allocate_memory(strlen((const char*)buffer->data) + newSize + sizeof(UDATA) + 1 , OMRMEM_CATEGORY_VM);58if (new) {59new->remaining = newSize;60strcpy(new->data, (const char *)buffer->data);61}62j9mem_free_memory(buffer);63return new;64}6566return buffer;67}686970J9StringBuffer* strBufferPrepend(struct J9PortLibrary *portLibrary, J9StringBuffer* buffer, char* string) {71UDATA len = strlen(string);7273buffer = strBufferEnsure(portLibrary, buffer, len);74if (buffer) {75memmove(buffer->data + len, buffer->data, strlen((const char*)buffer->data) + 1);76strncpy(buffer->data, string, len);77buffer->remaining -= len;78}7980return buffer;81}828384char* strBufferData(J9StringBuffer* buffer) {85return buffer ? buffer->data : NULL;86}878889