1 /* NUMstring.cpp
2  *
3  * Copyright (C) 2012,2013,2015-2020 David Weenink, 2015-2021 Paul Boersma
4  *
5  * This code is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or (at
8  * your option) any later version.
9  *
10  * This code is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this work. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 /*
20  djmw 20121005 First version
21 */
22 
23 #include "Interpreter.h"
24 #include "NUM2.h"
25 
strstr_regexp(conststring32 string,conststring32 search_regexp)26 char32 *strstr_regexp (conststring32 string, conststring32 search_regexp) {
27 	char32 *charp = nullptr;
28 	regexp *compiled_regexp = CompileRE_throwable (search_regexp, 0);
29 	if (ExecRE (compiled_regexp, nullptr, string, nullptr, false, U'\0', U'\0', nullptr, nullptr))
30 		charp = compiled_regexp -> startp [0];
31 	free (compiled_regexp);
32 	return charp;
33 }
34 
string32vector_searchAndReplace_literal(constSTRVEC me,conststring32 search,conststring32 replace,int maximumNumberOfReplaces,integer * out_numberOfMatches,integer * out_numberOfStringMatches)35 static autoSTRVEC string32vector_searchAndReplace_literal (constSTRVEC me,
36 	conststring32 search, conststring32 replace, int maximumNumberOfReplaces,
37 	integer *out_numberOfMatches, integer *out_numberOfStringMatches)
38 {
39 	/*
40 		Sanitize input.
41 	*/
42 	if (! search)
43 		search = U"";
44 	if (! replace)
45 		replace = U"";
46 
47 	autoSTRVEC result (me.size);
48 
49 	integer nmatches_sub = 0, nmatches = 0, nstringmatches = 0;
50 	for (integer i = 1; i <= me.size; i ++) {
51 		result [i] = replace_STR (me [i], search, replace, maximumNumberOfReplaces, & nmatches_sub);
52 		if (nmatches_sub > 0) {
53 			nmatches += nmatches_sub;
54 			nstringmatches ++;
55 		}
56 	}
57 	if (out_numberOfMatches)
58 		*out_numberOfMatches = nmatches;
59 	if (out_numberOfStringMatches)
60 		*out_numberOfStringMatches = nstringmatches;
61 	return result;
62 }
63 
string32vector_searchAndReplace_regexp(constSTRVEC me,conststring32 searchRE,conststring32 replaceRE,int maximumNumberOfReplaces,integer * out_numberOfMatches,integer * out_numberOfStringMatches)64 static autoSTRVEC string32vector_searchAndReplace_regexp (constSTRVEC me,
65 	conststring32 searchRE, conststring32 replaceRE, int maximumNumberOfReplaces,
66 	integer *out_numberOfMatches, integer *out_numberOfStringMatches)
67 {
68 	/*
69 		Sanitize input.
70 	*/
71 	if (! searchRE)
72 		searchRE = U"";
73 	if (! replaceRE)
74 		replaceRE = U"";
75 
76 	integer nmatches_sub = 0;
77 
78 	regexp *compiledRE = CompileRE_throwable (searchRE, 0);
79 
80 	autoSTRVEC result (me.size);
81 
82 	integer nmatches = 0, nstringmatches = 0;
83 	for (integer i = 1; i <= me.size; i ++) {
84 		result [i] = replace_regex_STR (me [i], compiledRE, replaceRE, maximumNumberOfReplaces, & nmatches_sub);
85 		if (nmatches_sub > 0) {
86 			nmatches += nmatches_sub;
87 			nstringmatches ++;
88 		}
89 	}
90 	if (out_numberOfMatches)
91 		*out_numberOfMatches = nmatches;
92 	if (out_numberOfStringMatches)
93 		*out_numberOfStringMatches = nstringmatches;
94 	return result;
95 }
96 
string32vector_searchAndReplace(constSTRVEC me,conststring32 search,conststring32 replace,integer maximumNumberOfReplaces,integer * nmatches,integer * nstringmatches,bool use_regexp)97 autoSTRVEC string32vector_searchAndReplace (constSTRVEC me,
98 	conststring32 search, conststring32 replace, integer maximumNumberOfReplaces,
99 	integer *nmatches, integer *nstringmatches, bool use_regexp)
100 {
101 	return use_regexp ?
102 		string32vector_searchAndReplace_regexp (me, search, replace, maximumNumberOfReplaces, nmatches, nstringmatches) :
103 		string32vector_searchAndReplace_literal (me, search, replace, maximumNumberOfReplaces, nmatches, nstringmatches);
104 }
105 
NUMnumber_as_stringWithDotReplacedByUnderscore(double time)106 char32 * NUMnumber_as_stringWithDotReplacedByUnderscore (double time) {
107 	static char32 string [100];
108 	conststring32 time_string = Melder_double (time);
109 	const char32 *from = time_string;
110 	char32 *to = & string [0];
111 	while (*from != U'\0') {
112 		if (*from != U'.')
113 			*to = *from;
114 		else
115 			*to = U'_';
116 		to ++; from ++;
117 	}
118 	*to = U'\0';
119 	return string;
120 }
121 
122 /* End of file NUMstring.cpp */
123