temporarily revert substring fix pending the result of the discussion in issue #6271

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@8414 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Russell Bryant
2006-01-21 23:43:14 +00:00
parent 87c0cd2667
commit ff83f7c6ed

46
pbx.c
View File

@@ -927,34 +927,40 @@ pvn_endfor:
} }
} }
/*! \brief takes a substring. It is ok to call with value == workspace. static char *substring(char *value, int offset, int length, char *workspace, size_t workspace_len)
*
* offset < 0 means start from the end of the string.
* length is the length of the substring, -1 means unlimited
* (we take any negative value).
* Always return a copy in workspace.
*/
static char *substring(const char *value, int offset, int length, char *workspace, size_t workspace_len)
{ {
char *ret = workspace; char *ret = workspace;
int lr; /* length of the input string after the copy */
ast_copy_string(workspace, value, workspace_len); /* always make a copy */ /* No need to do anything */
if (offset == 0 && length==-1) {
return value;
}
if (offset == 0 && length < 0) /* take the whole string */ ast_copy_string(workspace, value, workspace_len);
return ret;
lr = strlen(ret); /* compute length after copy, so we never go out of the workspace */ if (abs(offset) > strlen(ret)) { /* Offset beyond string */
if (offset >= 0)
offset = strlen(ret);
else
offset =- strlen(ret);
}
if (offset < 0) /* translate negative offset into positive ones */ /* Detect too-long length */
offset = lr - offset; if ((offset < 0 && length > -offset) || (offset >= 0 && offset+length > strlen(ret))) {
if (offset >= 0)
length = strlen(ret)-offset;
else
length = strlen(ret)+offset;
}
/* too large offset result in empty string so we know what to return */ /* Bounce up to the right offset */
if (offset >= lr) if (offset >= 0)
return ret + lr; /* the final '\0' */ ret += offset;
else
ret += strlen(ret)+offset;
ret += offset; /* move to the start position */ /* Chop off at the requisite length */
if (length >= 0 && length < lr - offset) /* truncate if necessary */ if (length >= 0)
ret[length] = '\0'; ret[length] = '\0';
return ret; return ret;