source: branches/3.2/mondo/src/lib/mr_str.c @ 3194

Last change on this file since 3194 was 3194, checked in by Bruno Cornec, 7 years ago
  • Fix all compilation/link error due to the previous giant merge with 3.1. 3.2 is ready to test
  • Property svn:eol-style set to native
File size: 4.9 KB
Line 
1/*
2 * $Id$
3 *
4 * New generation of string handling functions safe from a memory management point of view
5 * Developped by Andree Leidenfrost
6 */
7
8#include <stdlib.h>
9#include <stdio.h>
10#include <string.h>
11#include <time.h>
12
13#include "mr_mem.h"
14
15// to get bool type
16#define _MY_STUFF_H_
17#include "my-stuff.h"
18 
19/**
20 * Safe alternative to standard function strtok()
21 * @param instr
22 * @param delims
23 * @param lastpos
24 * @return @p
25 * @note this function allocates memory that needs to be freed by caller
26 **/
27char *mr_strtok(char *instr, const char *delims, int *lastpos)
28{
29
30    char *token = NULL;
31    char *strptr = NULL;
32    size_t pos1 = 0;
33    size_t pos2 = 0;
34
35    if (instr == NULL) {
36        *lastpos = 0;
37        return token;
38    }
39
40    if (delims == NULL) {
41        *lastpos = 0;
42        return token;
43    }
44
45    if (strlen(instr) <= *lastpos) {
46        *lastpos = 0;
47        return token;
48    }
49
50    strptr = instr + *lastpos;
51    pos2 = strspn(strptr, delims);
52    strptr += pos2;
53    pos1 = strcspn(strptr, delims);
54    token = (char *)mr_malloc(sizeof(*token) * (pos1 + 1));
55    strncpy(token, strptr, pos1);
56    token[pos1] = '\0';
57    *lastpos = *lastpos + pos1 + pos2 + 1;
58
59    return token;
60}
61
62
63/**
64 * Returns the string fed to it 'inptr' with all characters to escape given
65 * in 'toesc' prepended by escaping character 'escchr'.
66 * (Prepare strings for use in system() or popen() with this function.)
67 * @param instr
68 * @param toesc
69 * @param escchr
70 * @note this function allocates memory that needs to be freed by caller
71 **/
72char *mr_stresc(char *instr, char *toesc, const char escchr, const char specialchr) {
73    char *inptr = NULL;
74    char *retstr = NULL;
75    char *retptr = NULL;
76    char *escptr = NULL;
77    int cnt = 0;
78    bool found = FALSE;
79
80    inptr = instr;
81    // Count how many characters need escaping.
82    while (*inptr != '\0') {
83        escptr = toesc;
84        while (*escptr != '\0') {
85            if (*inptr == *escptr) {
86                // Found it, skip the rest.
87                cnt++;
88                // if specialchar (' or ") then replace it with '\'' or "\"" so adds 2 chars
89                if (*inptr == specialchr) {
90                    cnt += 2;
91                }
92                break;
93            }
94            escptr++;
95        }
96        inptr++;
97    }
98
99    inptr = instr;
100    retstr = (char *) mr_malloc(strlen(inptr) + cnt + 1);
101    retptr = retstr;
102
103    // Prepend specified characters with escape character.
104    while (*inptr != '\0') {
105        escptr = toesc;
106        while (*escptr != '\0') {
107            if (*inptr == *escptr) {
108                // Found it, skip the rest.
109                // if specialchar (' or ") then replace it with '\'' or "\"" so adds 2 chars
110                if (*inptr == specialchr) {
111                    *retptr = specialchr;
112                    retptr++;
113                    *retptr = escchr;
114                    retptr++;
115                    found = TRUE;
116                } else {
117                    *retptr = escchr;
118                    retptr++;
119                }
120                break;
121            }
122            escptr++;
123        }
124        *retptr = *inptr;
125        retptr++;
126        inptr++;
127        if (found) {
128            // finish to put the remaining specialchr
129            *retptr = specialchr;
130            retptr++;
131            found = FALSE;
132        }
133    }
134    *retptr = '\0';
135
136    return retstr;
137}
138
139/* Return a string containing the date */
140char *mr_date(void) {
141   
142    time_t tcurr;
143
144    tcurr = time(NULL);
145    return(ctime(&tcurr));
146}
147
148/* Return an allocated string containing the date
149char *mr_date(void) {
150   
151    time_t tcurr;
152    char *tmp = NULL;
153
154    tcurr = time(NULL);
155    mr_asprintf(tmp, "%s", ctime(&tcurr));
156    mr_chomp(tmp);
157    return(tmp);
158}
159 */
160
161/**
162 * Remove all characters whose ASCII value is less than or equal to 32
163 * (spaces and control characters) from both sides of @p in_out.
164 * @param in_out The string to strip spaces/control characters from (modified).
165 */
166void mr_strip_spaces(char *in_out) {
167    int i = 0;
168    int j = 0;
169    size_t length;
170
171    if (in_out == NULL) {
172        return;
173    }
174    length = strlen(in_out);
175
176    /* Skip initial spaces and special chars */
177    for (i = 0; in_out[i] <= ' ' && i < (int)length ; i++);
178    /* Shift the string to the begining if needed */
179    if (i != 0) {
180        for (j = 0; i < (int)length ; i++, j++) {
181            in_out[j] = in_out[i];
182        }
183        /* Erase the end of the string if needed */
184        j++;
185        in_out[j] = '\0';
186    }
187
188    /* Skip final spaces and special chars */
189    for (i = (int)strlen(in_out) - 1; i >= 0  && in_out[i] <= ' '; i--);
190
191    /* The string now ends after that char */
192    i++;
193    in_out[i] = '\0';
194}
195
196
197/*
198 * Remove '\n' char from both sides of @p in_out.
199 * @param in_out The string to strip characters from (modified).
200
201void mr_chomp(char *in_out) {
202
203    mr_strip_char(in_out, "\n");
204}
205*/
206
207/**
208 * Remove all characters in caracs from begining and end of string @p in_out
209 * @param in_out The string to strip char characters from (modified).
210
211void mr_strip_char(char *in_out, char *caracs) {
212    int i = 0;
213    int j = 0;
214    size_t length = 0;
215
216    if (caracs == NULL) {
217        return;
218    }
219    if (in_out == NULL) {
220        return;
221    }
222    length = strlen(in_out);
223
224    // Skip initial caracs
225    for (i = 0; index(caracs, in_out[i]) != NULL && i < (int)length ; i++);
226
227    // Shift the string to the begining if needed
228    if (i != 0) {
229        for (j = 0; i < (int)length ; i++, j++) {
230            in_out[j] = in_out[i];
231        }
232        // Erase the end of the string if needed
233        j++;
234        in_out[j] = '\0';
235    }
236
237    // Skip final caracs
238    for (i = (int)strlen(in_out) - 1; i >= 0  && index(caracs, in_out[i]) != NULL; i--);
239
240    // The string now ends after that char
241    i++;
242    in_out[i] = '\0';
243}
244*/
245
Note: See TracBrowser for help on using the repository browser.