- replaced G.{edve,eded,edvl} with G.editMesh, atm just a structure to
[blender.git] / source / blender / blenlib / intern / BLI_dynstr.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): none yet.
29  *
30  * ***** END GPL/BL DUAL LICENSE BLOCK *****
31  * Dynamically sized string ADT
32  */
33
34 #include <stdlib.h>
35 #include <string.h>
36
37 #include "MEM_guardedalloc.h"
38 #include "BLI_blenlib.h"
39 #include "BLI_dynstr.h"
40
41 #ifdef HAVE_CONFIG_H
42 #include <config.h>
43 #endif
44
45 /***/
46
47 typedef struct DynStrElem DynStrElem;
48 struct DynStrElem {
49         DynStrElem *next;
50         
51         char *str;
52 };
53
54 struct DynStr {
55         DynStrElem *elems, *last;
56         int curlen;
57 };
58
59 /***/
60
61 DynStr *BLI_dynstr_new(void) {
62         DynStr *ds= MEM_mallocN(sizeof(*ds), "DynStr");
63         ds->elems= ds->last= NULL;
64         ds->curlen= 0;
65         
66         return ds;
67 }
68
69 void BLI_dynstr_append(DynStr *ds, char *cstr) {
70         DynStrElem *dse= malloc(sizeof(*dse));
71         int cstrlen= strlen(cstr);
72         
73         dse->str= malloc(cstrlen+1);
74         memcpy(dse->str, cstr, cstrlen+1);
75         dse->next= NULL;
76         
77         if (!ds->last)
78                 ds->last= ds->elems= dse;
79         else
80                 ds->last= ds->last->next= dse;
81
82         ds->curlen+= cstrlen;
83 }
84
85 int BLI_dynstr_get_len(DynStr *ds) {
86         return ds->curlen;
87 }
88
89 char *BLI_dynstr_get_cstring(DynStr *ds) {
90         char *s, *rets= MEM_mallocN(ds->curlen+1, "dynstr_cstring");
91         DynStrElem *dse;
92         
93         for (s= rets, dse= ds->elems; dse; dse= dse->next) {
94                 int slen= strlen(dse->str);
95
96                 memcpy(s, dse->str, slen);
97
98                 s+= slen;
99         }
100         rets[ds->curlen]= '\0';
101         
102         return rets;
103 }
104
105 void BLI_dynstr_free(DynStr *ds) {
106         DynStrElem *dse;
107         
108         for (dse= ds->elems; dse; ) {
109                 DynStrElem *n= dse->next;
110                 
111                 free(dse->str);
112                 free(dse);
113                 
114                 dse= n;
115         }
116         
117         MEM_freeN(ds);
118 }