NT4/private/sdktools/vctools/cvpack/utils6.c
2020-09-30 17:12:29 +02:00

164 lines
2.9 KiB
C

/*** utils6.c - utility routines
*
*/
#include "compact.h"
// Returns a long word read from a C6 Numeric field
// On return: *pusOldSize contains the old size (unless NULL passed in)
// *ppOld contains ptr to the field following the old numeric field
ulong C6GetLWordFromNumeric (uchar **ppOld, ushort *pusOldSize )
{
ulong ulRet;
ushort usOldSize;
uchar *pOld;
if (**ppOld < 0x80) {
ulRet = *(*ppOld)++;
if (pusOldSize){
*pusOldSize = 1;
}
return (ulRet);
}
pOld = *ppOld;
switch( *pOld++ ){
case 133:
// unsigned 16bit
usOldSize = 3;
ulRet = *((ushort UNALIGNED *)pOld)++;
break;
case 134:
// unsigned 32bit
usOldSize = 5;
ulRet = *((ulong UNALIGNED *)pOld)++;
break;
case 136:
// signed 8bit
usOldSize = 2;
ulRet = *((uchar *)pOld)++;
break;
case 137:
// signed 16bit
usOldSize = 3;
ulRet = *((ushort UNALIGNED *)pOld)++;
break;
case 138:
// signed 32bit
usOldSize = 5;
ulRet = *((ulong UNALIGNED *)pOld)++;
break;
default:
ErrorExit (ERR_INVALIDMOD, FormatMod (pCurMod), NULL);
break;
}
*ppOld = pOld;
if (pusOldSize){
*pusOldSize = usOldSize;
}
return (ulRet);
}
// Returns the size of the converted (new) numeric field
// *ppOld contains ptr to the field following the old numeric field
ushort ConvertNumeric (uchar **ppOld, uchar **ppNew)
{
ushort usRet;
uchar *pOld;
uchar *pNew;
ushort len;
if (**ppOld < 0x80) {
*((ushort *)(*ppNew))++ = *(*ppOld)++;
return (2);
}
pOld = *ppOld;
pNew = *ppNew;
switch( *pOld++ ){
case 130:
// length prefixed string
len = *pOld++;
usRet = len + 3;
*((ushort *)pNew)++ = LF_VARSTRING;
*((ushort *)pNew)++ = len;
for (; len > 0; len--) {
*pNew++ = *pOld++;
}
break;
case 133:
// unsigned 16bit
if (*((ushort *)pOld) >= LF_NUMERIC) {
*((ushort *)pNew)++ = LF_USHORT;
usRet = 4;
}
else {
// Collapse into new 16bit leaf index
usRet = 2;
}
*((ushort *)pNew)++ = *((ushort *)pOld)++; // Copy the value
break;
case 134:
// unsigned 32bit
*((ushort UNALIGNED *)pNew)++ = LF_ULONG;
*((ulong UNALIGNED *)pNew)++ = *((ulong UNALIGNED *)pOld)++;
usRet = 6;
break;
case 135:
// unsigned 64bit
DASSERT (FALSE); // This format was never used
break;
case 136:
// signed 8bit
*((ushort UNALIGNED *)pNew)++ = LF_CHAR;
*((uchar *)pNew)++ = *((uchar *)pOld)++;
usRet = 3;
break;
case 137:
// signed 16bit
*((ushort UNALIGNED *)pNew)++ = LF_SHORT;
*((ushort UNALIGNED *)pNew)++ = *((ushort UNALIGNED *)pOld)++;
usRet = 4;
break;
case 138:
// signed 32bit
*((ushort UNALIGNED *)pNew)++ = LF_LONG;
*((ulong UNALIGNED *)pNew)++ = *((ulong UNALIGNED *)pOld)++;
usRet = 6;
break;
case 139:
// signed 64bit
DASSERT (FALSE); // This format was never used
break;
default:
DASSERT (FALSE);
break;
}
*ppNew = pNew;
*ppOld = pOld;
return (usRet);
}