164 lines
2.9 KiB
C
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);
|
||
|
}
|