geany  1.38
About: Geany is a text editor (using GTK2) with basic features of an integrated development environment (syntax highlighting, code folding, symbol name auto-completion, ...). F: office T: editor programming GTK+ IDE
  Fossies Dox: geany-1.38.tar.bz2  ("unofficial" and yet experimental doxygen-generated source code documentation)  

strlist.c
Go to the documentation of this file.
1/*
2* Copyright (c) 1999-2002, Darren Hiebert
3*
4* This source code is released for free distribution under the terms of the
5* GNU General Public License version 2 or (at your option) any later version.
6*
7* This module contains functions managing resizable string lists.
8*/
9
10/*
11* INCLUDE FILES
12*/
13#include "general.h" /* must always come first */
14
15#include <string.h>
16#include <fnmatch.h>
17
18#include "debug.h"
19#include "read.h"
20#include "routines.h"
21#include "strlist.h"
22
23/*
24* FUNCTION DEFINITIONS
25*/
26
28{
30}
31
32extern void stringListAdd (stringList *const current, vString *string)
33{
34 ptrArrayAdd (current, string);
35}
36
37extern void stringListRemoveLast (stringList *const current)
38{
39 ptrArrayRemoveLast (current);
40}
41
42/* Combine list `from' into `current', deleting `from' */
43extern void stringListCombine (
44 stringList *const current, stringList *const from)
45{
46 ptrArrayCombine (current, from);
47}
48
49extern stringList* stringListNewFromArgv (const char* const* const argv)
50{
51 stringList* const result = stringListNew ();
52 const char *const *p;
53 Assert (argv != NULL);
54 for (p = argv ; *p != NULL ; ++p)
55 stringListAdd (result, vStringNewInit (*p));
56 return result;
57}
58
59extern stringList* stringListNewFromFile (const char* const fileName)
60{
61 stringList* result = NULL;
62 MIO* const mio = mio_new_file (fileName, "r");
63 if (mio != NULL)
64 {
65 result = stringListNew ();
66 while (! mio_eof (mio))
67 {
68 vString* const str = vStringNew ();
69 readLineRaw (str, mio);
71 if (vStringLength (str) > 0)
72 stringListAdd (result, str);
73 else
74 vStringDelete (str);
75 }
76 mio_unref (mio);
77 }
78 return result;
79}
80
81extern unsigned int stringListCount (const stringList *const current)
82{
83 return ptrArrayCount (current);
84}
85
87 const stringList *const current, const unsigned int indx)
88{
89 return ptrArrayItem (current, indx);
90}
91
92extern vString* stringListLast (const stringList *const current)
93{
94 return ptrArrayLast (current);
95}
96
97extern void stringListClear (stringList *const current)
98{
99 ptrArrayClear (current);
100}
101
102extern void stringListDelete (stringList *const current)
103{
104 ptrArrayDelete (current);
105}
106
107static bool compareString (
108 const char *const string, vString *const itm)
109{
110 return (strcmp (string, vStringValue (itm)) == 0);
111}
112
114 const char *const string, vString *const itm)
115{
116 return (strcasecmp (string, vStringValue (itm)) == 0);
117}
118
119static int stringListIndex (
120 const stringList *const current,
121 const char *const string,
122 bool (*test)(const char *s, vString *const vs))
123{
124 int result = -1;
125 unsigned int i;
126 Assert (current != NULL);
127 Assert (string != NULL);
128 Assert (test != NULL);
129 for (i = 0 ; result == -1 && i < ptrArrayCount (current) ; ++i)
130 if ((*test)(string, ptrArrayItem (current, i)))
131 result = i;
132 return result;
133}
134
135extern bool stringListHas (
136 const stringList *const current, const char *const string)
137{
138 bool result;
139 Assert (current != NULL);
140 result = stringListIndex (current, string, compareString) != -1;
141 return result;
142}
143
145 const stringList *const current, const char *const string,
146 bool (*test)(const char *s, vString *const vs))
147{
148 int i;
149
150 Assert (current != NULL);
151 Assert (string != NULL);
152
153 i = stringListIndex (current, string, test);
154 if (i == -1)
155 return NULL;
156 else
157 return stringListItem(current, i);
158}
159
161 const stringList *const current, const char *const string)
162{
163 bool result;
164 Assert (current != NULL);
165 Assert (string != NULL);
166 result = stringListIndex (current, string, compareStringInsensitive) != -1;
167 return result;
168}
169
170extern bool stringListHasTest (const stringList *const current,
171 bool (*test)(const char *s, void *userData),
172 void *userData)
173{
174 bool result = false;
175 unsigned int i;
176 Assert (current != NULL);
177 for (i = 0 ; ! result && i < ptrArrayCount (current) ; ++i)
178 result = (*test)(vStringValue ((vString *)ptrArrayItem (current, i)), userData);
179 return result;
180}
181
182extern bool stringListDeleteItemExtension (stringList* const current, const char* const extension)
183{
184 int where;
185#ifdef CASE_INSENSITIVE_FILENAMES
186 where = stringListIndex (current, extension, compareStringInsensitive);
187#else
188 where = stringListIndex (current, extension, compareString);
189#endif
190 if (where != -1)
191 ptrArrayDeleteItem (current, where);
192 return where != -1;
193}
194
196 const stringList* const current, const char* const extension)
197{
198#ifdef CASE_INSENSITIVE_FILENAMES
199 return stringListHasInsensitive (current, extension);
200#else
201 return stringListHas (current, extension);
202#endif
203}
204
206 const stringList* const current, const char* const extension)
207{
208#ifdef CASE_INSENSITIVE_FILENAMES
209 return stringListFinds (current, extension, compareStringInsensitive);
210#else
211 return stringListFinds (current, extension, compareString);
212#endif
213}
214
215static bool fileNameMatched (
216 const vString* const vpattern, const char* const fileName)
217{
218 const char* const pattern = vStringValue (vpattern);
219
220#ifdef CASE_INSENSITIVE_FILENAMES
221 {
222 char* const p = newUpperString (pattern);
223 char* const f = newUpperString (fileName);
224 bool r = (fnmatch (p, f, 0) == 0);
225 eFree (f);
226 eFree (p);
227 return r;
228 }
229#else
230 return (fnmatch (pattern, fileName, 0) == 0);
231#endif
232}
233
235 const stringList* const current, const char* const fileName)
236{
237 return stringListFileFinds (current, fileName)? true: false;
238}
239
241 const stringList* const current, const char* const fileName)
242{
243 vString* vstr = NULL;
244 bool matched = false;
245 unsigned int i;
246 const char * normalized = fileName;
247
248#if defined (WIN32)
249 vString *tmp = vStringNewInit (fileName);
251 normalized = vStringValue (tmp);
252#endif
253
254 for (i = 0 ; ! matched && i < stringListCount (current) ; ++i)
255 {
256 vstr = stringListItem (current, i);
257 matched = fileNameMatched (vstr, normalized);
258 }
259
260#if defined (WIN32)
261 vStringDelete (tmp);
262#endif
263
264 return matched? vstr: NULL;
265}
266
267extern void stringListPrint (const stringList *const current, FILE *fp)
268{
269 unsigned int i;
270 Assert (current != NULL);
271 for (i = 0 ; i < ptrArrayCount (current) ; ++i)
272 fprintf (fp, "%s%s", (i > 0) ? ", " : "", vStringValue ((vString *)ptrArrayItem (current, i)));
273}
274
275extern void stringListReverse (const stringList *const current)
276{
277 ptrArrayReverse (current);
278}
#define Assert(c)
Definition: debug.h:47
int fnmatch(char *pattern, char *string, int flags)
Definition: fnmatch.c:48
#define strcasecmp(s1, s2)
Definition: general.h:37
MIO * mio_new_file(const char *filename, const char *mode)
mio_new_file: @filename: Filename to open, same as the fopen()'s first argument @mode: Mode in which ...
Definition: mio.c:234
int mio_eof(MIO *mio)
mio_eof: @mio: A MIO object
Definition: mio.c:1052
int mio_unref(MIO *mio)
mio_unref: @mio: A MIO object
Definition: mio.c:480
unsigned int ptrArrayCount(const ptrArray *const current)
Definition: ptrarray.c:80
void ptrArrayClear(ptrArray *const current)
Definition: ptrarray.c:99
void ptrArrayDeleteItem(ptrArray *const current, unsigned int indx)
Definition: ptrarray.c:157
void ptrArrayCombine(ptrArray *const current, ptrArray *const from)
Definition: ptrarray.c:69
void * ptrArrayItem(const ptrArray *const current, const unsigned int indx)
Definition: ptrarray.c:86
void * ptrArrayLast(const ptrArray *const current)
Definition: ptrarray.c:92
ptrArray * ptrArrayNew(ptrArrayDeleteFunc deleteFunc)
Definition: ptrarray.c:37
void ptrArrayDelete(ptrArray *const current)
Definition: ptrarray.c:111
void * ptrArrayRemoveLast(ptrArray *const current)
Definition: ptrarray.c:59
unsigned int ptrArrayAdd(ptrArray *const current, void *ptr)
Definition: ptrarray.c:47
void ptrArrayReverse(const ptrArray *const current)
Definition: ptrarray.c:143
void(* ptrArrayDeleteFunc)(void *data)
Definition: ptrarray.h:24
#define NULL
Definition: rbtree.h:150
char * readLineRaw(vString *const vLine, MIO *const mio)
Definition: read.c:1016
char * newUpperString(const char *str)
Definition: routines.c:374
void eFree(void *const ptr)
Definition: routines.c:252
#define PATH_SEPARATOR
Definition: routines_p.h:26
#define OUTPUT_PATH_SEPARATOR
Definition: routines_p.h:33
static bool compareStringInsensitive(const char *const string, vString *const itm)
Definition: strlist.c:113
static bool fileNameMatched(const vString *const vpattern, const char *const fileName)
Definition: strlist.c:215
stringList * stringListNew(void)
Definition: strlist.c:27
bool stringListHasTest(const stringList *const current, bool(*test)(const char *s, void *userData), void *userData)
Definition: strlist.c:170
vString * stringListFileFinds(const stringList *const current, const char *const fileName)
Definition: strlist.c:240
void stringListDelete(stringList *const current)
Definition: strlist.c:102
bool stringListDeleteItemExtension(stringList *const current, const char *const extension)
Definition: strlist.c:182
void stringListReverse(const stringList *const current)
Definition: strlist.c:275
void stringListClear(stringList *const current)
Definition: strlist.c:97
void stringListRemoveLast(stringList *const current)
Definition: strlist.c:37
void stringListCombine(stringList *const current, stringList *const from)
Definition: strlist.c:43
stringList * stringListNewFromArgv(const char *const *const argv)
Definition: strlist.c:49
vString * stringListItem(const stringList *const current, const unsigned int indx)
Definition: strlist.c:86
static bool compareString(const char *const string, vString *const itm)
Definition: strlist.c:107
static int stringListIndex(const stringList *const current, const char *const string, bool(*test)(const char *s, vString *const vs))
Definition: strlist.c:119
vString * stringListLast(const stringList *const current)
Definition: strlist.c:92
stringList * stringListNewFromFile(const char *const fileName)
Definition: strlist.c:59
vString * stringListExtensionFinds(const stringList *const current, const char *const extension)
Definition: strlist.c:205
void stringListPrint(const stringList *const current, FILE *fp)
Definition: strlist.c:267
bool stringListExtensionMatched(const stringList *const current, const char *const extension)
Definition: strlist.c:195
bool stringListFileMatched(const stringList *const current, const char *const fileName)
Definition: strlist.c:234
unsigned int stringListCount(const stringList *const current)
Definition: strlist.c:81
static vString * stringListFinds(const stringList *const current, const char *const string, bool(*test)(const char *s, vString *const vs))
Definition: strlist.c:144
void stringListAdd(stringList *const current, vString *string)
Definition: strlist.c:32
bool stringListHasInsensitive(const stringList *const current, const char *const string)
Definition: strlist.c:160
bool stringListHas(const stringList *const current, const char *const string)
Definition: strlist.c:135
MIO:
Definition: mio.c:136
void vStringStripTrailing(vString *const string)
Definition: vstring.c:186
void vStringTranslate(vString *const string, char fromC, char toC)
Definition: vstring.c:394
vString * vStringNew(void)
Definition: vstring.c:70
void vStringDelete(vString *const string)
Definition: vstring.c:60
vString * vStringNewInit(const char *const s)
Definition: vstring.c:90
#define vStringLength(vs)
Definition: vstring.h:31
#define vStringValue(vs)
Definition: vstring.h:28