00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #ifndef _LP64
00046 #include <sgidefs.h>
00047 #endif
00048 #include <cmplrs/leb128.h>
00049
00050 #define TRUE 1
00051 #define FALSE 0
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 int
00062 _leb128_signed_decode64(char *data, __int64_t *value)
00063 {
00064 unsigned char byte = *data;
00065 unsigned char sign = 0;
00066 __int64_t lvalue;
00067
00068 byte = *(data);
00069 if ((byte & 0x80) == 0) {
00070 lvalue = byte;
00071 sign = byte & 0x40;
00072 if (sign ) {
00073 lvalue |= - (1 << 7);
00074 }
00075 *value = lvalue;
00076 return 1;
00077 }
00078 else if ((*(data + 1) & 0x80) == 0) {
00079 lvalue = *data & 0x7f;
00080 byte = *(data + 1);
00081 lvalue |= (byte & 0x7f) << 7;
00082 sign = byte & 0x40;
00083 if(sign) {
00084 lvalue |= - (1 << 14);
00085 }
00086 *value = lvalue;
00087 return 2;
00088 }
00089 else if ((*(data + 2) & 0x80) == 0) {
00090 lvalue = *data & 0x7f;
00091 lvalue |= (*(data + 1) & 0x7f) << 7;
00092 byte = *(data +2);
00093 lvalue |= (byte & 0x7f) << 14;
00094 sign = byte & 0x40;
00095 if(sign) {
00096 lvalue |= - (1 << 21);
00097 }
00098 *value = lvalue;
00099 return 3;
00100 }
00101 else if ((*(data + 3) & 0x80) == 0) {
00102 lvalue = *data & 0x7f;
00103 lvalue |= (*(data + 1) & 0x7f) << 7;
00104 lvalue |= (*(data + 2) & 0x7f) << 14;
00105 byte = *(data +3);
00106 lvalue |= (byte & 0x7f) << 21;
00107 sign = byte & 0x40;
00108 if(sign) {
00109 lvalue |= - (1 << 28);
00110 }
00111 *value = lvalue;
00112 return 4;
00113 }
00114 else if ((*(data + 4) & 0x80) == 0) {
00115 lvalue = *data & 0x7f;
00116 lvalue |= (*(data + 1) & 0x7f) << 7;
00117 lvalue |= (*(data + 2) & 0x7f) << 14;
00118 lvalue |= (*(data + 3) & 0x7f) << 21;
00119 byte = *(data +4);
00120 lvalue |= ((__uint64_t)(byte & 0x7f)) << 28;
00121 sign = byte & 0x40;
00122 if(sign) {
00123 lvalue |= - (1ULL << 35);
00124 }
00125 *value = lvalue;
00126 return 5;
00127 }
00128 else if ((*(data + 5) & 0x80) == 0) {
00129 lvalue = *data & 0x7f;
00130 lvalue |= (*(data + 1) & 0x7f) << 7;
00131 lvalue |= (*(data + 2) & 0x7f) << 14;
00132 lvalue |= (*(data + 3) & 0x7f) << 21;
00133 lvalue |= ((__uint64_t)(*(data + 4) & 0x7f)) << 28;
00134 byte = *(data +5);
00135 lvalue |= ((__uint64_t)(byte & 0x7f)) << 35;
00136 sign = byte & 0x40;
00137 if(sign) {
00138 lvalue |= - (1ULL << 42);
00139 }
00140 *value = lvalue;
00141 return 6;
00142 }
00143 else if ((*(data + 6) & 0x80) == 0) {
00144 lvalue = *data & 0x7f;
00145 lvalue |= (*(data + 1) & 0x7f) << 7;
00146 lvalue |= (*(data + 2) & 0x7f) << 14;
00147 lvalue |= (*(data + 3) & 0x7f) << 21;
00148 lvalue |= ((__uint64_t)(*(data + 4) & 0x7f)) << 28;
00149 lvalue |= ((__uint64_t)(*(data + 5) & 0x7f)) << 35;
00150 byte = *(data +6);
00151 lvalue |= ((__uint64_t)(byte & 0x7f)) << 42;
00152 sign = byte & 0x40;
00153 if(sign) {
00154 lvalue |= - (1ULL << 49);
00155 }
00156 *value = lvalue;
00157 return 7;
00158 }
00159 else if ((*(data + 7) & 0x80) == 0) {
00160 lvalue = *data & 0x7f;
00161 lvalue |= (*(data + 1) & 0x7f) << 7;
00162 lvalue |= (*(data + 2) & 0x7f) << 14;
00163 lvalue |= (*(data + 3) & 0x7f) << 21;
00164 lvalue |= ((__uint64_t)(*(data + 4) & 0x7f)) << 28;
00165 lvalue |= ((__uint64_t)(*(data + 5) & 0x7f)) << 35;
00166 lvalue |= ((__uint64_t)(*(data + 6) & 0x7f)) << 42;
00167 byte = *(data +7);
00168 lvalue |= ((__uint64_t)(byte & 0x7f)) << 49;
00169 sign = byte & 0x40;
00170 if(sign) {
00171 lvalue |= - (1ULL << 56);
00172 }
00173 *value = lvalue;
00174 return 8;
00175 }
00176 else if ((*(data + 8) & 0x80) == 0) {
00177 lvalue = *data & 0x7f;
00178 lvalue |= (*(data + 1) & 0x7f) << 7;
00179 lvalue |= (*(data + 2) & 0x7f) << 14;
00180 lvalue |= (*(data + 3) & 0x7f) << 21;
00181 lvalue |= ((__uint64_t)(*(data + 4) & 0x7f)) << 28;
00182 lvalue |= ((__uint64_t)(*(data + 5) & 0x7f)) << 35;
00183 lvalue |= ((__uint64_t)(*(data + 6) & 0x7f)) << 42;
00184 lvalue |= ((__uint64_t)(*(data + 7) & 0x7f)) << 49;
00185 byte = *(data +8);
00186 lvalue |= ((__uint64_t)(byte & 0x7f)) << 56;
00187 sign = byte & 0x40;
00188 if(sign) {
00189
00190 lvalue |= (1ULL << 63);
00191 }
00192 *value = lvalue;
00193 return 9;
00194 }
00195 {
00196 lvalue = *data & 0x7f;
00197 lvalue |= (*(data + 1) & 0x7f) << 7;
00198 lvalue |= (*(data + 2) & 0x7f) << 14;
00199 lvalue |= (*(data + 3) & 0x7f) << 21;
00200 lvalue |= ((__uint64_t)(*(data + 4) & 0x7f)) << 28;
00201 lvalue |= ((__uint64_t)(*(data + 5) & 0x7f)) << 35;
00202 lvalue |= ((__uint64_t)(*(data + 6) & 0x7f)) << 42;
00203 lvalue |= ((__uint64_t)(*(data + 7) & 0x7f)) << 49;
00204 lvalue |= ((__uint64_t)(*(data + 8) & 0x7f)) << 56;
00205 byte = *(data +9);
00206
00207 lvalue |= ((__uint64_t)(byte & 0x7f)) << 63;
00208
00209
00210
00211 *value = lvalue;
00212 return 10;
00213 }
00214 }