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
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001