📄 msg_header_make.c
字号:
/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi <pekka.pessi@nokia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * *//**@ingroup msg_headers * @CFILE msg_header_make.c * * Creating message headers from strings. * * @author Pekka Pessi <Pekka.Pessi@nokia.com> * * @date Created: Fri Feb 23 14:06:34 2001 ppessi * */#include "config.h"#include <stddef.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <stdarg.h>#if defined(va_copy)/* Xyzzy */#elif defined(__va_copy)#define va_copy(dst, src) __va_copy((dst), (src))#else#define va_copy(dst, src) (memcpy(&(dst), &(src), sizeof (va_list)))#endif#include <assert.h>#include <sofia-sip/su_alloc.h>#include "sofia-sip/msg.h"#include "sofia-sip/bnf.h"#include "sofia-sip/msg_parser.h"#include "sofia-sip/msg_header.h"/** Make a header from a value string. */msg_header_t *msg_header_make(su_home_t *home, msg_hclass_t *hc, char const *s){ int xtra; msg_header_t *h; int normal = hc->hc_name || (hc->hc_hash != msg_payload_hash && hc->hc_hash != msg_separator_hash && hc->hc_hash != msg_error_hash); if (s == NULL) return NULL; /* For normal headers, strip LWS from both ends */ if (normal) skip_lws(&s); xtra = strlen(s); if (normal) while (xtra > 0 && IS_LWS(s[xtra - 1])) xtra--; h = msg_header_alloc(home, hc, xtra + 1); if (h) { char *b = MSG_HEADER_DATA(h); strncpy(b, s, xtra)[xtra] = 0; if (hc->hc_parse(home, h, b, xtra) == -1) { /* Note: parsing function is responsible to free everything it has allocated (like parameter lists) */ /* XXX - except header structures */ su_free(home, h), h = NULL; } } return h;}/** Make a MSG header with formatting provided. */msg_header_t *msg_header_vformat(su_home_t *home, msg_hclass_t *hc, char const *fmt, va_list ap){ msg_header_t *h; int n, xtra = 64; /* reasonable default */ /* Quick path */ if (!fmt || !strchr(fmt, '%')) return msg_header_make(home, hc, fmt); /* Another quickie */ if (strcmp(fmt, "%s") == 0) { fmt = va_arg(ap, char const *); return msg_header_make(home, hc, fmt); } if (!(h = msg_header_alloc(home, hc, xtra))) return NULL; for (;;) { va_list aq; va_copy(aq, ap); n = vsnprintf(MSG_HEADER_DATA(h), xtra, fmt, aq); va_end(aq); if (n >= 0 && n < xtra) break; /* Try again with more space */ su_free(home, h); if (n >= 0) xtra = n + 1; /* precisely what is needed */ else xtra *= 2; /* glibc 2.0 - twice the old size */ if (!(h = msg_header_alloc(home, hc, xtra))) return NULL; } if (hc->hc_parse(home, h, MSG_HEADER_DATA(h), n) == -1) { /* Note: parsing function is responsible to free everything it has allocated (like parameter lists) */ su_free(home, h), h = NULL; } return h;}msg_header_t *msg_header_format(su_home_t *home, msg_hclass_t *hc, char const *fmt, ...){ msg_header_t *h; va_list ap; va_start(ap, fmt); h = msg_header_vformat(home, hc, fmt, ap); va_end(ap); return h;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -