629 lines
9.4 KiB
HTML
629 lines
9.4 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
|
|
<HTML
|
|
><HEAD
|
|
><TITLE
|
|
>Tools and datatypes</TITLE
|
|
><META
|
|
NAME="GENERATOR"
|
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
|
|
REL="HOME"
|
|
TITLE="libEtPan! API"
|
|
HREF="book1.htm"><LINK
|
|
REL="PREVIOUS"
|
|
TITLE="Introduction"
|
|
HREF="c13.htm"><LINK
|
|
REL="NEXT"
|
|
TITLE="List"
|
|
HREF="x88.htm"></HEAD
|
|
><BODY
|
|
CLASS="CHAPTER"
|
|
BGCOLOR="#FFFFFF"
|
|
TEXT="#000000"
|
|
LINK="#0000FF"
|
|
VLINK="#840084"
|
|
ALINK="#0000FF"
|
|
><DIV
|
|
CLASS="NAVHEADER"
|
|
><TABLE
|
|
SUMMARY="Header navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TH
|
|
COLSPAN="3"
|
|
ALIGN="center"
|
|
>libEtPan! API</TH
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="left"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="c13.htm"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="80%"
|
|
ALIGN="center"
|
|
VALIGN="bottom"
|
|
></TD
|
|
><TD
|
|
WIDTH="10%"
|
|
ALIGN="right"
|
|
VALIGN="bottom"
|
|
><A
|
|
HREF="x88.htm"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
></TABLE
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"></DIV
|
|
><DIV
|
|
CLASS="CHAPTER"
|
|
><H1
|
|
><A
|
|
NAME="AEN16"
|
|
></A
|
|
>Chapter 2. Tools and datatypes</H1
|
|
><DIV
|
|
CLASS="TOC"
|
|
><DL
|
|
><DT
|
|
><B
|
|
>Table of Contents</B
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="c16.htm#AEN19"
|
|
>Array</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="x88.htm"
|
|
>List</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="x161.htm"
|
|
>Hash table</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="x229.htm"
|
|
>Buffered I/O</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="x289.htm"
|
|
>non-buffered I/O</A
|
|
></DT
|
|
><DT
|
|
><A
|
|
HREF="x312.htm"
|
|
>strings</A
|
|
></DT
|
|
></DL
|
|
></DIV
|
|
><P
|
|
> libEtPan! include a collection of datatypes such as lists,
|
|
arrays, hash tables and tools such as buffered I/O.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT1"
|
|
><H1
|
|
CLASS="SECT1"
|
|
><A
|
|
NAME="AEN19"
|
|
>Array</A
|
|
></H1
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
typedef struct carray_s carray;
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray</B
|
|
> is an array of pointers that will
|
|
resize automatically in case a new element is added.
|
|
</P
|
|
><P
|
|
>
|
|
The <B
|
|
CLASS="COMMAND"
|
|
>carray</B
|
|
> is implemented with an array
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(void **)</B
|
|
> that can be resized. An array has a
|
|
size: this is the number of elements that can be added before
|
|
the table is resized. It also has a count of elements: this is
|
|
the elements that exist in the array.
|
|
</P
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-NEW"
|
|
>carray_new and carray_free</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>carray * carray_new(unsigned int initsize);
|
|
|
|
void carray_free(carray * array);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_new()</B
|
|
> creates a new array with an
|
|
initial size. The array is not resized until the number of
|
|
element reach the initial size. It returns
|
|
<B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
> in case of failure.
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_free()</B
|
|
> releases memory used by the
|
|
given array.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN35"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-1. carray creation</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <stdlib.h>
|
|
|
|
#define SIZE 50
|
|
|
|
int main(void)
|
|
{
|
|
carray * a;
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
exit(EXIT_FAILURE);
|
|
|
|
/* do things here */
|
|
|
|
carray_free(a);
|
|
|
|
exit(EXIT_SUCESS);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-SET-SIZE"
|
|
>carray_set_size</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int carray_set_size(carray * array, uint32_t new_size);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_set_size()</B
|
|
> sets the size of the
|
|
array. It returns <B
|
|
CLASS="COMMAND"
|
|
>0</B
|
|
> in case of success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>-1</B
|
|
> in case of failure.
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN45"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-2. preallocating carray</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <stdlib.h>
|
|
|
|
#define SIZE 50
|
|
#define NEWSIZE 200
|
|
|
|
int main(void)
|
|
{
|
|
carray * a;
|
|
unsigned int i;
|
|
char p[500];
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
goto err;
|
|
|
|
r = carray_set_size(NEWSIZE);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
for(i = 0 ; i < NEWSIZE ; i ++)
|
|
carray_set(a, i, &p[i]);
|
|
|
|
/* do things here */
|
|
|
|
carray_free(a);
|
|
|
|
exit(EXIT_SUCESS);
|
|
|
|
free:
|
|
carray_free(a);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-COUNT"
|
|
>carray_count, carray_add, carray_get and carray_set</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int carray_count(carray);
|
|
|
|
int carray_add(carray * array, void * data, unsigned int * index);
|
|
|
|
void * carray_get(carray * array, unsigned int indx);
|
|
|
|
void carray_set(carray * array, unsigned int indx, void * value);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_count()</B
|
|
> returns the number of
|
|
elements in the <B
|
|
CLASS="COMMAND"
|
|
>carray</B
|
|
>.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_add()</B
|
|
>adds an element at the end of
|
|
the array. The <B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> of the element is
|
|
returns in <B
|
|
CLASS="COMMAND"
|
|
>(* index)</B
|
|
> if
|
|
<B
|
|
CLASS="COMMAND"
|
|
>index</B
|
|
> is not <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>. It
|
|
returns <B
|
|
CLASS="COMMAND"
|
|
>0</B
|
|
> in case of success,
|
|
<B
|
|
CLASS="COMMAND"
|
|
>-1</B
|
|
> in case of failure.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_get()</B
|
|
> returns the elements contained
|
|
at the given cell of the table.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_set()</B
|
|
> replace the element at the
|
|
given index of table table with the given value.
|
|
Complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN66"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-3. carray access</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
#include <string.h>
|
|
|
|
#define SIZE 50
|
|
|
|
int main(void)
|
|
{
|
|
carray * a;
|
|
int r;
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
goto err;
|
|
|
|
r = carray_add(a, "foo-bar-1", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-2", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-3", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
for(i = 0 ; i < carray_count(a) ; i ++) {
|
|
char * str;
|
|
|
|
str = carray_get(a, i);
|
|
if (strcmp("foo-bar-2", str) == 0)
|
|
carray_set(a, i, "foo-bar-2-replacement");
|
|
|
|
printf("%s\n", str);
|
|
}
|
|
|
|
carray_free(a);
|
|
|
|
exit(EXIT_SUCESS);
|
|
|
|
free:
|
|
carray_free(a);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-DELETE"
|
|
>carray_delete</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>int carray_delete(carray * array, uint32_t indx);
|
|
|
|
int carray_delete_slow(carray * array, uint32_t indx);
|
|
|
|
int carray_delete_fast(carray * array, uint32_t indx);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_delete()</B
|
|
> removes an element of the
|
|
table. Order will not be garanteed. The returned result can
|
|
be ignored.
|
|
Complexity is O(1).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_delete_slow()</B
|
|
> removes an element of
|
|
the table. Order will be garanteed. The returned result can
|
|
be ignored.
|
|
Complexity is O(n).
|
|
</P
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_delete_fast()</B
|
|
> the element will just
|
|
be replaced with <B
|
|
CLASS="COMMAND"
|
|
>NULL</B
|
|
>. Order will be kept
|
|
but the number of elements will remains the same. The
|
|
returned result can be ignored.
|
|
Complexity is O(1).
|
|
</P
|
|
><DIV
|
|
CLASS="EXAMPLE"
|
|
><A
|
|
NAME="AEN79"
|
|
></A
|
|
><P
|
|
><B
|
|
>Example 2-4. deletion in carray</B
|
|
></P
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>#include <libetpan/libetpan.h>
|
|
|
|
#define SIZE 50
|
|
|
|
carray * build_array(void)
|
|
{
|
|
carray * a;
|
|
|
|
a = carray_new(SIZE);
|
|
if (a == NULL)
|
|
goto err;
|
|
|
|
r = carray_add(a, "foo-bar-1", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-2", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
carray_add(a, "foo-bar-3", NULL);
|
|
if (r < 0)
|
|
goto free;
|
|
|
|
return a;
|
|
|
|
free:
|
|
carray_free(a);
|
|
err:
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
void delete(carray * a)
|
|
{
|
|
/* deleting foo-bar-1 */
|
|
carray_delete(a, 0);
|
|
/* resulting size is 2, order of elements is undefined */
|
|
}
|
|
|
|
void delete_slow(carray * a)
|
|
{
|
|
/* deleting foo-bar-1 */
|
|
carray_delete_slow(a, 0);
|
|
/* resulting size is 2, order of elements is the same */
|
|
}
|
|
|
|
void delete_fast(carray * a)
|
|
{
|
|
/* deleting foo-bar-1 */
|
|
carray_delete_slow(a, 0);
|
|
/*
|
|
resulting size is 3,
|
|
order of elements is { NULL, foo-bar-2, foo-bar-3 }
|
|
*/
|
|
}
|
|
</PRE
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="SECT2"
|
|
><H2
|
|
CLASS="SECT2"
|
|
><A
|
|
NAME="CARRAY-DATA"
|
|
>carray_data</A
|
|
></H2
|
|
><PRE
|
|
CLASS="PROGRAMLISTING"
|
|
>void ** carray_data(carray);
|
|
</PRE
|
|
><P
|
|
> <B
|
|
CLASS="COMMAND"
|
|
>carray_data</B
|
|
>returns the table used for
|
|
implementation :
|
|
<B
|
|
CLASS="COMMAND"
|
|
>(void **)</B
|
|
>.
|
|
</P
|
|
></DIV
|
|
></DIV
|
|
></DIV
|
|
><DIV
|
|
CLASS="NAVFOOTER"
|
|
><HR
|
|
ALIGN="LEFT"
|
|
WIDTH="100%"><TABLE
|
|
SUMMARY="Footer navigation table"
|
|
WIDTH="100%"
|
|
BORDER="0"
|
|
CELLPADDING="0"
|
|
CELLSPACING="0"
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="c13.htm"
|
|
ACCESSKEY="P"
|
|
>Prev</A
|
|
></TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="book1.htm"
|
|
ACCESSKEY="H"
|
|
>Home</A
|
|
></TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
><A
|
|
HREF="x88.htm"
|
|
ACCESSKEY="N"
|
|
>Next</A
|
|
></TD
|
|
></TR
|
|
><TR
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="left"
|
|
VALIGN="top"
|
|
>Introduction</TD
|
|
><TD
|
|
WIDTH="34%"
|
|
ALIGN="center"
|
|
VALIGN="top"
|
|
> </TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>List</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |