forked from projectcalico/datrie
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
11 changed files
with
625 additions
and
365 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,169 @@ | ||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | ||
/* | ||
* libdatrie - Double-Array Trie Library | ||
* Copyright (C) 2006 Theppitak Karoonboonyanan <[email protected]> | ||
* | ||
* This library is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2.1 of the License, or (at your option) any later version. | ||
* | ||
* This library is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this library; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
/* | ||
* dstring.c - Dynamic string type | ||
* Created: 2012-08-01 | ||
* Author: Theppitak Karoonboonyanan <[email protected]> | ||
*/ | ||
|
||
#include "dstring.h" | ||
|
||
#include "trie-private.h" | ||
#include <string.h> | ||
#include <stdlib.h> | ||
|
||
struct _DString { | ||
int char_size; | ||
int str_len; | ||
int alloc_size; | ||
void * val; | ||
}; | ||
|
||
|
||
DString * | ||
dstring_new (int char_size, int n_elm) | ||
{ | ||
DString *ds; | ||
|
||
ds = (DString *) malloc (sizeof (DString)); | ||
if (!ds) | ||
return NULL; | ||
|
||
ds->alloc_size = char_size * n_elm; | ||
ds->val = malloc (ds->alloc_size); | ||
if (!ds->val) { | ||
free (ds); | ||
return NULL; | ||
} | ||
|
||
ds->char_size = char_size; | ||
ds->str_len = 0; | ||
|
||
return ds; | ||
} | ||
|
||
void | ||
dstring_free (DString *ds) | ||
{ | ||
free (ds->val); | ||
free (ds); | ||
} | ||
|
||
int | ||
dstring_length (const DString *ds) | ||
{ | ||
return ds->str_len; | ||
} | ||
|
||
const void * | ||
dstring_get_val (const DString *ds) | ||
{ | ||
return ds->val; | ||
} | ||
|
||
void * | ||
dstring_get_val_rw (DString *ds) | ||
{ | ||
return ds->val; | ||
} | ||
|
||
void | ||
dstring_clear (DString *ds) | ||
{ | ||
ds->str_len = 0; | ||
} | ||
|
||
static Bool | ||
dstring_ensure_space (DString *ds, int size) | ||
{ | ||
if (ds->alloc_size < size) { | ||
int re_size = MAX_VAL (ds->alloc_size * 2, size); | ||
void *re_ptr = realloc (ds->val, re_size); | ||
if (!re_ptr) | ||
return FALSE; | ||
ds->val = re_ptr; | ||
ds->alloc_size = re_size; | ||
} | ||
|
||
return TRUE; | ||
} | ||
|
||
Bool | ||
dstring_copy (DString *dst, const DString *src) | ||
{ | ||
if (!dstring_ensure_space (dst, (src->str_len + 1) * src->char_size)) | ||
return FALSE; | ||
|
||
memcpy (dst->val, src->val, (src->str_len + 1) * src->char_size); | ||
|
||
dst->char_size = src->char_size; | ||
dst->str_len = src->str_len; | ||
|
||
return TRUE; | ||
} | ||
|
||
Bool | ||
dstring_append (DString *dst, const DString *src) | ||
{ | ||
if (dst->char_size != src->char_size) | ||
return FALSE; | ||
|
||
if (!dstring_ensure_space (dst, (dst->str_len + src->str_len + 1) | ||
* dst->char_size)) | ||
{ | ||
return FALSE; | ||
} | ||
|
||
memcpy (dst->val + (dst->char_size * dst->str_len), src->val, | ||
(src->str_len + 1) * dst->char_size); | ||
|
||
dst->str_len += src->str_len; | ||
|
||
return TRUE; | ||
} | ||
|
||
Bool | ||
dstring_append_char (DString *ds, const void *data) | ||
{ | ||
if (!dstring_ensure_space (ds, (ds->str_len + 2) * ds->char_size)) | ||
return FALSE; | ||
|
||
memcpy (ds->val + (ds->char_size * ds->str_len), data, ds->char_size); | ||
|
||
ds->str_len++; | ||
|
||
return TRUE; | ||
} | ||
|
||
Bool | ||
dstring_terminate (DString *ds) | ||
{ | ||
if (!dstring_ensure_space (ds, (ds->str_len + 2) * ds->char_size)) | ||
return FALSE; | ||
|
||
memset (ds->val + (ds->char_size * ds->str_len), 0, ds->char_size); | ||
|
||
return TRUE; | ||
} | ||
|
||
/* | ||
vi:ts=4:ai:expandtab | ||
*/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | ||
/* | ||
* libdatrie - Double-Array Trie Library | ||
* Copyright (C) 2006 Theppitak Karoonboonyanan <[email protected]> | ||
* | ||
* This library is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU Lesser General Public | ||
* License as published by the Free Software Foundation; either | ||
* version 2.1 of the License, or (at your option) any later version. | ||
* | ||
* This library is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
* Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this library; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
*/ | ||
|
||
/* | ||
* dstring.h - Dynamic string type | ||
* Created: 2012-08-01 | ||
* Author: Theppitak Karoonboonyanan <[email protected]> | ||
*/ | ||
|
||
#ifndef __DSTRING_H | ||
#define __DSTRING_H | ||
|
||
#include "typedefs.h" | ||
|
||
typedef struct _DString DString; | ||
|
||
DString * dstring_new (int char_size, int n_elm); | ||
|
||
void dstring_free (DString *ds); | ||
|
||
int dstring_length (const DString *ds); | ||
|
||
const void * dstring_get_val (const DString *ds); | ||
|
||
void * dstring_get_val_rw (DString *ds); | ||
|
||
void dstring_clear (DString *ds); | ||
|
||
Bool dstring_copy (DString *dst, const DString *src); | ||
|
||
Bool dstring_append (DString *dst, const DString *src); | ||
|
||
Bool dstring_append_char (DString *ds, const void *data); | ||
|
||
Bool dstring_terminate (DString *ds); | ||
|
||
|
||
#endif /* __DSTRING_H */ | ||
|
||
/* | ||
vi:ts=4:ai:expandtab | ||
*/ |
Oops, something went wrong.