📄 osip_port.c
字号:
default: *t++ = *s; break; } } *t++ = '"'; *t++ = '\0'; return rtn;}voidosip_dequote (char *s){ size_t len; if (*s == '\0') return; if (*s != '"') return; len = strlen (s); memmove (s, s + 1, len--); if (len > 0 && s[len - 1] == '"') s[--len] = '\0'; for (; *s != '\0'; s++, len--) { if (*s == '\\') memmove (s, s + 1, len--); }}/**********************************************************//* only MACROS from osip/trace.h should be used by others *//* TRACE_INITIALIZE(level,file)) *//* TRACE_ENABLE_LEVEL(level) *//* TRACE_DISABLE_LEVEL(level) *//* IS_TRACE_LEVEL_ACTIVATE(level) *//**********************************************************/#ifndef ENABLE_TRACEvoidosip_trace_initialize_func (osip_trace_level_t level, osip_trace_func_t * func){}voidosip_trace_initialize_syslog (osip_trace_level_t level, char *ident){}voidosip_trace_initialize (osip_trace_level_t level, FILE * file){}voidosip_trace_enable_level (osip_trace_level_t level){}voidosip_trace_disable_level (osip_trace_level_t level){}intosip_is_trace_level_activate (osip_trace_level_t level){ return LOG_FALSE;}#else/* initialize log *//* all lower levels of level are logged in file. */voidosip_trace_initialize (osip_trace_level_t level, FILE * file){ osip_trace_level_t i = 0; /* enable trace in log file by default */ logfile = NULL; if (file != NULL) logfile = file;#ifndef SYSTEM_LOGGER_ENABLED else logfile = stdout;#endif /* enable all lower levels */ while (i < END_TRACE_LEVEL) { if (i < level) tracing_table[i] = LOG_TRUE; else tracing_table[i] = LOG_FALSE; i++; }}voidosip_trace_initialize_syslog (osip_trace_level_t level, char *ident){ osip_trace_level_t i = 0;#if defined (HAVE_SYSLOG_H) && !defined(__arc__) openlog (ident, LOG_CONS | LOG_PID, LOG_DAEMON); use_syslog = 1;#endif /* enable all lower levels */ while (i < END_TRACE_LEVEL) { if (i < level) tracing_table[i] = LOG_TRUE; else tracing_table[i] = LOG_FALSE; i++; }}voidosip_trace_enable_until_level (osip_trace_level_t level){ int i = 0; while (i < END_TRACE_LEVEL) { if (i < level) tracing_table[i] = LOG_TRUE; else tracing_table[i] = LOG_FALSE; i++; }}voidosip_trace_initialize_func (osip_trace_level_t level, osip_trace_func_t * func){ int i = 0; trace_func = func; /* enable all lower levels */ while (i < END_TRACE_LEVEL) { if (i < level) tracing_table[i] = LOG_TRUE; else tracing_table[i] = LOG_FALSE; i++; }}/* enable a special debugging level! */voidosip_trace_enable_level (osip_trace_level_t level){ tracing_table[level] = LOG_TRUE;}/* disable a special debugging level! */voidosip_trace_disable_level (osip_trace_level_t level){ tracing_table[level] = LOG_FALSE;}/* not so usefull? */intosip_is_trace_level_activate (osip_trace_level_t level){ return tracing_table[level];}#endifintosip_trace (char *fi, int li, osip_trace_level_t level, FILE * f, char *chfr, ...){#ifdef ENABLE_TRACE va_list ap;#if !defined(WIN32) && !defined(SYSTEM_LOGGER_ENABLED) if (logfile == NULL && use_syslog == 0 && trace_func == NULL) { /* user did not initialize logger.. */ return 1; }#endif if (tracing_table[level] == LOG_FALSE) return 0; if (f == NULL && trace_func == NULL) f = logfile; VA_START (ap, chfr);#if defined(__VXWORKS_OS__) || defined(__rtems__) /* vxworks can't have a local file */ f = stdout;#endif if (f && use_syslog == 0) { if (level == OSIP_FATAL) fprintf (f, "| FATAL | <%s: %i> ", fi, li); else if (level == OSIP_BUG) fprintf (f, "| BUG | <%s: %i> ", fi, li); else if (level == OSIP_ERROR) fprintf (f, "| ERROR | <%s: %i> ", fi, li); else if (level == OSIP_WARNING) fprintf (f, "|WARNING| <%s: %i> ", fi, li); else if (level == OSIP_INFO1) fprintf (f, "| INFO1 | <%s: %i> ", fi, li); else if (level == OSIP_INFO2) fprintf (f, "| INFO2 | <%s: %i> ", fi, li); else if (level == OSIP_INFO3) fprintf (f, "| INFO3 | <%s: %i> ", fi, li); else if (level == OSIP_INFO4) fprintf (f, "| INFO4 | <%s: %i> ", fi, li); vfprintf (f, chfr, ap); fflush (f); } else if (trace_func) { trace_func (fi, li, level, chfr, ap); }#if defined (HAVE_SYSLOG_H) && !defined(__arc__) else if (use_syslog == 1) { char buffer[512]; int in = 0; memset (buffer, 0, sizeof (buffer)); if (level == OSIP_FATAL) in = snprintf (buffer, 511, "| FATAL | <%s: %i> ", fi, li); else if (level == OSIP_BUG) in = snprintf (buffer, 511, "| BUG | <%s: %i> ", fi, li); else if (level == OSIP_ERROR) in = snprintf (buffer, 511, "| ERROR | <%s: %i> ", fi, li); else if (level == OSIP_WARNING) in = snprintf (buffer, 511, "|WARNING| <%s: %i> ", fi, li); else if (level == OSIP_INFO1) in = snprintf (buffer, 511, "| INFO1 | <%s: %i> ", fi, li); else if (level == OSIP_INFO2) in = snprintf (buffer, 511, "| INFO2 | <%s: %i> ", fi, li); else if (level == OSIP_INFO3) in = snprintf (buffer, 511, "| INFO3 | <%s: %i> ", fi, li); else if (level == OSIP_INFO4) in = snprintf (buffer, 511, "| INFO4 | <%s: %i> ", fi, li); vsnprintf (buffer + in, 511 - in, chfr, ap); if (level == OSIP_FATAL) syslog (LOG_ERR, "%s", buffer); else if (level == OSIP_BUG) syslog (LOG_ERR, "%s", buffer); else if (level == OSIP_ERROR) syslog (LOG_ERR, "%s", buffer); else if (level == OSIP_WARNING) syslog (LOG_WARNING, "%s", buffer); else if (level == OSIP_INFO1) syslog (LOG_INFO, "%s", buffer); else if (level == OSIP_INFO2) syslog (LOG_INFO, "%s", buffer); else if (level == OSIP_INFO3) syslog (LOG_DEBUG, "%s", buffer); else if (level == OSIP_INFO4) syslog (LOG_DEBUG, "%s", buffer); }#endif#ifdef SYSTEM_LOGGER_ENABLED else { char buffer[512]; int in = 0; memset (buffer, 0, sizeof (buffer)); if (level == OSIP_FATAL) in = _snprintf (buffer, 511, "| FATAL | <%s: %i> ", fi, li); else if (level == OSIP_BUG) in = _snprintf (buffer, 511, "| BUG | <%s: %i> ", fi, li); else if (level == OSIP_ERROR) in = _snprintf (buffer, 511, "| ERROR | <%s: %i> ", fi, li); else if (level == OSIP_WARNING) in = _snprintf (buffer, 511, "|WARNING| <%s: %i> ", fi, li); else if (level == OSIP_INFO1) in = _snprintf (buffer, 511, "| INFO1 | <%s: %i> ", fi, li); else if (level == OSIP_INFO2) in = _snprintf (buffer, 511, "| INFO2 | <%s: %i> ", fi, li); else if (level == OSIP_INFO3) in = _snprintf (buffer, 511, "| INFO3 | <%s: %i> ", fi, li); else if (level == OSIP_INFO4) in = _snprintf (buffer, 511, "| INFO4 | <%s: %i> ", fi, li); _vsnprintf (buffer + in, 511 - in, chfr, ap); OutputDebugString (buffer); }#endif va_end (ap);#endif return 0;}#if defined(WIN32) || defined(_WIN32_WCE)#undef osip_mallocvoid *osip_malloc (size_t size){ void *ptr = malloc (size); if (ptr != NULL) memset (ptr, 0, size); return ptr;}#undef osip_reallocvoid *osip_realloc (void *ptr, size_t size){ return realloc (ptr, size);}#undef osip_freevoidosip_free (void *ptr){ if (ptr == NULL) return; free (ptr);}#else#ifndef MINISIZEvoidosip_set_allocators (osip_malloc_func_t * malloc_func, osip_realloc_func_t * realloc_func, osip_free_func_t * free_func){ osip_malloc_func = malloc_func; osip_realloc_func = realloc_func; osip_free_func = free_func;}#endif#endif#if defined(__VXWORKS_OS__)typedef struct{ char *str; int max; int len;} _context;STATUS _cb_snprintf (char *buffer, int nc, int arg);STATUS_cb_snprintf (char *buffer, int nc, int arg){ _context *ctx = (_context *) arg; if (ctx->max - ctx->len - nc < 1) /* retain 1 pos for terminating \0 */ { nc = ctx->max - ctx->len - 1; } if (nc > 0) { memcpy (ctx->str + ctx->len, buffer, nc); ctx->len += nc; } ctx->str[ctx->len] = '\0'; return OK;}intosip_vsnprintf (char *buf, int max, const char *fmt, va_list ap){ _context ctx; ctx.str = buf; ctx.max = max; ctx.len = 0; if (fioFormatV (fmt, ap, _cb_snprintf, (int) &ctx) != OK) { return -1; } return ctx.len;}intosip_snprintf (char *buf, int max, const char *fmt, ...){ int retval; va_list ap; va_start (ap, fmt); retval = osip_vsnprintf (buf, max, fmt, ap); va_end (ap); return retval;}#endif#if defined(__PSOS__)intosip_snprintf (char *buf, int max, const char *fmt, ...){ static char buffer[1024]; int retval; va_list ap; buffer[0] = '\n'; va_start (ap, fmt); vsprintf (&(buffer[strlen (buffer)]), fmt, ap); va_end (ap); retval = strlen (buffer); memmove (buf, buffer, max); if (retval > max) return -1; return retval;}#endif#ifdef DEBUG_MEM/* This is a debug facility for detecting memory leaks. I recommend to use external tools such as mpatrol when possible. On some fancy platform, you may not have any usefull tools: in this case, use this code! */void *_osip_malloc (size_t size, char *file, unsigned short line){ void *mem; mem = osip_malloc_func (size + 20); if (mem != NULL) { char *s; memcpy (mem, &line, 2); for (s = file + strlen (file); s != file; s--) { if (*s == '\\' || *s == '/') { s++; break; } } strncpy ((char *) mem + 2, s, 18); return (void *) ((char *) mem + 20); } return NULL;}void_osip_free (void *ptr){ if (ptr != NULL) { osip_free_func ((char *) ptr - 20); }}void *_osip_realloc (void *ptr, size_t size, char *file, unsigned short line){ void *mem; mem = osip_realloc_func ((char *) ptr - 20, size + 20); if (mem != NULL) { char *s; memcpy (mem, &line, 2); for (s = file + strlen (file); s != file; s--) { if (*s == '\\' || *s == '/') { s++; break; } } strncpy ((char *) mem + 2, s, 18); return (char *) mem + 20; } return NULL;}#endif/* ---For better performance--- Calculates a hash value for the given string */unsigned longosip_hash (const char *str){ unsigned int hash = 5381; int c; while (c = *str++) hash = ((hash << 5) + hash) + c; return hash & 0xFFFFFFFFu;}/* ---For better performance--- Appends src-string to dst-string. This was introduced to replace the inefficient constructions like: osip_strncpy (tmp, src, strlen(src) ); tmp = tmp + strlen (src); This function returns a pointer to the end of the destination string Pre: src is null terminated */char *osip_str_append (char *dst, const char *src){ while (*src != '\0') { *dst = *src; src++; dst++; } *dst = '\0'; return dst;}/* ---For better performance--- Same as above, only this time we know the length */char *osip_strn_append (char *dst, const char *src, size_t len){ memmove ((void *) dst, (void *) src, len); dst += len; *dst = '\0'; return dst;}/* ---For better performance--- This is to replace this construction: osip_strncpy ( dest, source, length); osip_clrspace ( dest ); */#ifndef MINISIZEchar *osip_clrncpy (char *dst, const char *src, size_t len){ const char *pbeg; const char *pend; char *p; size_t spaceless_length; if (src == NULL) return NULL; /* find the start of relevant text */ pbeg = src; while ((' ' == *pbeg) || ('\r' == *pbeg) || ('\n' == *pbeg) || ('\t' == *pbeg)) pbeg++; /* find the end of relevant text */ pend = src + len - 1; while ((' ' == *pend) || ('\r' == *pend) || ('\n' == *pend) || ('\t' == *pend)) { pend--; if (pend < pbeg) { *dst = '\0'; return dst; } } /* if pend == pbeg there is only one char to copy */ spaceless_length = pend - pbeg + 1; /* excluding any '\0' */ memmove (dst, pbeg, spaceless_length); p = dst + spaceless_length; /* terminate the string and pad dest with zeros until len */ do { *p = '\0'; p++; spaceless_length++; } while (spaceless_length < len); return dst;}#elsechar *osip_clrncpy (char *dst, const char *src, size_t len){ osip_strncpy ( dst, src, len); osip_clrspace ( dst ); return dst;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -