msgbuf: add some message building code
This commit is contained in:
parent
d84acbceca
commit
4a13e3f1da
2 changed files with 74 additions and 3 deletions
|
@ -57,7 +57,7 @@ int msgbuf_parse(struct MsgBuf *msgbuf, char *line);
|
||||||
* cmd may not be NULL.
|
* cmd may not be NULL.
|
||||||
* returns 0 on success, 1 on error.
|
* returns 0 on success, 1 on error.
|
||||||
*/
|
*/
|
||||||
int msgbuf_unparse(char *buf, struct MsgBuf *msgbuf, unsigned int capmask);
|
int msgbuf_unparse(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* unparse a MsgBuf header plus payload into a buffer.
|
* unparse a MsgBuf header plus payload into a buffer.
|
||||||
|
@ -65,8 +65,8 @@ int msgbuf_unparse(char *buf, struct MsgBuf *msgbuf, unsigned int capmask);
|
||||||
* cmd may not be NULL.
|
* cmd may not be NULL.
|
||||||
* returns 0 on success, 1 on error.
|
* returns 0 on success, 1 on error.
|
||||||
*/
|
*/
|
||||||
int msgbuf_unparse_fmt(char *buf, struct MsgBuf *head, unsigned int capmask, const char *fmt, ...) AFP(4, 5);
|
int msgbuf_unparse_fmt(char *buf, size_t buflen, struct MsgBuf *head, unsigned int capmask, const char *fmt, ...) AFP(5, 6);
|
||||||
int msgbuf_vunparse_fmt(char *buf, struct MsgBuf *head, unsigned int capmask, const char *fmt, va_list va);
|
int msgbuf_vunparse_fmt(char *buf, size_t buflen, struct MsgBuf *head, unsigned int capmask, const char *fmt, va_list va);
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
msgbuf_init(struct MsgBuf *msgbuf)
|
msgbuf_init(struct MsgBuf *msgbuf)
|
||||||
|
|
|
@ -111,3 +111,74 @@ msgbuf_parse(struct MsgBuf *msgbuf, char *line)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
msgbuf_unparse_tags(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
*buf = '@';
|
||||||
|
|
||||||
|
for (i = 0; i < msgbuf->n_tags; i++)
|
||||||
|
{
|
||||||
|
if ((msgbuf->tags[i].capmask & capmask) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (i != 0)
|
||||||
|
rb_strlcat(buf, ";", buflen);
|
||||||
|
|
||||||
|
rb_strlcat(buf, msgbuf->tags[i].key, buflen);
|
||||||
|
|
||||||
|
/* XXX properly handle escaping */
|
||||||
|
if (msgbuf->tags[i].value)
|
||||||
|
{
|
||||||
|
rb_strlcat(buf, "=", buflen);
|
||||||
|
rb_strlcat(buf, msgbuf->tags[i].value, buflen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rb_strlcat(buf, " ", buflen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
msgbuf_unparse_prefix(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
memset(buf, 0, buflen);
|
||||||
|
|
||||||
|
if (msgbuf->n_tags > 0)
|
||||||
|
msgbuf_unparse_tags(buf, buflen, msgbuf, capmask);
|
||||||
|
|
||||||
|
if (msgbuf->origin)
|
||||||
|
rb_snprintf_append(buf, buflen, ":%s ", msgbuf->origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* unparse a pure MsgBuf into a buffer.
|
||||||
|
* if origin is NULL, me.name will be used.
|
||||||
|
* cmd may not be NULL.
|
||||||
|
* returns 0 on success, 1 on error.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
msgbuf_unparse(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
msgbuf_unparse_prefix(buf, buflen, msgbuf, capmask);
|
||||||
|
|
||||||
|
for (i = 0; i < msgbuf->n_para; i++)
|
||||||
|
{
|
||||||
|
if (i == (msgbuf->n_para - 1))
|
||||||
|
{
|
||||||
|
if (strchr(msgbuf->para[i], ' ') != NULL)
|
||||||
|
rb_snprintf_append(buf, buflen, ":%s", msgbuf->para[i]);
|
||||||
|
else
|
||||||
|
rb_strlcat(buf, msgbuf->para[i], buflen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
rb_strlcat(buf, msgbuf->para[i], buflen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue