14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * SymbolTable.c * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SymbolTable.h" 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h" 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h" 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char* MTAG = __FILE__; 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_Init(SymbolTable **ptr) 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == NULL) 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *ptr = NEW(SymbolTable, MTAG); 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*ptr == NULL) 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_OUT_OF_MEMORY")); 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, HashMapCreate(&(*ptr)->hashmap)); 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (*ptr)->num_special_symbols = 0; 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* init the memory for the hashtable */ 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ST_reset(*ptr); 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_Free(SymbolTable *self) 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL) 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* free all the slots that were used 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project and remove all hashtable entries */ 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ST_reset(self); 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* delete the hash table */ 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self->hashmap) 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, HashMapDestroy(self->hashmap)); 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* delete the symbol table */ 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self != NULL) 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project FREE(self); 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_putKeyValue(SymbolTable* self, const LCHAR* key, const LCHAR* value) 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project Symbol* symbol; 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR* buf; 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL || key == NULL || value == NULL) 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* reuse the old entry if it exists 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project but if no old entry exists for this key then I need to create a new one */ 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = HashMapGet(self->hashmap, key, (void**) & buf); 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_NO_MATCH_ERROR) 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, ST_getSymbolSlot(self, &symbol)); 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* copy the key */ 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MEMCHK(rc, LSTRLEN(key), MAX_SEMPROC_KEY); 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(symbol->key, key); 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* creates a new entry if it does not already exist */ 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, HashMapPut(self->hashmap, symbol->key, symbol->value)); 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* for later */ 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project buf = symbol->value; 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (rc != ESR_SUCCESS) 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (LSTRLEN(value) >= MAX_SEMPROC_VALUE) 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError("Warning: chopping length of value len %d > %d (%s)\n", LSTRLEN(value), MAX_SEMPROC_VALUE, value); 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRNCPY(buf, value, MAX_SEMPROC_VALUE); 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project buf[MAX_SEMPROC_VALUE-1] = 0; 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* MEMCHK(rc, LSTRLEN(value), MAX_SEMPROC_VALUE); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(buf, value); */ 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_Copy(SymbolTable* self, HashMap* dst) 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project static const LCHAR* _MTAG = L("semproc.st.copy"); 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i, size; 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *pkey; 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *pvalue; 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *copyValue; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!dst) return ESR_INVALID_ARGUMENT; 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapGetSize(self->hashmap, &size); 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0;i < size;i++) 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapGetKeyAtIndex(self->hashmap, i, &pkey); 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapGet(self->hashmap, pkey, (void **)&pvalue); 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* add one more space */ 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project copyValue = (LCHAR*) CALLOC(LSTRLEN(pvalue) + 1, sizeof(LCHAR), _MTAG); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!copyValue) 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_OUT_OF_MEMORY")); 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_OUT_OF_MEMORY; 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(copyValue, pvalue); 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project HashMapPut(dst, pkey, copyValue); 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_getKeyValue(SymbolTable* self, const LCHAR* key, LCHAR** value) 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LCHAR *dot; 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL || key == NULL || value == NULL) 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rc = HashMapGet(self->hashmap, key, (void**)value); 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_SUCCESS || rc != ESR_NO_MATCH_ERROR) 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rc == ESR_NO_MATCH_ERROR) 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* handle SPECIAL CASEs */ 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0;i < self->num_special_symbols; i++) 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* try as is */ 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!LSTRCMP(key, self->SpecialSymbols[i].key)) 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *value = self->SpecialSymbols[i].value; 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* try without dot */ 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project dot = LSTRCHR(key, L('.')); 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (dot) 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project key = ++dot; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* is it a match? */ 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!LSTRCMP(key, self->SpecialSymbols[i].key)) 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *value = self->SpecialSymbols[i].value; 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *value = UNDEFINED_SYMBOL; 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_getSymbolSlot(SymbolTable* ptr, Symbol** slot) 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == NULL || slot == NULL) 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *slot = ptr->next++; 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MEMCHK(rc, ptr->next, &ptr->Symbols[MAX_SYMBOLS-1]); 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_reset(SymbolTable *ptr) 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == NULL) 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, HashMapRemoveAll(ptr->hashmap)); 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->next = &ptr->Symbols[0]; 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_SYMBOLS; i++) 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->Symbols[i].key[0] = 0; 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->Symbols[i].value[0] = 0; 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_reset_all(SymbolTable *ptr) 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int i; 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ESR_ReturnCode rc; 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ptr == NULL) 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CHKLOG(rc, HashMapRemoveAll(ptr->hashmap)); 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->next = &ptr->Symbols[0 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ]; 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_SYMBOLS; i++) 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->Symbols[i].key[0] = 0; 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->Symbols[i].value[0] = 0; 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0; i < MAX_SPECIAL_SYMBOLS; i++) 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->SpecialSymbols[i].key[0] = 0; 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->SpecialSymbols[i].value[0] = 0; 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ptr->num_special_symbols = 0; 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP: 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return rc; 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode ST_putSpecialKeyValue(SymbolTable* self, const LCHAR* key, const LCHAR* value) 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project size_t i; 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self == NULL || key == NULL || value == NULL) 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("ESR_INVALID_ARGUMENT")); 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_INVALID_ARGUMENT; 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* see if already there, and overwrite */ 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (i = 0;i < self->num_special_symbols;i++) 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!LSTRCMP(self->SpecialSymbols[i].key, key)) 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(self->SpecialSymbols[i].value, value); 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (self->num_special_symbols < MAX_SPECIAL_SYMBOLS) 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(self->SpecialSymbols[self->num_special_symbols].key, key); 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project LSTRCPY(self->SpecialSymbols[self->num_special_symbols].value, value); 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ++self->num_special_symbols; 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_SUCCESS; 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PLogError(L("Semproc: Symbol table has too many special symbols")); 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ESR_BUFFER_OVERFLOW; 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 294