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