1
0
mirror of https://github.com/gryf/wmaker.git synced 2026-02-14 12:55:47 +01:00

WINGs: Bounded string ops

Signed-off-by: Tamas TEVESZ <ice@extreme.hu>
This commit is contained in:
Tamas TEVESZ
2010-09-28 22:25:44 +02:00
committed by Carlos R. Mafra
parent 300d02bf54
commit 14863cd3b1
10 changed files with 240 additions and 116 deletions

View File

@@ -689,6 +689,7 @@ char *WMGetBrowserPathToColumn(WMBrowser * bPtr, int column)
{
int i, size;
char *path;
size_t slen;
WMListItem *item;
if (column >= bPtr->usedColumnCount)
@@ -708,24 +709,34 @@ char *WMGetBrowserPathToColumn(WMBrowser * bPtr, int column)
}
/* get the path */
path = wmalloc(size + (column + 1) * strlen(bPtr->pathSeparator) + 1);
/* ignore first / */
*path = 0;
slen = size + (column + 1) * strlen(bPtr->pathSeparator) + 1;
path = wmalloc(slen);
/* ignore first `/' */
for (i = 0; i <= column; i++) {
strcat(path, bPtr->pathSeparator);
if (wstrlcat(path, bPtr->pathSeparator, slen) >= slen)
goto error;
item = WMGetListSelectedItem(bPtr->columns[i]);
if (!item)
break;
strcat(path, item->text);
if (wstrlcat(path, item->text, slen) >= slen)
goto error;
}
return path;
error:
wfree(path);
return NULL;
}
WMArray *WMGetBrowserPaths(WMBrowser * bPtr)
{
int column, i, k, size, selNo;
char *path;
size_t slen;
WMListItem *item, *lastItem;
WMArray *paths, *items;
@@ -760,11 +771,14 @@ WMArray *WMGetBrowserPaths(WMBrowser * bPtr)
for (k = 0; k < selNo; k++) {
/* get the path */
lastItem = WMGetFromArray(items, k);
path = wmalloc(size + (lastItem != NULL ? strlen(lastItem->text) : 0));
/* ignore first / */
*path = 0;
slen = size + (lastItem != NULL ? strlen(lastItem->text) : 0);
path = wmalloc(slen);
/* ignore first `/' */
for (i = 0; i <= column; i++) {
strcat(path, bPtr->pathSeparator);
if (wstrlcat(path, bPtr->pathSeparator, slen) >= slen) {
wfree(path);
return NULL;
}
if (i == column) {
item = lastItem;
} else {
@@ -772,7 +786,10 @@ WMArray *WMGetBrowserPaths(WMBrowser * bPtr)
}
if (!item)
break;
strcat(path, item->text);
if (wstrlcat(path, item->text, slen) >= slen) {
wfree(path);
return NULL;
}
}
WMAddToArray(paths, path);
}
@@ -1101,27 +1118,48 @@ static void destroyBrowser(WMBrowser * bPtr)
static char *createTruncatedString(WMFont * font, char *text, int *textLen, int width)
{
int dLen = WMWidthOfString(font, ".", 1);
char *textBuf = (char *)wmalloc((*textLen) + 4);
size_t slen;
int dLen;
char *textBuf;
dLen = WMWidthOfString(font, ".", 1);
slen = *textLen + 4;
textBuf = wmalloc(slen);
if (width >= 3 * dLen) {
int dddLen = 3 * dLen;
int tmpTextLen = *textLen;
strcpy(textBuf, text);
while (tmpTextLen && (WMWidthOfString(font, textBuf, tmpTextLen) + dddLen > width))
if (wstrlcpy(textBuf, text, slen) >= slen)
goto error;
while (tmpTextLen && (WMWidthOfString(font, textBuf, tmpTextLen) + 3 * dLen > width))
tmpTextLen--;
strcpy(textBuf + tmpTextLen, "...");
if (wstrlcpy(textBuf + tmpTextLen, "...", slen) >= slen)
goto error;
*textLen = tmpTextLen + 3;
} else if (width >= 2 * dLen) {
strcpy(textBuf, "..");
if (wstrlcpy(textBuf, "..", slen) >= slen)
goto error;
*textLen = 2;
} else if (width >= dLen) {
strcpy(textBuf, ".");
if (wstrlcpy(textBuf, ".", slen) >= slen)
goto error;
*textLen = 1;
} else {
*textBuf = '\0';
*textLen = 0;
}
return textBuf;
error:
wfree(textBuf);
return NULL;
}