zuluCrypt  5.7.1
About: zuluCrypt is a simple but feature rich solution for hard drives encryption. It can manage PLAIN dm-crypt, LUKS, TrueCrypt and VeraCrypt encrypted volumes.
  Fossies Dox: zuluCrypt-5.7.1.tar.xz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

StringList.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2011-2015
4  * name : Francis Banyikwa
5  * email: mhogomchungu@gmail.com
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 #ifndef STRINGLISTTYPE
20 #define STRINGLISTTYPE
21 
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 #include "String.h"
27 #include <stdarg.h>
28 
29 /*
30  * stringList_t is a type to be used as a handle with these functions
31  *
32  * this library implements a an array of strings_t type dynamically and add other functionality
33  *
34  */
35 typedef struct StringListType * stringList_t ;
36 
37 /*
38  * create a custom type to represent a stringList_t pointing to NULL while hiding the pointer nature of stringList_t
39  * string_t is an opaque handle and NULL assignment "gives unnecessary info" about its nature.
40  */
41 #define StringListVoid ( ( stringList_t ) 0 )
42 
43 /*
44  * an STL style iterator type
45  */
47 
48 /*
49  * returns a pointer to the memory block occupying the first element on the list
50  */
52 
53 /*
54  * returns a pointer to a memory block past the end of the array,STL style
55  */
57 
58 /*
59  * set iterator begin and iterator end
60  */
62 
63 /*
64  * call a function with a signature void foo( string_t ) on each entry in the list
65  */
66 void StringListForEach( stringList_t stl,void (*)( string_t ) ) ;
67 
68 /*
69  * call a function with a signature void foo( string_t,void * ) on each entry in the list
70  * The third argument will be passed on to the function specified in the second argument
71  */
72 void StringListForEach_1( stringList_t stl,void (*)( string_t,void * ),void * ) ;
73 
74 /*
75  * call a function with a signature void foo( const char *,void * ) on each entry in the list
76  * The third argument will be passed on to the function specified in the second argument
77  */
78 void StringListForEachString_1( stringList_t stl,void (*)( const char *,void * ),void * ) ;
79 
80 /*
81  * call a function with a signature void foo( const char * ) on each entry in the list
82  */
83 void StringListForEachString( stringList_t stl,void (*)( const char * ) ) ;
84 
85 /*
86  * Takes a pointer to a function to be called when memory allocation can not take place
87  * ie if the system has run out of memory and malloc() or realloc() has failed.
88  * This function is optional and "StringListVoid" will be returned on memory exaustion if the function
89  * isnt set.
90  */
91 void StringListExitOnMemoryExaustion( void (*)( void ) ) ;
92 
93 /*
94  * create stringlist handle with a C string. All stringlist operations should happen through this handle
95  */
96 stringList_t StringList( const char * cstring ) ;
97 
98 /*
99  * create stringlist handle with a string_t. All stringlist operations should happen through this handle
100  * this function will take ownership of st,invalidating the handle after auto deleting its contents
101  */
103 
104 /*
105  * create a stringList_t object with empty content
106  */
108 
109 /*
110  * Create a StringList object with arraySize string_t "slots" and expose them for easier assignment of multiple string_t objects.
111  *
112  * example use case
113  * stringList_t stl ;
114  * string_t * x = StringListArray( &stl,3 ) ;
115  * x[0] = String( "abc" ) ;
116  * x[1] = String( "def" ) ;
117  * x[2] = String( "ghi" ) ;
118  * ...
119  * ...
120  * NOTE:This is a dangerous function as it does not guard against StringVoid.
121  * Assign StringVoid and segfault will surely happen sooner or later.
122  */
123 string_t * StringListArray( stringList_t *,size_t arraySize ) ;
124 
125 /*
126  * Return the number of elements in the list
127  */
128 size_t StringListSize( stringList_t stl ) ;
129 
130 /*
131  * create a stringlist from splitted cstring using splitter as a splitting trigger.
132  */
133 stringList_t StringListSplit( const char * cstring,char splitter ) ;
134 
135 /*
136  * add a new spot at the end of stringList_t object and return its position.
137  *
138  * eg usage:
139  * string_t * p = StringListAssign( stl ) ;
140  * *p = String( "abc" ) ;
141  *
142  * another way of doing the same thing:
143  * string_t p = StringListAssignString( stl,String( "abc" ) ) ;
144  * NOTE:This is a dangerous function as it does not guard against StringVoid.
145  * Assign StringVoid and segfault will surely happen sooner or later.
146  */
148 
149 /*
150  * add a string_t objest to the end of stringList_t object
151  * string_t object passed is returned on success,StringVoid is return otherwise
152  */
154 
155 /*
156  * create a stringlist from string_t using splitter as a splitting trigger.
157  */
158 stringList_t StringListStringSplit( string_t st,char splitter ) ;
159 
160 /*
161  * return a string_t element at position index.
162  * First element is at position 0.
163  */
164 string_t StringListStringAt( stringList_t stl,size_t index ) ;
165 
167 {
168  return StringListStringAt(stl,0 ) ;
169 }
170 
172 {
173  return StringListStringAt(stl,1 ) ;
174 }
175 
176 /*
177  * return a pointer to a string at position index.
178  * First element is at position 0. *
179  */
180 const char * StringListContentAt( stringList_t stl,size_t index ) ;
181 
182 static __inline__ const char * StringListContentAtFirstPlace( stringList_t stl )
183 {
184  return StringListContentAt( stl,0 ) ;
185 }
186 
187 static __inline__ const char * StringListContentAtSecondPlace( stringList_t stl )
188 {
189  return StringListContentAt( stl,1 ) ;
190 }
191 
192 static __inline__ const char * StringListContentAtThirdPlace( stringList_t stl )
193 {
194  return StringListContentAt( stl,2 ) ;
195 }
196 
197 /*
198  * strcmp() a strinf at index with cstring
199  */
200 int StringListContentAtEqual( stringList_t stl,size_t index,const char * cstring ) ;
201 
202 /*
203  * printf() string content at a given index
204  */
205 void StringListPrintAt( stringList_t stl,size_t index ) ;
206 
207 /*
208  * printf() all elements in the list,one line per element
209  */
210 void StringListPrintList( stringList_t stl ) ;
211 
212 /*
213  * printf() with a new line string content at a given index
214  */
215 void StringListPrintLineAt( stringList_t stl,size_t index ) ;
216 
217 /*
218  * return a pointer to a string at the last elenent in the list.
219  */
220 const char * StringListContentAtLast( stringList_t stl ) ;
221 
222 /*
223  * return a string_t at the last elenent in the list.
224  */
226 
227 /*
228  * return an index position of an element with cstring.
229  * return -1 if there is no element in the list with the string.
230  */
231 ssize_t StringListContains( stringList_t stl,const char * cstring ) ;
232 
233 /*
234  * return 1 if the managed list has atleast one cstring entry
235  */
236 static int StringListHasEntry( stringList_t stl,const char * cstring ) ;
237 
238 /*
239  * return 1 if the managed list has no cstring entry
240  */
241 static int StringListHasNoEntry( stringList_t stl,const char * cstring ) ;
242 
243 /*
244  * return an index position of the first string_t object in the stringList_t object with a character
245  * sequence str ;
246  * return -1 if no such sequence exist
247  */
248 ssize_t StringListHasSequence( stringList_t stl,const char * str ) ;
249 
250 /*
251  * return the first string_t object in the stringList_t object with a character
252  * sequence str ;
253  * return StringVoid if no such sequence exist
254  */
255 string_t StringListHasSequence_1( stringList_t stl,const char * str ) ;
256 
257 /*
258  * return an index position of the first string_t object in the stringList_t object with a character
259  * sequence that starts with str ;
260  * return -1 if no such sequence exist
261  */
262 ssize_t StringListHasStartSequence( stringList_t stl,const char * str ) ;
263 
264 /*
265  * return the first string_t object in the stringList_t object with a character
266  * sequence that starts with str ;
267  * return StringVoid if no such sequence exist
268  */
269 string_t StringListHasStartSequence_1( stringList_t stl,const char * str ) ;
270 
271 /*
272  * append an entry into the list.
273  * if stl == NULL, then the function call is the same as "StringList( cstring )"
274  */
275 stringList_t StringListAppend( stringList_t stl,const char * cstring ) ;
276 
277 /*
278  * append an entry into the list if the entry is not already in the list
279  * if stl == NULL, then the function call is the same as "StringList( cstring )"
280  */
281 stringList_t StringListAppendIfAbsent( stringList_t stl,const char * cstring ) ;
282 
283 /*
284  * append an entry into the list and take ownership of it.
285  * if stl == NULL, then the function call is the same as "StringList( cstring )"
286  */
288 
289 /*
290  * append an entry into the list.
291  * if stl == NULL, then the function call is the same as "StringList( cstring )"
292  */
294 
295 /*
296  * append an entry into the list by taking only len characters from the string.
297  * if stl == NULL, then the function call is the same as "StringList( cstring )"
298  */
299 stringList_t StringListAppendSize( stringList_t stl,const char * cstring,size_t len ) ;
300 
301 /*
302  * Append a stringList_t on the second argument to stringList_t on the first argument
303  * return the stringList_t on the first argument
304  */
306 
307 /*
308  * prepend an entry into the list
309  * if stl == NULL then the function is the same as "StringList( cstring )"
310  */
311 stringList_t StringListPrepend( stringList_t stl,const char * cstring ) ;
312 
313 /*
314  * prepend an entry into the list by taking len characters from the string.
315  * if stl == NULL then the function is the same as "StringList( cstring )"
316  */
317 stringList_t StringListPrependSize( stringList_t stl,const char * cstring,size_t len ) ;
318 
319 /*
320  * insert an element as position index.
321  * the first position is at position 0
322  * if index == size of the list,the operations will have the same effect as appending the entry to the end of the list
323  */
324 stringList_t StringListInsertAt( stringList_t stl,const char * cstring,size_t index ) ;
325 
326 /*
327  * insert string_t as position index.
328  * the first position is at position 0
329  *
330  * this function will take ownership of st,invalidating the handle after auto deleting its contents
331  * * if index == size of the list,the operations will have the same effect as appending the entry to the end of the list
332  */
334 
335 /*
336  * insert an element as position index by taking only len characters from the string
337  * the first position is at position 0
338  * if index == size of the list,the operations will have the same effect as appending the entry to the end of the list
339  */
340 stringList_t StringListInsertAtSize( stringList_t stl,const char * cstring,size_t len, size_t index ) ;
341 
342 /*
343  * remove an entry from the list bt deleting it
344  * the first position is at position 0
345  */
346 stringList_t StringListRemoveAt( stringList_t stl, size_t index ) ;
347 
348 /*
349  * Remove a string "at" iterator is pointing to,the end iterator will be adjusted to reflect
350  * the removed item
351  * NOTE:arguments are not checked for validity
352  */
354 
355 /*
356  * go through every string in the list and remove all strings that starts with str
357  * returned value is the number of elements removed
358  */
359 size_t StringListRemoveIfStringStartsWith( stringList_t stl,const char * str ) ;
360 
361 /*
362  * go through every string in the list and remove all strings has str character sequence
363  * returned value is the number of elements removed
364  */
365 size_t StringListRemoveIfStringContains( stringList_t stl,const char * str ) ;
366 
367 /*
368  * remove a string_t object from the managed list if it manages string str.
369  * this function is to be used if there maybe multiple occurances of the string.
370  * If there is atmost one entry,then StringListRemoveString() is a function to use.
371  */
372 size_t StringListRemoveIfPresent( stringList_t stl,const char * str ) ;
373 
374 /*
375  * remove a string_t object from the managed list if it is found.
376  * this function is to be used if there maybe multiple occurances of the string.
377  */
379 
380 /*
381  * remove an entry from the list at position index and "let it free",the detached entry is now a fully fledged string_t object.
382  * the first position is at position 0
383  */
384 string_t StringListDetachAt( stringList_t stl, size_t index ) ;
385 
386 /*
387  * remember to clean after yourself
388  * when function return, stl will point to NULL
389  */
390 void StringListDelete( stringList_t * stl ) ;
391 
392 /*
393  * returns NULL terminated array of strings( char * argv[] ) composed of strings managed by the stringlist
394  * NULL is returned on error.
395  * NOTE: remember to free() the returned value but DONOT free its content.
396  */
397 char * const * StringListStringArray( stringList_t ) ;
398 
399 /*
400  * returns the restult of StringListStringArray() but with a different cast
401  */
402 static __inline__ const char * const * StringListStringArray_0( stringList_t stl )
403 {
404  return ( const char * const * ) StringListStringArray( stl ) ;
405 }
406 
407 /*
408  * It does what the above does but it reuses the buffer and hence its better if the function is called
409  * multiple times.
410  * second argument will hold the size of the buffer without counting the NULL terminator
411  * The two first arguments must be initilized to example values
412  * NOTE: remember to free() the first argument but DONOT free its content.
413  * Example usage
414  * char * const * buffer = NULL ;
415  * size_t buffer_size = 0 ;
416  * stringList_t stl = StringList( "abc" ) ;
417  * StringListStringArray_1( &buffer,&buffer_size,stl ) ;
418  * puts( buffer[0] ) ;
419  */
420 void StringListStringArray_1( char * const **,size_t *,stringList_t ) ;
421 
422 /*
423  * remember to clean after yourself
424  * overwite string objects as they are cleaned up
425  */
426 void StringListClearDelete( stringList_t * stl ) ;
427 
428 /*
429  * delete multiple stringList_t * objects.
430  * NOTE; The last element on the argument list must be '\0'
431  */
432 void StringListMultipleDelete( stringList_t * stl,... ) __attribute__ ( ( sentinel ) ) ;
433 
434 /*
435  * find the first element with cstring and remove it and return the position of where the element was.
436  * return -1 when there is no element in the list with cstring.
437  * call the function repeatedly until you get -1 if elements can repeat.
438  */
439 ssize_t StringListRemoveString( stringList_t stl,const char * cstring ) ;
440 
441 /*
442  * add a cstring to the list and take it over( own it )
443  * cstring will be NULL on function return.
444  * cstring must be created will malloc.
445  * s is the size of the string
446  * l is the size of the buffer holding the string
447  */
448 stringList_t StringListAppendWithSize( stringList_t stl,char ** cstring,size_t s,size_t l ) ;
449 
450 /*
451  * create a stringlist with cstring and take it over( own it )
452  * cstring will point to NULL on function return.
453  * cstring must be created with malloc.
454  * s is the size of the string
455  * l is the size of the buffer holding the string
456  */
457 stringList_t StringListWithSize( char ** cstring,size_t s,size_t l ) ;
458 
459 /*
460  * returns a copy of a string list
461  */
463 
464 /*
465  * make a string_t copy of a string at position pos
466  * first position is at pos = 0
467  */
469 
471 {
472  return StringListCopyStringAt( stl,0 ) ;
473 }
474 
476 {
477  return StringListCopyStringAt( stl,1 ) ;
478 }
479 
480 static __inline__ int StringListHasEntry( stringList_t stl,const char * cstring )
481 {
482  return StringListContains( stl,cstring ) != -1 ;
483 }
484 
485 static __inline__ int StringListHasNoEntry( stringList_t stl,const char * cstring )
486 {
487  return StringListContains( stl,cstring ) == -1 ;
488 }
489 
490 /*
491  * move entry at position x to position y and entry at position y to position x *
492  * first entry is at position 0.
493  */
494 stringList_t StringListSwap( stringList_t stl, size_t x,size_t y ) ;
495 
496 #ifdef __cplusplus
497 }
498 #endif
499 
500 #endif
StringListContentAt
const char * StringListContentAt(stringList_t stl, size_t index)
Definition: StringList.c:501
StringListStringArray_1
void StringListStringArray_1(char *const **, size_t *, stringList_t)
Definition: StringList.c:943
StringListAppendSize
stringList_t StringListAppendSize(stringList_t stl, const char *cstring, size_t len)
Definition: StringList.c:368
StringListStringAt
string_t StringListStringAt(stringList_t stl, size_t index)
Definition: StringList.c:1171
StringListHasEntry
static int StringListHasEntry(stringList_t stl, const char *cstring)
Definition: StringList.h:480
StringListContentAtSecondPlace
static const __inline__ char * StringListContentAtSecondPlace(stringList_t stl)
Definition: StringList.h:187
StringListRemoveIfPresent_1
size_t StringListRemoveIfPresent_1(stringList_t stl, string_t st)
Definition: StringList.c:1025
StringListAppendList
stringList_t StringListAppendList(stringList_t, stringList_t)
Definition: StringList.c:393
StringListAssign
string_t * StringListAssign(stringList_t)
Definition: StringList.c:221
StringListContentAtFirstPlace
static const __inline__ char * StringListContentAtFirstPlace(stringList_t stl)
Definition: StringList.h:182
StringListDetachAt
string_t StringListDetachAt(stringList_t stl, size_t index)
Definition: StringList.c:1135
StringListHasStartSequence
ssize_t StringListHasStartSequence(stringList_t stl, const char *str)
Definition: StringList.c:869
StringListInsertAt
stringList_t StringListInsertAt(stringList_t stl, const char *cstring, size_t index)
Definition: StringList.c:553
StringListRemoveString
ssize_t StringListRemoveString(stringList_t stl, const char *cstring)
Definition: StringList.c:1160
StringListContains
ssize_t StringListContains(stringList_t stl, const char *cstring)
Definition: StringList.c:806
StringListPrependSize
stringList_t StringListPrependSize(stringList_t stl, const char *cstring, size_t len)
Definition: StringList.c:728
StringListClearDelete
void StringListClearDelete(stringList_t *stl)
Definition: StringList.c:1216
StringListSize
size_t StringListSize(stringList_t stl)
Definition: StringList.c:492
StringListMultipleDelete
void StringListMultipleDelete(stringList_t *stl,...)
Definition: StringList.c:1249
StringListHasNoEntry
static int StringListHasNoEntry(stringList_t stl, const char *cstring)
Definition: StringList.h:485
StringListContentAtLast
const char * StringListContentAtLast(stringList_t stl)
Definition: StringList.c:527
StringListRemoveIfStringStartsWith
size_t StringListRemoveIfStringStartsWith(stringList_t stl, const char *str)
Definition: StringList.c:984
StringListContentAtEqual
int StringListContentAtEqual(stringList_t stl, size_t index, const char *cstring)
Definition: StringList.c:514
StringListPrintLineAt
void StringListPrintLineAt(stringList_t stl, size_t index)
Definition: StringList.c:1343
StringListExitOnMemoryExaustion
void StringListExitOnMemoryExaustion(void(*)(void))
Definition: StringList.c:54
StringListSwap
stringList_t StringListSwap(stringList_t stl, size_t x, size_t y)
Definition: StringList.c:1319
StringListIterator
string_t * StringListIterator
Definition: StringList.h:46
StringListGetIterators
void StringListGetIterators(stringList_t, StringListIterator *begin, StringListIterator *end)
Definition: StringList.c:210
StringListPrintList
void StringListPrintList(stringList_t stl)
Definition: StringList.c:1352
StringListContentAtThirdPlace
static const __inline__ char * StringListContentAtThirdPlace(stringList_t stl)
Definition: StringList.h:192
StringListStringAtFirstPlace
static __inline__ string_t StringListStringAtFirstPlace(stringList_t stl)
Definition: StringList.h:166
StringListAssignString
string_t StringListAssignString(stringList_t, string_t)
Definition: StringList.c:268
StringListString
stringList_t StringListString(string_t *)
Definition: StringList.c:647
StringListInit
stringList_t StringListInit(void)
Definition: StringList.c:293
StringListHasSequence_1
string_t StringListHasSequence_1(stringList_t stl, const char *str)
Definition: StringList.c:858
StringListArray
string_t * StringListArray(stringList_t *, size_t arraySize)
Definition: StringList.c:244
StringListForEachString_1
void StringListForEachString_1(stringList_t stl, void(*)(const char *, void *), void *)
Definition: StringList.c:122
StringType
Definition: String.c:49
StringListForEachString
void StringListForEachString(stringList_t stl, void(*)(const char *))
Definition: StringList.c:103
StringListCopyStringAt
string_t StringListCopyStringAt(stringList_t, size_t pos)
Definition: StringList.c:1308
StringListForEach
void StringListForEach(stringList_t stl, void(*)(string_t))
Definition: StringList.c:65
StringListAppendIfAbsent
stringList_t StringListAppendIfAbsent(stringList_t stl, const char *cstring)
Definition: StringList.c:794
StringListHasSequence
ssize_t StringListHasSequence(stringList_t stl, const char *str)
Definition: StringList.c:832
StringListStringAtLast
string_t StringListStringAtLast(stringList_t stl)
Definition: StringList.c:540
StringListWithSize
stringList_t StringListWithSize(char **cstring, size_t s, size_t l)
Definition: StringList.c:313
StringListCopy
stringList_t StringListCopy(stringList_t stl)
Definition: StringList.c:1269
StringListAppendString_1
void StringListAppendString_1(stringList_t *stl, string_t *)
Definition: StringList.c:659
StringListStringAtSecondPlace
static __inline__ string_t StringListStringAtSecondPlace(stringList_t stl)
Definition: StringList.h:171
StringListPrintAt
void StringListPrintAt(stringList_t stl, size_t index)
Definition: StringList.c:1334
StringListCopyStringAtFirstPlace
static __inline__ string_t StringListCopyStringAtFirstPlace(stringList_t stl)
Definition: StringList.h:470
StringListType
Definition: StringList.c:33
StringListRemoveAt
stringList_t StringListRemoveAt(stringList_t stl, size_t index)
Definition: StringList.c:1109
StringListSplit
stringList_t StringListSplit(const char *cstring, char splitter)
Definition: StringList.c:428
StringListStringSplit
stringList_t StringListStringSplit(string_t st, char splitter)
Definition: StringList.c:483
StringListRemoveIfStringContains
size_t StringListRemoveIfStringContains(stringList_t stl, const char *str)
Definition: StringList.c:1070
String.h
StringList
stringList_t StringList(const char *cstring)
Definition: StringList.c:157
stringList_t
struct StringListType * stringList_t
Definition: StringList.h:35
StringListRemoveAt_1
void StringListRemoveAt_1(stringList_t stl, StringListIterator at, StringListIterator *end)
Definition: StringList.c:1129
StringListCopyStringAtSecondPlace
static __inline__ string_t StringListCopyStringAtSecondPlace(stringList_t stl)
Definition: StringList.h:475
StringListStringArray_0
static const __inline__ char *const * StringListStringArray_0(stringList_t stl)
Definition: StringList.h:402
StringListAppend
stringList_t StringListAppend(stringList_t stl, const char *cstring)
Definition: StringList.c:763
StringListAppendWithSize
stringList_t StringListAppendWithSize(stringList_t stl, char **cstring, size_t s, size_t l)
Definition: StringList.c:341
StringListPrepend
stringList_t StringListPrepend(stringList_t stl, const char *cstring)
Definition: StringList.c:754
StringListBegin
StringListIterator StringListBegin(stringList_t)
Definition: StringList.c:192
StringListStringInsertAt
stringList_t StringListStringInsertAt(stringList_t stl, string_t *, size_t index)
Definition: StringList.c:674
StringListInsertAtSize
stringList_t StringListInsertAtSize(stringList_t stl, const char *cstring, size_t len, size_t index)
Definition: StringList.c:684
StringListDelete
void StringListDelete(stringList_t *stl)
Definition: StringList.c:1184
StringListForEach_1
void StringListForEach_1(stringList_t stl, void(*)(string_t, void *), void *)
Definition: StringList.c:84
StringListEnd
StringListIterator StringListEnd(stringList_t)
Definition: StringList.c:201
StringListStringArray
char *const * StringListStringArray(stringList_t)
Definition: StringList.c:908
StringListRemoveIfPresent
size_t StringListRemoveIfPresent(stringList_t stl, const char *str)
Definition: StringList.c:1030
StringListHasStartSequence_1
string_t StringListHasStartSequence_1(stringList_t stl, const char *str)
Definition: StringList.c:897
StringListAppendString
stringList_t StringListAppendString(stringList_t stl, string_t)
Definition: StringList.c:419