| /*---------------------------------------------------------------------------* |
| * LStringImpl.c * |
| * * |
| * Copyright 2007, 2008 Nuance Communciations, Inc. * |
| * * |
| * Licensed under the Apache License, Version 2.0 (the 'License'); * |
| * you may not use this file except in compliance with the License. * |
| * * |
| * You may obtain a copy of the License at * |
| * http://www.apache.org/licenses/LICENSE-2.0 * |
| * * |
| * Unless required by applicable law or agreed to in writing, software * |
| * distributed under the License is distributed on an 'AS IS' BASIS, * |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * |
| * See the License for the specific language governing permissions and * |
| * limitations under the License. * |
| * * |
| *---------------------------------------------------------------------------*/ |
| |
| #include "lstring.h" |
| #include "LStringImpl.h" |
| #include "plog.h" |
| #include "pmemory.h" |
| |
| #define MTAG NULL |
| #define INITIAL_SIZE 32 |
| |
| ESR_ReturnCode LStringCreate(LString** self) |
| { |
| LStringImpl* impl; |
| |
| impl = NEW(LStringImpl, MTAG); |
| if (impl == NULL) |
| return ESR_OUT_OF_MEMORY; |
| impl->Interface.append = &LString_Append; |
| impl->Interface.toLCHAR = &LString_ToLCHAR; |
| impl->Interface.reset = &LString_Reset; |
| impl->Interface.destroy = &LString_Destroy; |
| impl->size = INITIAL_SIZE; |
| impl->value = MALLOC(sizeof(LCHAR) * INITIAL_SIZE, MTAG); |
| if (impl->value == NULL) |
| { |
| PLogError(L("ESR_OUT_OF_MEMORY")); |
| return ESR_OUT_OF_MEMORY; |
| } |
| LSTRCPY(impl->value, L("")); |
| if (impl->value == NULL) |
| return ESR_OUT_OF_MEMORY; |
| *self = (LString*) impl; |
| return ESR_SUCCESS; |
| } |
| |
| ESR_ReturnCode LString_Append(LString* self, const LCHAR* value) |
| { |
| LStringImpl* impl = (LStringImpl*) self; |
| size_t needed; |
| |
| needed = LSTRLEN(impl->value) + LSTRLEN(value) + 1; |
| |
| if (needed > impl->size) |
| { |
| LCHAR* temp = REALLOC(impl->value, sizeof(LCHAR) * (needed + (impl->size / 2))); |
| if (temp == NULL) |
| return ESR_OUT_OF_MEMORY; |
| impl->size = sizeof(LCHAR) * (needed + (impl->size / 2)); |
| impl->value = temp; |
| } |
| LSTRCAT(impl->value, value); |
| return ESR_SUCCESS; |
| } |
| |
| ESR_ReturnCode LString_Reset(LString* self) |
| { |
| LStringImpl* impl = (LStringImpl*) self; |
| |
| LSTRCPY(impl->value, L("")); |
| return ESR_SUCCESS; |
| } |
| |
| ESR_ReturnCode LString_ToLCHAR(LString* self, LCHAR** result) |
| { |
| LStringImpl* impl = (LStringImpl*) self; |
| |
| if (result == NULL) |
| return ESR_INVALID_ARGUMENT; |
| *result = impl->value; |
| impl->value = NULL; |
| return self->destroy(self); |
| } |
| |
| ESR_ReturnCode LString_Destroy(LString* self) |
| { |
| LStringImpl* impl = (LStringImpl*) self; |
| |
| FREE(impl->value); |
| FREE(impl); |
| return ESR_SUCCESS; |
| } |