- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
Hi,
I want to use ippRegExpReplace() to replace ALL matched sub strings in the src string, but didn't find a elegant way to do it.
From the doc, I see ippRegExpReplace() doesn't allocate memory for the dest string and IppRegExpFind array. So I have to test again and again to see whether the result can fit into the allocated memory. Following is how I did.
do { // loop until we got enough memory for dest and finds
if (destUsedLen == destLen) {
destLen *= 2; // expand the size by 2
delete[] dest;
dest = new char[destLen];
}
if (numFinds == findsLen) {
findsLen *= 2;
delete[] f;
f = new IppRegExpFind[findsLen];
}
srcLen = origStrLen;
destUsedLen = destLen;
numFinds = findsLen;
status = ippsRegExpReplace_8u(srcStr, &srcLen, destStr, &destUsedLen, f, &numFinds, regexState, replaceState);
} while ((status == ippStsNoErr) && (numFinds > 0) && ((numFinds >= findsLen) || (destUsedLen >= destLen)));
Is that the right (but ugly) way? Or did I miss anything?
Thanks,
-Evan
I want to use ippRegExpReplace() to replace ALL matched sub strings in the src string, but didn't find a elegant way to do it.
From the doc, I see ippRegExpReplace() doesn't allocate memory for the dest string and IppRegExpFind array. So I have to test again and again to see whether the result can fit into the allocated memory. Following is how I did.
do { // loop until we got enough memory for dest and finds
if (destUsedLen == destLen) {
destLen *= 2; // expand the size by 2
delete[] dest;
dest = new char[destLen];
}
if (numFinds == findsLen) {
findsLen *= 2;
delete[] f;
f = new IppRegExpFind[findsLen];
}
srcLen = origStrLen;
destUsedLen = destLen;
numFinds = findsLen;
status = ippsRegExpReplace_8u(srcStr, &srcLen, destStr, &destUsedLen, f, &numFinds, regexState, replaceState);
} while ((status == ippStsNoErr) && (numFinds > 0) && ((numFinds >= findsLen) || (destUsedLen >= destLen)));
Is that the right (but ugly) way? Or did I miss anything?
Thanks,
-Evan
コピーされたリンク
6 返答(返信)
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
Hi,
It is better to check srcLen param. On function output it holds how many source elements was searched. If it less then origStrLen and all dst buffer is filled than you can move pSrc pointer to the srcLen bytes and repeate the replacement. In that case no need to start the replecement from origin of source string.
Igor S. Belyakov
It is better to check srcLen param. On function output it holds how many source elements was searched. If it less then origStrLen and all dst buffer is filled than you can move pSrc pointer to the srcLen bytes and repeate the replacement. In that case no need to start the replecement from origin of source string.
Igor S. Belyakov
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
Hi Igor S.,
Thanks for your reply.
As my testing, when the match result cannot fit into IppRegExpFind array, srcLen will also equal to origStrLen.
Could you please tell me what are the values of srcUsedLen, dstUseLen, numFinds in the following cases?
o dst buffer is too small to fit in, but IppRegExpFind array is big enough;
o IppRegExpFind array is too small to fit in, but dst buffer is big enough;
o both of IppRegExpFind array and dst buffer are too small to fit in.
The answers to above cases should really be documented. I've spent a lot of time struggling with the replace API.
It turns out my previous approach also doesn't work, because I found that when IppRegExpFind array is too small to fit, numFinds is 0. So far, I haven't figure out a way to use ippRegExpReplace() to replace all matched substrings given above cases.
Thanks,
-Evan
Thanks for your reply.
As my testing, when the match result cannot fit into IppRegExpFind array, srcLen will also equal to origStrLen.
Could you please tell me what are the values of srcUsedLen, dstUseLen, numFinds in the following cases?
o dst buffer is too small to fit in, but IppRegExpFind array is big enough;
o IppRegExpFind array is too small to fit in, but dst buffer is big enough;
o both of IppRegExpFind array and dst buffer are too small to fit in.
The answers to above cases should really be documented. I've spent a lot of time struggling with the replace API.
It turns out my previous approach also doesn't work, because I found that when IppRegExpFind array is too small to fit, numFinds is 0. So far, I haven't figure out a way to use ippRegExpReplace() to replace all matched substrings given above cases.
Thanks,
-Evan
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
As least two unexpected behaviors are found so far:
1).
Before invoking ippRegExpReplace:
regex: "[BD]"; option: "g"; replacement: "##"; src: "ABCDE"; destLen: 14; numFinds: 3
After invoking:
srcUsedLen: 1; numFinds: 2; dest: "A##C##E"; destUsedLen: 7
The src string has been entirely parsed. I expected srcUsedLen to be 5.
2).
Before invoking:
regex: "([AB])([CD])([EF])"; option: "g"; replacement: "##"; src: "ACE"; destLen: 10; numFinds: 3
After invoking:
srcUsedLen: 3; numFinds: 0;
The pre-allocated Finds array is too small to fit all results, but I would expect numFinds after invoking to be 3 - fill what can fit. Under current behavior, I have no way to tell the difference of this case from no matching - e.g. use "XYZ" as src string, the result is identical.
Thanks,
-Evan
1).
Before invoking ippRegExpReplace:
regex: "[BD]"; option: "g"; replacement: "##"; src: "ABCDE"; destLen: 14; numFinds: 3
After invoking:
srcUsedLen: 1; numFinds: 2; dest: "A##C##E"; destUsedLen: 7
The src string has been entirely parsed. I expected srcUsedLen to be 5.
2).
Before invoking:
regex: "([AB])([CD])([EF])"; option: "g"; replacement: "##"; src: "ACE"; destLen: 10; numFinds: 3
After invoking:
srcUsedLen: 3; numFinds: 0;
The pre-allocated Finds array is too small to fit all results, but I would expect numFinds after invoking to be 3 - fill what can fit. Under current behavior, I have no way to tell the difference of this case from no matching - e.g. use "XYZ" as src string, the result is identical.
Thanks,
-Evan
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
Forgot to mention, I'm using IPP 7 Beta.
Thanks,
-Evan
Thanks,
-Evan
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
Could someone confirm that whether they're bugs of IPP? Thanks!
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
Hello,
Thaks for reporting issue.We were able to reproduce the problem and will investigate it further. We will update you once we have results.
Regards,
Vladimir
Thaks for reporting issue.We were able to reproduce the problem and will investigate it further. We will update you once we have results.
Regards,
Vladimir
