|
8 | 8 | #include"libblobstamper.h" |
9 | 9 |
|
10 | 10 |
|
11 | | -Blob::Blob (char * data_in,int size_in) |
12 | | -{ |
13 | | - data = data_in; |
14 | | - size = size_in; |
15 | | - begin =0; |
16 | | - end = size -1;/* i.e. size=1 means begin=0 && end=0*/ |
17 | | -} |
18 | | - |
19 | | -bool |
20 | | -Blob::isEmpty () |
21 | | -{ |
22 | | -if (! data)returntrue; |
23 | | -returnfalse; |
24 | | -} |
25 | | - |
26 | | -/* Borrowed from http://www.stahlworks.com/dev/index.php?tool=csc01*/ |
27 | | -/* Code is not nice for support, better rewrite it*/ |
28 | | - |
29 | | -voidhexdump(void *pAddressIn,long lSize) |
30 | | -{ |
31 | | -char szBuf[100]; |
32 | | -long lIndent =1; |
33 | | -long lOutLen, lIndex, lIndex2, lOutLen2; |
34 | | -long lRelPos; |
35 | | -struct {char *pData;unsignedlong lSize; } buf; |
36 | | -unsignedchar *pTmp,ucTmp; |
37 | | -unsignedchar *pAddress = (unsignedchar *)pAddressIn; |
38 | | - |
39 | | - buf.pData = (char *)pAddress; |
40 | | - buf.lSize = lSize; |
41 | | - |
42 | | -while (buf.lSize >0) |
43 | | - { |
44 | | - pTmp = (unsignedchar *)buf.pData; |
45 | | - lOutLen = (int)buf.lSize; |
46 | | -if (lOutLen >16) |
47 | | - lOutLen =16; |
48 | | - |
49 | | -// create a 64-character formatted output line: |
50 | | -sprintf(szBuf," >" |
51 | | -"" |
52 | | -" %08lX", pTmp-pAddress); |
53 | | - lOutLen2 = lOutLen; |
54 | | - |
55 | | -for(lIndex =1+lIndent, lIndex2 =53-15+lIndent, lRelPos =0; |
56 | | - lOutLen2; |
57 | | - lOutLen2--, lIndex +=2, lIndex2++ |
58 | | - ) |
59 | | - { |
60 | | - ucTmp = *pTmp++; |
61 | | - |
62 | | -sprintf(szBuf + lIndex,"%02X", (unsignedshort)ucTmp); |
63 | | -if(!isprint(ucTmp)) ucTmp ='.';// nonprintable char |
64 | | - szBuf[lIndex2] = ucTmp; |
65 | | - |
66 | | -if (!(++lRelPos &3))// extra blank after 4 bytes |
67 | | - { lIndex++; szBuf[lIndex+2] =''; } |
68 | | - } |
69 | | - |
70 | | -if (!(lRelPos &3)) lIndex--; |
71 | | - |
72 | | - szBuf[lIndex ] ='\t'; |
73 | | - szBuf[lIndex+1] ='\t'; |
74 | | - |
75 | | -printf("%s\n", szBuf); |
76 | | - |
77 | | - buf.pData += lOutLen; |
78 | | - buf.lSize -= lOutLen; |
79 | | - } |
80 | | -} |
81 | | - |
82 | | - |
83 | | -void |
84 | | -Blob::Dump() |
85 | | -{ |
86 | | -int length = end - begin +1 ; |
87 | | -hexdump(data + begin, length); |
88 | | -} |
89 | | - |
90 | | -Blob |
91 | | -Blob::ShiftBytes(size_t n) |
92 | | -{ |
93 | | -if (begin + n > end) |
94 | | - { |
95 | | - Blobempty(NULL, -1); |
96 | | -return empty;/* not enough data*/ |
97 | | - } |
98 | | - |
99 | | - Blobnew_blob(data, size); |
100 | | - |
101 | | - new_blob.begin = begin;/* FIXME this should go private once*/ |
102 | | - new_blob.end = begin + n -1; |
103 | | - |
104 | | - begin += n; |
105 | | - |
106 | | -return new_blob; |
107 | | -} |
108 | | - |
109 | | -void * |
110 | | -Blob::ShiftSingleStampBin(StampGeneric& stmp) |
111 | | -{ |
112 | | -return stmp.Extract(*this); |
113 | | -} |
114 | | - |
115 | | -std::string |
116 | | -Blob::ShiftSingleStampStr(StampGeneric& stmp) |
117 | | -{ |
118 | | -return stmp.ExtractStr(*this); |
119 | | -} |
120 | | - |
121 | 11 | /*************************************************************************************/ |
122 | 12 |
|
123 | 13 | std::list<std::string>StampList::ExtractStrList(Blob &blob) |
|