source: MondoRescue/branches/3.3/mondo/src/lib/mr_str.c@ 3641

Last change on this file since 3641 was 3641, checked in by Bruno Cornec, 7 years ago
  • Finalize fix for #644 by removing the last MAX_STR_LEN usage in the function running commands. Everything on the exclude line should now be handle dynamically.
  • Property svn:eol-style set to native
File size: 5.3 KB
RevLine 
[1054]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
[1924]8#include <stdlib.h>
[1054]9#include <stdio.h>
10#include <string.h>
[1087]11#include <time.h>
[1054]12
13#include "mr_mem.h"
[3171]14
15// to get bool type
16#define _MY_STUFF_H_
17#include "my-stuff.h"
[1054]18
19/**
[1594]20 * Safe alternative to standard function strtok()
[1054]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 **/
[3614]27char *mr_strtok(char *instr, const char *delims, int *lastpos) {
[1054]28
[3614]29char *token = NULL;
30char *strptr = NULL;
31size_t pos1 = 0;
32size_t pos2 = 0;
[1054]33
[3614]34if (instr == NULL) {
35 *lastpos = 0;
36 return token;
37}
[2970]38
[3614]39if (delims == NULL) {
40 *lastpos = 0;
41 return token;
42}
[2972]43
[3614]44if (strlen(instr) <= *lastpos) {
45 *lastpos = 0;
46 return token;
47}
[1054]48
[3614]49strptr = instr + *lastpos;
50pos2 = strspn(strptr, delims);
51strptr += pos2;
52pos1 = strcspn(strptr, delims);
53token = (char *)mr_malloc(sizeof(*token) * (pos1 + 1));
54strncpy(token, strptr, pos1);
55token[pos1] = '\0';
56*lastpos = *lastpos + pos1 + pos2 + 1;
[1054]57
[3614]58return token;
[1054]59}
60
61
62/**
63 * Returns the string fed to it 'inptr' with all characters to escape given
64 * in 'toesc' prepended by escaping character 'escchr'.
65 * (Prepare strings for use in system() or popen() with this function.)
66 * @param instr
67 * @param toesc
68 * @param escchr
69 * @note this function allocates memory that needs to be freed by caller
70 **/
[3171]71char *mr_stresc(char *instr, char *toesc, const char escchr, const char specialchr) {
[1054]72
[3614]73char *inptr = NULL;
74char *retstr = NULL;
75char *retptr = NULL;
76char *escptr = NULL;
77int cnt = 0;
78bool found = FALSE;
79
80inptr = instr;
81// Count how many characters need escaping.
82while (*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;
[1054]91 }
[3614]92 break;
[1054]93 }
[3614]94 escptr++;
[1054]95 }
[3614]96 inptr++;
97}
[3171]98
[3614]99inptr = instr;
100retstr = (char *) mr_malloc(strlen(inptr) + cnt + 1);
101retptr = retstr;
[1054]102
[3614]103// Prepend specified characters with escape character.
104while (*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++;
[1054]119 }
[3614]120 break;
[1054]121 }
[3614]122 escptr++;
123 }
124 *retptr = *inptr;
125 retptr++;
126 inptr++;
127 if (found) {
128 // finish to put the remaining specialchr
129 *retptr = specialchr;
[1054]130 retptr++;
[3614]131 found = FALSE;
[1054]132 }
[3614]133}
134*retptr = '\0';
[1054]135
[3614]136return(retstr);
[1054]137}
[1087]138
139/* Return a string containing the date */
140char *mr_date(void) {
141
[3614]142time_t tcurr;
143
144tcurr = time(NULL);
145return(ctime(&tcurr));
[1087]146}
147
[3193]148/* Return an allocated string containing the date
149char *mr_date(void) {
150
151 time_t tcurr;
152 char *tmp = NULL;
[1168]153
[3193]154 tcurr = time(NULL);
155 mr_asprintf(tmp, "%s", ctime(&tcurr));
156 mr_chomp(tmp);
157 return(tmp);
158}
159 */
160
[1168]161/**
162 * Remove all characters whose ASCII value is less than or equal to 32
[3614]163 * (spaces and control characters) from both sides of @p instr.
164 * @param instr The string to strip spaces/control characters from
165 * returns a newly allocated string without the spaces that needs to be freed
166 * by the caller
[1168]167 */
[3614]168char *mr_strip_spaces(const char *instr) {
[1168]169
[3614]170char *q = NULL;
171char *outstr = NULL;
[1168]172
[3614]173if (instr == NULL) {
174 return(NULL);
175}
[1205]176
[3614]177/* Skip initial spaces and special chars */
[3627]178while (*instr <= ' ' && *instr != '\0') {
179 instr++;
[3614]180}
[3627]181mr_asprintf(outstr, "%s", instr);
[3614]182q = outstr + strlen(outstr) -1;
[1168]183
[3614]184/* Skip final spaces and special chars */
185while (*q <= ' ' && q != outstr) {
186 q--;
[1168]187}
[3193]188
[3614]189/* The string now ends after that char */
190q++;
191*q = '\0';
192return(outstr);
193}
194
[3641]195/* Subsitute the string token in the string in by the string subst */
[3294]196char *mr_str_substitute(const char *in, const char *token, const char *subst) {
[3193]197
[3294]198char *output = NULL;
199char *tmp = NULL;
200int i = 0;
201
202mr_asprintf(output, "%s", in);
203tmp = strstr(output, token);
204if (tmp == NULL) {
205 // token not found returning initial string unmodified
206 return(output);
207}
[3641]208// token found: end string here for now
[3294]209*tmp = '\0';
210
211// Add subst content to the string
212mr_strcat(output,subst);
213
214// now add the rest of in
215tmp = strstr(in, token);
216for (; i < strlen(token) ; i++) {
217 tmp++;
218}
219mr_strcat(output,tmp);
220return(output);
221}
222
223
[3193]224/*
225 * Remove '\n' char from both sides of @p in_out.
226 * @param in_out The string to strip characters from (modified).
227
228void mr_chomp(char *in_out) {
229
230 mr_strip_char(in_out, "\n");
231}
232*/
233
234/**
235 * Remove all characters in caracs from begining and end of string @p in_out
236 * @param in_out The string to strip char characters from (modified).
237
238void mr_strip_char(char *in_out, char *caracs) {
239 int i = 0;
240 int j = 0;
241 size_t length = 0;
242
243 if (caracs == NULL) {
244 return;
245 }
246 if (in_out == NULL) {
247 return;
248 }
249 length = strlen(in_out);
250
[3194]251 // Skip initial caracs
[3193]252 for (i = 0; index(caracs, in_out[i]) != NULL && i < (int)length ; i++);
253
[3194]254 // Shift the string to the begining if needed
[3193]255 if (i != 0) {
256 for (j = 0; i < (int)length ; i++, j++) {
257 in_out[j] = in_out[i];
258 }
[3194]259 // Erase the end of the string if needed
[3193]260 j++;
261 in_out[j] = '\0';
262 }
263
[3194]264 // Skip final caracs
[3193]265 for (i = (int)strlen(in_out) - 1; i >= 0 && index(caracs, in_out[i]) != NULL; i--);
266
[3194]267 // The string now ends after that char
[3193]268 i++;
269 in_out[i] = '\0';
270}
271*/
272
Note: See TracBrowser for help on using the repository browser.