00001 /* 00002 This product contains certain software code or other information 00003 ("AT&T Software") proprietary to AT&T Corp. ("AT&T"). The AT&T 00004 Software is provided to you "AS IS". YOU ASSUME TOTAL RESPONSIBILITY 00005 AND RISK FOR USE OF THE AT&T SOFTWARE. AT&T DOES NOT MAKE, AND 00006 EXPRESSLY DISCLAIMS, ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND 00007 WHATSOEVER, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 00008 MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, WARRANTIES OF 00009 TITLE OR NON-INFRINGEMENT OF ANY INTELLECTUAL PROPERTY RIGHTS, ANY 00010 WARRANTIES ARISING BY USAGE OF TRADE, COURSE OF DEALING OR COURSE OF 00011 PERFORMANCE, OR ANY WARRANTY THAT THE AT&T SOFTWARE IS "ERROR FREE" OR 00012 WILL MEET YOUR REQUIREMENTS. 00013 00014 Unless you accept a license to use the AT&T Software, you shall not 00015 reverse compile, disassemble or otherwise reverse engineer this 00016 product to ascertain the source code for any AT&T Software. 00017 00018 (c) AT&T Corp. All rights reserved. AT&T is a registered trademark of AT&T Corp. 00019 00020 *********************************************************************** 00021 00022 History: 00023 00024 24/11/99 - initial release by Hartmut Liefke, liefke@seas.upenn.edu 00025 Dan Suciu, suciu@research.att.com 00026 */ 00027 00028 //************************************************************************** 00029 //************************************************************************** 00030 00031 // This module contains several auxiliary functions for loading compressed 00032 // integer from a given data buffer 00033 00034 00035 #ifndef LOAD_HPP 00036 #define LOAD_HPP 00037 00038 typedef unsigned char TInputPtr; 00039 00040 inline char LoadChar(unsigned char * &ptr) 00041 // Loads a single character 00042 { 00043 return (char)*(ptr++); 00044 } 00045 00046 //*********************************************************************** 00047 00048 inline unsigned long LoadUInt32(unsigned char * &ptr) 00049 // Loads a compressed unsigned integer 00050 { 00051 if(*ptr<128) 00052 return (unsigned)*(ptr++); 00053 else 00054 { 00055 if(*ptr<192) 00056 { 00057 ptr+=2; 00058 return (((unsigned)ptr[-2]-128)<<8)+(unsigned)ptr[-1]; 00059 } 00060 else 00061 { 00062 ptr+=4; 00063 return (((unsigned)ptr[-4]-192)<<24)+ 00064 (((unsigned)ptr[-3])<<16)+ 00065 (((unsigned)ptr[-2])<<8)+ 00066 (unsigned)ptr[-1]; 00067 } 00068 } 00069 } 00070 00071 //*********************************************************************** 00072 00073 inline unsigned long LoadSInt32(TInputPtr * &ptr,char *isneg) 00074 // Loads a compressed signed integer 00075 { 00076 if(*ptr<128) 00077 { 00078 *isneg=((*ptr & 64) ? 1 : 0); 00079 return (unsigned long)(*(ptr++)&63); 00080 } 00081 else 00082 { 00083 *isneg=((*ptr & 32) ? 1 : 0); 00084 00085 if(*ptr<192) 00086 { 00087 ptr+=2; 00088 return ((unsigned long)(ptr[-2]&31)<<8)+(unsigned long)ptr[-1]; 00089 } 00090 else 00091 { 00092 ptr+=4; 00093 return ((unsigned long)(ptr[-4]&31)<<24)+((unsigned long)ptr[-3]<<16)+ 00094 ((unsigned long)ptr[-2]<<8)+(unsigned long)ptr[-1]; 00095 } 00096 } 00097 } 00098 00099 //*********************************************************************** 00100 00101 inline unsigned char *LoadData(unsigned char * &ptr,unsigned long len) 00102 // Returns data block of length 'len' 00103 { 00104 ptr+=len; 00105 return ptr-len; 00106 } 00107 00108 //*********************************************************************** 00109 00110 inline void LoadDataBlock(TInputPtr * &ptr,unsigned char *dest,unsigned long len) 00111 // Copies a data block of length 'len' into '*dest' 00112 { 00113 while(len--) 00114 { 00115 *dest=*ptr; 00116 ptr++; 00117 dest++; 00118 } 00119 } 00120 00121 #endif