forked from github/server
fix sbs_strcat, use it for orders.
This commit is contained in:
parent
ddd30e6210
commit
cc8d34a1e7
3 changed files with 16 additions and 44 deletions
|
@ -68,29 +68,17 @@ keyword_t getkeyword(const order * ord)
|
||||||
* keywords are expanded to their full length.
|
* keywords are expanded to their full length.
|
||||||
*/
|
*/
|
||||||
char* get_command(const order *ord, const struct locale *lang, char *sbuffer, size_t size) {
|
char* get_command(const order *ord, const struct locale *lang, char *sbuffer, size_t size) {
|
||||||
char *bufp = sbuffer;
|
|
||||||
order_data *od = NULL;
|
order_data *od = NULL;
|
||||||
const char * text;
|
const char * text;
|
||||||
keyword_t kwd = ORD_KEYWORD(ord);
|
keyword_t kwd = ORD_KEYWORD(ord);
|
||||||
int bytes;
|
sbstring sbs;
|
||||||
|
|
||||||
|
sbs_init(&sbs, sbuffer, size);
|
||||||
if (ord->command & CMD_QUIET) {
|
if (ord->command & CMD_QUIET) {
|
||||||
if (size > 0) {
|
sbs_strcpy(&sbs, "!");
|
||||||
*bufp++ = '!';
|
|
||||||
--size;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WARN_STATIC_BUFFER();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (ord->command & CMD_PERSIST) {
|
if (ord->command & CMD_PERSIST) {
|
||||||
if (size > 0) {
|
sbs_strcat(&sbs, "@");
|
||||||
*bufp++ = '@';
|
|
||||||
--size;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WARN_STATIC_BUFFER();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ord->id < 0) {
|
if (ord->id < 0) {
|
||||||
|
@ -102,39 +90,19 @@ char* get_command(const order *ord, const struct locale *lang, char *sbuffer, si
|
||||||
text = OD_STRING(od);
|
text = OD_STRING(od);
|
||||||
}
|
}
|
||||||
if (kwd != NOKEYWORD) {
|
if (kwd != NOKEYWORD) {
|
||||||
if (size > 0) {
|
|
||||||
const char *str = (const char *)LOC(lang, keyword(kwd));
|
const char *str = (const char *)LOC(lang, keyword(kwd));
|
||||||
assert(str);
|
assert(str);
|
||||||
if (text) --size;
|
sbs_strcat(&sbs, str);
|
||||||
bytes = (int)str_strlcpy(bufp, str, size);
|
if (text) {
|
||||||
if (wrptr(&bufp, &size, bytes) != 0) {
|
sbs_strcat(&sbs, " ");
|
||||||
WARN_STATIC_BUFFER();
|
|
||||||
}
|
|
||||||
if (text) *bufp++ = ' ';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
WARN_STATIC_BUFFER();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (text) {
|
if (text) {
|
||||||
bytes = (int)str_strlcpy(bufp, (const char *)text, size);
|
sbs_strcat(&sbs, text);
|
||||||
if (wrptr(&bufp, &size, bytes) != 0) {
|
|
||||||
WARN_STATIC_BUFFER();
|
|
||||||
if (bufp - sbuffer >= 6) {
|
|
||||||
bufp -= 6;
|
|
||||||
while (bufp > sbuffer && (*bufp & 0x80) != 0) {
|
|
||||||
++size;
|
|
||||||
--bufp;
|
|
||||||
}
|
|
||||||
memcpy(bufp, "[...]", 6); /* TODO: make sure this only happens in eval_command */
|
|
||||||
bufp += 6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (od) {
|
if (od) {
|
||||||
odata_release(od);
|
odata_release(od);
|
||||||
}
|
}
|
||||||
if (size > 0) *bufp = 0;
|
|
||||||
return sbuffer;
|
return sbuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -261,5 +261,8 @@ void sbs_strcat(struct sbstring *sbs, const char *str)
|
||||||
void sbs_strcpy(struct sbstring *sbs, const char *str)
|
void sbs_strcpy(struct sbstring *sbs, const char *str)
|
||||||
{
|
{
|
||||||
size_t len = str_strlcpy(sbs->begin, str, sbs->size);
|
size_t len = str_strlcpy(sbs->begin, str, sbs->size);
|
||||||
sbs->end += len;
|
if (len >= sbs->size) {
|
||||||
|
len = sbs->size - 1;
|
||||||
|
}
|
||||||
|
sbs->end = sbs->begin + len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,9 +105,10 @@ static void test_sbstring(CuTest * tc)
|
||||||
CuAssertStrEquals(tc, "Hodor", sbs.begin);
|
CuAssertStrEquals(tc, "Hodor", sbs.begin);
|
||||||
sbs_strcpy(&sbs, "12345678901234567890");
|
sbs_strcpy(&sbs, "12345678901234567890");
|
||||||
CuAssertStrEquals(tc, "123456789012345", sbs.begin);
|
CuAssertStrEquals(tc, "123456789012345", sbs.begin);
|
||||||
|
CuAssertPtrEquals(tc, sbs.begin + sbs.size - 1, sbs.end);
|
||||||
sbs_strcat(&sbs, "12345678901234567890");
|
sbs_strcat(&sbs, "12345678901234567890");
|
||||||
CuAssertStrEquals(tc, "123456789012345", sbs.begin);
|
CuAssertStrEquals(tc, "123456789012345", sbs.begin);
|
||||||
CuAssertStrEquals(tc, buffer, sbs.begin);
|
CuAssertPtrEquals(tc, buffer, sbs.begin);
|
||||||
}
|
}
|
||||||
|
|
||||||
CuSuite *get_strings_suite(void)
|
CuSuite *get_strings_suite(void)
|
||||||
|
|
Loading…
Reference in a new issue