Created
December 11, 2016 23:29
-
-
Save Yiin/59058427559a98129deb1b4d5840d7ef to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Replace occurrences of the search string with the replacement string. | |
* | |
* Parameters: | |
* string[] - The string to perform the replacing in. | |
* search[] - The string to look for. | |
* replacement[] - The string to put instead of "search". | |
* ignorecase - Whether the search for "search" should be case-insensitive. Defaults to false. | |
* pos - The position to start at. Defaults to 0 (the beginning). | |
* limit - Limit the number of replacements. Defaults to -1 (no limit). | |
* maxlength - The size of "string". Defaults to sizeof(string). | |
* | |
* Returns: | |
* The number of replacements that were made. | |
*/ | |
forward strreplace(string[], const search[], const replacement[], bool:ignorecase = false, pos = 0, limit = -1, maxlength = sizeof(string)); | |
stock strreplace(string[], const search[], const replacement[], bool:ignorecase = false, pos = 0, limit = -1, maxlength = sizeof(string)) { | |
// No need to do anything if the limit is 0. | |
if (limit == 0) | |
return 0; | |
new | |
sublen = strlen(search), | |
replen = strlen(replacement), | |
bool:packed = ispacked(string), | |
maxlen = maxlength, | |
len = strlen(string), | |
count = 0 | |
; | |
// "maxlen" holds the max string length (not to be confused with "maxlength", which holds the max. array size). | |
// Since packed strings hold 4 characters per array slot, we multiply "maxlen" by 4. | |
if (packed) | |
maxlen *= 4; | |
// If the length of the substring is 0, we have nothing to look for.. | |
if (!sublen) | |
return 0; | |
// In this line we both assign the return value from "strfind" to "pos" then check if it's -1. | |
while (-1 != (pos = strfind(string, search, ignorecase, pos))) { | |
// Delete the string we found | |
strdel(string, pos, pos + sublen); | |
len -= sublen; | |
// If there's anything to put as replacement, insert it. Make sure there's enough room first. | |
if (replen && len + replen < maxlen) { | |
strins(string, replacement, pos, maxlength); | |
pos += replen; | |
len += replen; | |
} | |
// Is there a limit of number of replacements, if so, did we break it? | |
if (limit != -1 && ++count >= limit) | |
break; | |
} | |
return count; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment