printhandler.c
来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 272 行
C
272 行
/* * Copyright (C) 2004-2005 by Objective Systems, Inc. * * This software is furnished under an open source license and may be * used and copied only in accordance with the terms of this license. * The text of the license may generally be found in the root * directory of this installation in the COPYING file. It * can also be viewed online at the following URL: * * http://www.obj-sys.com/open/license.html * * Any redistributions of this file including modified versions must * maintain this copyright notice. * *****************************************************************************//* This is an implementation of a simple print handler. It outputs the fields of an encoded PER message to stdout in a structured output format..*/#include <stdlib.h>#ifdef HAVE_MALLOC_H#include <malloc.h>#endif#include "printHandler.h"#include "ootypes.h"#include "rtctype.h"#include "ootrace.h"static const char* pVarName;static int gIndentSpaces;static const char* bitStrToString (ASN1UINT numbits, const ASN1OCTET* data, char* buffer, size_t bufsiz);static const char* octStrToString (ASN1UINT numocts, const ASN1OCTET* data, char* buffer, size_t bufsiz);void initializePrintHandler(EventHandler *printHandler, char * varname){ printHandler->startElement = &printStartElement; printHandler->endElement = &printEndElement; printHandler->boolValue = &printBoolValue; printHandler->intValue = &printIntValue; printHandler->uIntValue = &printuIntValue ; printHandler->bitStrValue = &printBitStrValue; printHandler->octStrValue = &printOctStrValue; printHandler->charStrValue = &printCharStrValue; printHandler->charStr16BitValue = &printCharStr16BitValue ; printHandler->nullValue = &printNullValue; printHandler->oidValue = &printOidValue; printHandler->enumValue = &printEnumValue; printHandler->openTypeValue = &printOpenTypeValue; pVarName = varname; OOTRACEDBGB2("%s = {\n", pVarName); gIndentSpaces += 3;}void finishPrint(){ OOTRACEDBGB1 ("}\n"); gIndentSpaces -= 3; if (gIndentSpaces != 0) { OOTRACEDBGB1 ("ERROR: unbalanced structure\n"); }}void indent (){ int i=0; for (i = 0; i < gIndentSpaces; i++) OOTRACEDBGB1 (" ");}void printStartElement (const char* name, int index){ indent (); OOTRACEDBGB1 (name); if (index >= 0) OOTRACEDBGB2 ("[%d]", index); OOTRACEDBGB1 (" = {\n"); gIndentSpaces += 3;}void printEndElement (const char* name, int index){ gIndentSpaces -= 3; indent (); OOTRACEDBGB1 ("}\n");}void printBoolValue (ASN1BOOL value){ const char* s = value ? "TRUE" : "FALSE"; indent (); OOTRACEDBGB2 ("%s\n", s);}void printIntValue (ASN1INT value){ indent (); OOTRACEDBGB2 ("%d\n", value);}void printuIntValue (ASN1UINT value){ indent (); OOTRACEDBGB2 ("%u\n", value);}void printBitStrValue (ASN1UINT numbits, const ASN1OCTET* data){#ifdef __MINGW32__ char s[numbits + 8]; indent (); OOTRACEDBGB2("%s\n", bitStrToString (numbits, data, s, numbits+8));#else char* s = (char*)malloc(numbits + 8); indent (); OOTRACEDBGB2("%s\n", bitStrToString (numbits, data, s, numbits+8)); free(s);#endif}void printOctStrValue (ASN1UINT numocts, const ASN1OCTET* data){ int bufsiz = (numocts * 2) + 8;#ifdef __MINGW32__ char s[bufsiz]; indent (); OOTRACEDBGB2 ("%s\n", octStrToString (numocts, data, s, bufsiz));#else char* s = (char*)malloc(bufsiz); indent (); OOTRACEDBGB2 ("%s\n", octStrToString (numocts, data, s, bufsiz)); free(s);#endif}void printCharStrValue (const char* value){ indent (); OOTRACEDBGB2 ("\"%s\"\n", value);}void printCharStr16BitValue (ASN1UINT nchars, ASN116BITCHAR* data){ ASN1UINT ui; indent (); for (ui = 0; ui < nchars; ui++) { if (data[ui] >= 32 && data[ui] <= 127) OOTRACEDBGB2 ("%c", (char)data[ui]); else OOTRACEDBGB1 ("?"); } OOTRACEDBGB1 ("\n");}void printCharStr32BitValue (ASN1UINT nchars, ASN132BITCHAR* data){ ASN1UINT ui; indent (); for ( ui = 0; ui < nchars; ui++) { if (data[ui] >= 32 && data[ui] <= 127) OOTRACEDBGB2 ("%c", (char)data[ui]); else OOTRACEDBGB2 ("\\%d", data[ui]); } OOTRACEDBGB1 ("\n");}void printNullValue (){ indent (); OOTRACEDBGB1 ("NULL\n");}void ooPrintOIDValue (ASN1OBJID* pOID){ ASN1UINT ui; OOTRACEDBGB1 ("{ \n"); for (ui = 0; ui < pOID->numids; ui++) { OOTRACEDBGB2 ("%d ", pOID->subid[ui]); } OOTRACEDBGB1 ("}\n");}void printOidValue (ASN1UINT numSubIds, ASN1UINT* pSubIds){ ASN1UINT ui; ASN1OBJID oid; oid.numids = numSubIds; for ( ui = 0; ui < numSubIds; ui++) oid.subid[ui] = pSubIds[ui]; indent (); ooPrintOIDValue (&oid);}void printRealValue (double value){ indent (); OOTRACEDBGB2 ("%f\n", value);}void printEnumValue (ASN1UINT value){ indent (); OOTRACEDBGB2 ("%u\n", value);}void printOpenTypeValue (ASN1UINT numocts, const ASN1OCTET* data){ indent (); OOTRACEDBGB1 ("< encoded data >\n");}static const char* bitStrToString (ASN1UINT numbits, const ASN1OCTET* data, char* buffer, size_t bufsiz){ size_t i; unsigned char mask = 0x80; if (bufsiz > 0) { buffer[0] = '\''; for (i = 0; i < numbits; i++) { if (i < bufsiz - 1) { buffer[i+1] = (char) (((data[i/8] & mask) != 0) ? '1' : '0'); mask >>= 1; if (0 == mask) mask = 0x80; } else break; } i++; if (i < bufsiz - 1) buffer[i++] = '\''; if (i < bufsiz - 1) buffer[i++] = 'B'; if (i < bufsiz - 1) buffer[i] = '\0'; else buffer[bufsiz - 1] = '\0'; } return buffer;}static const char* octStrToString (ASN1UINT numocts, const ASN1OCTET* data, char* buffer, size_t bufsiz){ size_t i; char lbuf[4]; if (bufsiz > 0) { buffer[0] = '\''; if (bufsiz > 1) buffer[1] = '\0'; for (i = 0; i < numocts; i++) { if (i < bufsiz - 1) { sprintf (lbuf, "%02x", data[i]); strcat (&buffer[(i*2)+1], lbuf); } else break; } i = i*2 + 1; if (i < bufsiz - 1) buffer[i++] = '\''; if (i < bufsiz - 1) buffer[i++] = 'H'; if (i < bufsiz - 1) buffer[i] = '\0'; else buffer[bufsiz - 1] = '\0'; } return buffer;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?