qse/ase/awk/tab.c

240 lines
4.4 KiB
C
Raw Normal View History

2006-01-29 18:28:14 +00:00
/*
2007-02-03 10:52:36 +00:00
* $Id: tab.c,v 1.30 2007-02-03 10:51:14 bacon Exp $
2007-02-03 10:47:41 +00:00
*
* {License}
2006-01-29 18:28:14 +00:00
*/
2006-10-24 04:10:12 +00:00
#include <ase/awk/awk_i.h>
2006-01-30 14:45:12 +00:00
2006-10-24 04:10:12 +00:00
ase_awk_tab_t* ase_awk_tab_open (ase_awk_tab_t* tab, ase_awk_t* awk)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
if (tab == ASE_NULL)
2006-03-07 15:55:14 +00:00
{
2006-10-24 04:10:12 +00:00
tab = (ase_awk_tab_t*) ASE_AWK_MALLOC (
2006-11-29 02:54:17 +00:00
awk, ASE_SIZEOF(ase_awk_tab_t));
2006-10-24 04:10:12 +00:00
if (tab == ASE_NULL) return ASE_NULL;
tab->__dynamic = ase_true;
2006-01-29 18:28:14 +00:00
}
2006-10-24 04:10:12 +00:00
else tab->__dynamic = ase_false;
2006-01-29 18:28:14 +00:00
2006-08-31 15:09:24 +00:00
tab->awk = awk;
2006-10-24 04:10:12 +00:00
tab->buf = ASE_NULL;
2006-01-29 18:28:14 +00:00
tab->size = 0;
tab->capa = 0;
return tab;
}
2006-10-24 04:10:12 +00:00
void ase_awk_tab_close (ase_awk_tab_t* tab)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
ase_awk_tab_clear (tab);
if (tab->buf != ASE_NULL)
2006-03-07 15:55:14 +00:00
{
2006-10-24 04:10:12 +00:00
ASE_AWK_FREE (tab->awk, tab->buf);
tab->buf = ASE_NULL;
2006-01-29 18:28:14 +00:00
tab->capa = 0;
}
2006-10-24 04:10:12 +00:00
if (tab->__dynamic) ASE_AWK_FREE (tab->awk, tab);
2006-01-29 18:28:14 +00:00
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_getsize (ase_awk_tab_t* tab)
2006-01-29 18:28:14 +00:00
{
return tab->size;
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_getcapa (ase_awk_tab_t* tab)
2006-01-29 18:28:14 +00:00
{
return tab->capa;
}
2006-10-24 04:10:12 +00:00
ase_awk_tab_t* ase_awk_tab_setcapa (ase_awk_tab_t* tab, ase_size_t capa)
2006-01-29 18:28:14 +00:00
{
2006-08-03 06:06:27 +00:00
void* tmp;
2006-01-29 18:28:14 +00:00
2006-03-07 15:55:14 +00:00
if (tab->size > capa)
{
2006-10-24 04:10:12 +00:00
ase_awk_tab_remove (tab, capa, tab->size - capa);
2006-10-26 09:31:28 +00:00
ASE_AWK_ASSERT (tab->awk, tab->size <= capa);
2006-01-29 18:28:14 +00:00
}
2006-03-07 15:55:14 +00:00
if (capa > 0)
{
2007-02-01 08:38:24 +00:00
if (tab->awk->prmfns.realloc != ASE_NULL)
2006-08-16 11:35:54 +00:00
{
2006-10-24 04:10:12 +00:00
tmp = ASE_AWK_REALLOC (tab->awk,
2006-11-29 02:54:17 +00:00
tab->buf, ASE_SIZEOF(*tab->buf) * capa);
2006-10-24 04:10:12 +00:00
if (tmp == ASE_NULL) return ASE_NULL;
2006-08-31 15:11:17 +00:00
}
else
{
2006-10-24 04:10:12 +00:00
tmp = ASE_AWK_MALLOC (
2006-11-29 02:54:17 +00:00
tab->awk, ASE_SIZEOF(*tab->buf) * capa);
2006-10-24 04:10:12 +00:00
if (tmp == ASE_NULL) return ASE_NULL;
if (tab->buf != ASE_NULL)
2006-08-31 15:11:17 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t x;
2006-08-31 15:11:17 +00:00
x = (capa > tab->capa)? tab->capa: capa;
2006-10-24 04:10:12 +00:00
ASE_AWK_MEMCPY (
2006-09-25 06:17:19 +00:00
tab->awk, tmp, tab->buf,
2006-11-29 02:54:17 +00:00
ASE_SIZEOF(*tab->buf) * x);
2006-10-24 04:10:12 +00:00
ASE_AWK_FREE (tab->awk, tab->buf);
2006-08-31 15:11:17 +00:00
}
2006-08-16 11:35:54 +00:00
}
2006-01-29 18:28:14 +00:00
}
2006-03-07 15:55:14 +00:00
else
{
2006-10-24 04:10:12 +00:00
if (tab->buf != ASE_NULL) ASE_AWK_FREE (tab->awk, tab->buf);
tmp = ASE_NULL;
2006-01-29 18:28:14 +00:00
}
tab->buf = tmp;
tab->capa = capa;
return tab;
}
2006-10-24 04:10:12 +00:00
void ase_awk_tab_clear (ase_awk_tab_t* tab)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t i;
2006-01-29 18:28:14 +00:00
2006-03-07 15:55:14 +00:00
for (i = 0; i < tab->size; i++)
{
2006-10-24 04:10:12 +00:00
ASE_AWK_FREE (tab->awk, tab->buf[i].name);
tab->buf[i].name = ASE_NULL;
2006-08-03 06:06:27 +00:00
tab->buf[i].name_len = 0;
2006-01-29 18:28:14 +00:00
}
tab->size = 0;
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_insert (
ase_awk_tab_t* tab, ase_size_t index,
const ase_char_t* str, ase_size_t len)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t i;
ase_char_t* str_dup;
2006-01-29 18:28:14 +00:00
2006-10-24 04:10:12 +00:00
str_dup = ase_awk_strxdup (tab->awk, str, len);
if (str_dup == ASE_NULL) return (ase_size_t)-1;
2006-01-29 18:28:14 +00:00
2006-03-07 15:55:14 +00:00
if (index >= tab->capa)
{
2006-10-24 04:10:12 +00:00
ase_size_t capa;
2006-01-29 18:28:14 +00:00
if (tab->capa <= 0) capa = (index + 1);
2006-03-07 15:55:14 +00:00
else
{
2006-01-29 18:28:14 +00:00
do { capa = tab->capa * 2; } while (index >= capa);
}
2006-10-24 04:10:12 +00:00
if (ase_awk_tab_setcapa(tab,capa) == ASE_NULL)
2006-03-07 15:55:14 +00:00
{
2006-10-24 04:10:12 +00:00
ASE_AWK_FREE (tab->awk, str_dup);
return (ase_size_t)-1;
2006-01-29 18:28:14 +00:00
}
}
for (i = tab->size; i > index; i--) tab->buf[i] = tab->buf[i-1];
2006-08-03 06:06:27 +00:00
tab->buf[index].name = str_dup;
tab->buf[index].name_len = len;
2006-01-29 18:28:14 +00:00
if (index > tab->size) tab->size = index + 1;
else tab->size++;
return index;
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_remove (
ase_awk_tab_t* tab, ase_size_t index, ase_size_t count)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t i, j, k;
2006-01-29 18:28:14 +00:00
if (index >= tab->size) return 0;
if (count > tab->size - index) count = tab->size - index;
i = index;
j = index + count;
k = index + count;
2006-03-07 15:55:14 +00:00
while (i < k)
{
2006-10-24 04:10:12 +00:00
ASE_AWK_FREE (tab->awk, tab->buf[i].name);
2006-03-07 15:55:14 +00:00
2006-01-29 18:28:14 +00:00
if (j >= tab->size)
2006-03-07 15:55:14 +00:00
{
2006-10-24 04:10:12 +00:00
tab->buf[i].name = ASE_NULL;
2006-08-03 06:06:27 +00:00
tab->buf[i].name_len = 0;
2006-03-07 15:55:14 +00:00
i++;
}
else
{
2006-08-03 06:06:27 +00:00
tab->buf[i].name = tab->buf[j].name;
tab->buf[i].name_len = tab->buf[j].name_len;
2006-03-07 15:55:14 +00:00
i++; j++;
}
2006-01-29 18:28:14 +00:00
}
tab->size -= count;
return count;
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_add (
ase_awk_tab_t* tab, const ase_char_t* str, ase_size_t len)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
return ase_awk_tab_insert (tab, tab->size, str, len);
2006-01-29 18:28:14 +00:00
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_find (
ase_awk_tab_t* tab, ase_size_t index,
const ase_char_t* str, ase_size_t len)
2006-01-29 18:28:14 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t i;
2006-01-29 18:28:14 +00:00
2006-08-03 05:05:48 +00:00
for (i = index; i < tab->size; i++)
{
2006-10-24 04:10:12 +00:00
if (ase_awk_strxncmp (
2006-08-03 06:06:27 +00:00
tab->buf[i].name, tab->buf[i].name_len,
str, len) == 0) return i;
2006-01-29 18:28:14 +00:00
}
2006-10-24 04:10:12 +00:00
return (ase_size_t)-1;
2006-01-29 18:28:14 +00:00
}
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_rfind (
ase_awk_tab_t* tab, ase_size_t index,
const ase_char_t* str, ase_size_t len)
2006-02-05 13:45:59 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t i;
2006-02-05 13:45:59 +00:00
2006-10-24 04:10:12 +00:00
if (index >= tab->size) return (ase_size_t)-1;
2006-02-05 14:21:18 +00:00
2006-08-03 05:05:48 +00:00
for (i = index + 1; i-- > 0; )
{
2006-10-24 04:10:12 +00:00
if (ase_awk_strxncmp (
2006-08-03 06:06:27 +00:00
tab->buf[i].name, tab->buf[i].name_len,
str, len) == 0) return i;
2006-02-05 13:45:59 +00:00
}
2006-10-24 04:10:12 +00:00
return (ase_size_t)-1;
2006-02-05 13:45:59 +00:00
}
2006-02-05 14:21:18 +00:00
2006-10-24 04:10:12 +00:00
ase_size_t ase_awk_tab_rrfind (
ase_awk_tab_t* tab, ase_size_t index,
const ase_char_t* str, ase_size_t len)
2006-02-05 14:21:18 +00:00
{
2006-10-24 04:10:12 +00:00
ase_size_t i;
2006-02-05 14:21:18 +00:00
2006-10-24 04:10:12 +00:00
if (index >= tab->size) return (ase_size_t)-1;
2006-02-05 14:21:18 +00:00
2006-08-03 05:05:48 +00:00
for (i = tab->size - index; i-- > 0; )
{
2006-10-24 04:10:12 +00:00
if (ase_awk_strxncmp (
2006-08-03 06:06:27 +00:00
tab->buf[i].name, tab->buf[i].name_len,
str, len) == 0) return i;
2006-02-05 14:21:18 +00:00
}
2006-10-24 04:10:12 +00:00
return (ase_size_t)-1;
2006-02-05 14:21:18 +00:00
}