Nilorea Library

- Main Page
- Data Structures
- Files

- File List
- Globals

All Data Structures Files Functions Variables Typedefs Macros
n_misc.c
Go to the documentation of this file.
1 /*\file n_misc.c
2 *
3 * generic helper functions (usage, memory, strings)
4 *
5 *\author Mickael Castagnier
6 *
7 *\date 2014-04-04
8 */
9
10
11
12 #include "n_misc.h"
13
14
15
22 void usage( char *name )
23 {
24 fprintf( stderr , "Usage: %s [-v] [-V log_level] [-c file.cfg]\n" , name );
25 fprintf( stderr , " -h : print this message\n");
26 fprintf( stderr , " -v : print version and exit\n");
27 fprintf( stderr , " -V log_level: console no fork mode, with as high as log_level logging\n" );
28 fprintf( stderr , " Values by ascending prioity: NOLOG,VERBOSE,NOTICE,ERROR,DEBUG\n" );
29 fprintf( stderr , " -c file.cfg : specify a config file.\n If no config file, take getwdir()/conf/%s.cfg\n" , name );
30 }
31
32
39 char** split(char* chaine,const char* delim,int vide){
40
41 char **tab=NULL ; //tableau de chaine, tableau resultat
42 char *ptr = NULL ; //pointeur sur une partie de
43 int sizeStr = 0 ; //taille de la chaine à recupérer
44 int sizeTab = 0 ; //taille du tableau de chaine
45 char *largestring = NULL ; //chaine à traiter
46
47 int sizeDelim=strlen( delim ); //taille du delimiteur
48
49 if( !chaine )
50 {
51 log( ERROR , "Function parameter char *chaine == NULL at line %d of %s" , __LINE__ , __FILE__ );
52 return NULL;
53 }
54
55 if( !delim )
56 {
57 log( ERROR , "Function parameter char *delim == NULL at line %d of %s" , __LINE__ , __FILE__ );
58 return NULL;
59 }
60
61
62 largestring = chaine; //comme ca on ne modifie pas le pointeur d'origine
63
64 while( ( ptr = strstr( largestring , delim ) ) != NULL )
65 {
66 sizeStr=ptr-largestring;
67 //si la chaine trouvé n'est pas vide ou si on accepte les chaine vide
68 if(vide==1 || sizeStr!=0)
69 {
70 //on alloue une case en plus au tableau de chaines
71 sizeTab++;
72 tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
73
74 //on alloue la chaine du tableau
75 Malloc( tab[sizeTab-1] , char , (int)(sizeof(char)*(sizeStr+2)) );
76 strncpy(tab[sizeTab-1],largestring,sizeStr);
77 tab[sizeTab-1][sizeStr]='\0';
78 }
79
80 //on decale le pointeur largestring pour continuer la boucle apres le premier elément traiter
81 ptr=ptr+sizeDelim;
82 largestring=ptr;
83 }
84
85 //si la chaine n'est pas vide, on recupere le dernier "morceau"
86 if(strlen(largestring)!=0)
87 {
88 sizeStr=strlen(largestring);
89 sizeTab++;
90 tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
91 Malloc( tab[sizeTab-1] , char ,(int)( sizeof(char)*(sizeStr+2) ) );
92 strncpy(tab[sizeTab-1],largestring,sizeStr);
93 tab[sizeTab-1][sizeStr]='\0';
94 }
95 else
96 {
97 if(vide==1) //si on fini sur un delimiteur et si on accepte les mots vides,on ajoute un mot vide
98 {
99 sizeTab++;
100 tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
101 Malloc( tab[sizeTab-1] , char , (int)(sizeof(char)*2) );
102 tab[sizeTab-1][0]='\0';
103 }
104 }
105
106 //on ajoute une case à null pour finir le tableau
107 sizeTab++;
108 tab= (char**) realloc(tab,sizeof(char*)*sizeTab);
109 tab[sizeTab-1]=NULL;
110
111 return tab;
112 }
113
114
115
124 int free_split_result( char ***tab )
125 {
126 char **tmptab = (*tab);
127 int it = 0 ;
128
129 while( tmptab[ it ] )
130 {
131 Free( tmptab[ it ] );
132 it++;
133 }
134 Free( tmptab );
135
136 return TRUE ;
137 }/* free_split_result(...)*/