mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
344 lines
8.8 KiB
344 lines
8.8 KiB
|
|
#include "sfs-hide.h"
|
|
#include "sfs-main.h"
|
|
#include "sfs-tree.h"
|
|
#include "sfs-find.h"
|
|
#include "sfs-edit.h"
|
|
|
|
#define Okay 0
|
|
#define Zero 0
|
|
|
|
static WORD TakeCareOfTimeUnits ( IEB_Edit * e, IEB_Find * f );
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetByteIndexFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
register QUAD v;
|
|
|
|
if ( GetQuadIndexFromNextToken ( e, f ) )
|
|
return e -> ErrorCode;
|
|
|
|
v = e -> QuadValueFound;
|
|
if ( v < e -> ByteLowerLimit || v > e -> ByteUpperLimit )
|
|
return e -> ErrorCode = ErrorOutsideLimits;
|
|
|
|
e -> ByteValueFound = v;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetPointerToNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
TEXT * p;
|
|
int token;
|
|
|
|
token = Zero;
|
|
p = e -> TokenSequence;
|
|
while ( token < f -> TokensTextResultedFrom[ e -> TokenToStartWith ] )
|
|
p += e -> TokenLengthSequence[ token ++ ] + 1;
|
|
|
|
e -> TokenPointerFound = p;
|
|
e -> TokenToStartWith ++ ;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetQuadIndexFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
TEXT * p;
|
|
register int c;
|
|
register QUAD v, w;
|
|
int length, token;
|
|
|
|
token = Zero;
|
|
p = e -> TokenSequence;
|
|
while ( token < f -> TokensTextResultedFrom[ e -> TokenToStartWith ] )
|
|
p += e -> TokenLengthSequence[ token ++ ] + 1;
|
|
|
|
v = Zero;
|
|
length = e -> TokenLengthSequence[ token ];
|
|
|
|
while ( length -- )
|
|
{
|
|
w = v;
|
|
v <<= 3;
|
|
v += ( w << 1 );
|
|
c = * p ++ ;
|
|
if ( c >= '0' && c <= '9' )
|
|
c -= '0';
|
|
else
|
|
return e -> ErrorCode = ErrorOtherThanDigit;
|
|
|
|
v += c;
|
|
}
|
|
if ( v < e -> QuadLowerLimit || v > e -> QuadUpperLimit )
|
|
return e -> ErrorCode = ErrorOutsideLimits;
|
|
|
|
e -> QuadValueFound = v;
|
|
e -> TokenToStartWith ++ ;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetQuadSizeFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
TEXT * p;
|
|
register int c;
|
|
register QUAD v, w;
|
|
int length, token;
|
|
|
|
token = Zero;
|
|
p = e -> TokenSequence;
|
|
while ( token < f -> TokensTextResultedFrom[ e -> TokenToStartWith ] )
|
|
p += e -> TokenLengthSequence[ token ++ ] + 1;
|
|
|
|
v = Zero;
|
|
length = e -> TokenLengthSequence[ token ];
|
|
|
|
while ( length -- )
|
|
{
|
|
c = * p ++ ;
|
|
if ( c >= '0' && c <= '9' )
|
|
{
|
|
c -= '0';
|
|
w = v;
|
|
v <<= 3;
|
|
v += ( w << 1 );
|
|
v += c;
|
|
}
|
|
else
|
|
{
|
|
if ( length )
|
|
return e -> ErrorCode = ErrorOtherThanDigit;
|
|
|
|
if ( c == 'K' )
|
|
{
|
|
v <<= 10;
|
|
if ( e -> TokenLengthSequence[ token ] > 1 )
|
|
break;
|
|
else
|
|
return e -> ErrorCode = ErrorNoDigits;
|
|
}
|
|
return e -> ErrorCode = ErrorOtherThanKay;
|
|
}
|
|
}
|
|
if ( v < e -> QuadLowerLimit || v > e -> QuadUpperLimit )
|
|
return e -> ErrorCode = ErrorOutsideLimits;
|
|
|
|
e -> QuadValueFound = v;
|
|
e -> TokenToStartWith ++ ;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetReferenceFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
GetByteIndexFromNextToken ( e, f );
|
|
return e -> ErrorCode;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetRepeatQuadFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
if ( GetUnsignedQuadFromNextToken ( e, f ) )
|
|
return e -> ErrorCode;
|
|
|
|
if ( f -> SearchModifiersFound & RepeatOnTimer )
|
|
if ( TakeCareOfTimeUnits ( e, f ) )
|
|
return e -> ErrorCode;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetSignedQuadSizeFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
TEXT * p;
|
|
register int c;
|
|
register QUAD v, w;
|
|
int length, sign, token;
|
|
|
|
token = Zero;
|
|
p = e -> TokenSequence;
|
|
while ( token < f -> TokensTextResultedFrom[ e -> TokenToStartWith ] )
|
|
p += e -> TokenLengthSequence[ token ++ ] + 1;
|
|
|
|
v = Zero;
|
|
length = e -> TokenLengthSequence[ token ];
|
|
|
|
if ( * p == '+' || * p == '-' )
|
|
{
|
|
if ( * p == '+' )
|
|
sign = 1;
|
|
else
|
|
sign = - 1;
|
|
|
|
if ( -- length < 1 )
|
|
return e -> ErrorCode = ErrorOnlySign;
|
|
p ++ ;
|
|
}
|
|
else
|
|
sign = 0;
|
|
|
|
while ( length -- )
|
|
{
|
|
c = * p ++ ;
|
|
if ( c >= '0' && c <= '9' )
|
|
{
|
|
c -= '0';
|
|
w = v;
|
|
v <<= 3;
|
|
v += ( w << 1 );
|
|
v += c;
|
|
}
|
|
else
|
|
{
|
|
if ( length )
|
|
return e -> ErrorCode = ErrorOtherThanDigit;
|
|
|
|
if ( c == 'K' )
|
|
{
|
|
v <<= 10;
|
|
|
|
if ( sign )
|
|
{
|
|
if ( e -> TokenLengthSequence[ token ] > 2 )
|
|
break;
|
|
}
|
|
else if ( e -> TokenLengthSequence[ token ] > 1 )
|
|
break;
|
|
|
|
return e -> ErrorCode = ErrorNoDigits;
|
|
}
|
|
return e -> ErrorCode = ErrorOtherThanKay;
|
|
}
|
|
}
|
|
if ( v < e -> QuadLowerLimit || v > e -> QuadUpperLimit )
|
|
return e -> ErrorCode = ErrorOutsideLimits;
|
|
|
|
if ( sign < Zero )
|
|
{
|
|
v = ~v;
|
|
v ++ ;
|
|
}
|
|
|
|
e -> QuadValueFound = v;
|
|
e -> TokenToStartWith ++ ;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetTimeQuadFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
if ( GetUnsignedQuadFromNextToken ( e, f ) )
|
|
return e -> ErrorCode;
|
|
|
|
if ( TakeCareOfTimeUnits ( e, f ) )
|
|
return e -> ErrorCode;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetUnsignedQuadFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
TEXT * p;
|
|
register int c;
|
|
register QUAD v, w;
|
|
int length, token;
|
|
|
|
token = Zero;
|
|
p = e -> TokenSequence;
|
|
while ( token < f -> TokensTextResultedFrom[ e -> TokenToStartWith ] )
|
|
p += e -> TokenLengthSequence[ token ++ ] + 1;
|
|
|
|
v = Zero;
|
|
length = e -> TokenLengthSequence[ token ];
|
|
|
|
while ( length -- )
|
|
{
|
|
w = v;
|
|
v <<= 3;
|
|
v += ( w << 1 );
|
|
c = * p ++ ;
|
|
if ( c >= '0' && c <= '9' )
|
|
c -= '0';
|
|
else
|
|
return e -> ErrorCode = ErrorOtherThanDigit;
|
|
|
|
v += c;
|
|
}
|
|
if ( v < e -> QuadLowerLimit || v > e -> QuadUpperLimit )
|
|
return e -> ErrorCode = ErrorOutsideLimits;
|
|
|
|
e -> QuadValueFound = v;
|
|
e -> TokenToStartWith ++ ;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD GetWordSizeFromNextToken ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
register QUAD v;
|
|
|
|
if ( GetQuadSizeFromNextToken ( e, f ) )
|
|
return e -> ErrorCode;
|
|
|
|
v = e -> QuadValueFound;
|
|
if ( v < e -> WordLowerLimit || v > e -> WordUpperLimit )
|
|
return e -> ErrorCode = ErrorOutsideLimits;
|
|
|
|
e -> WordValueFound = v;
|
|
|
|
return e -> ErrorCode = Okay;
|
|
}
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
WORD TakeCareOfTimeUnits ( IEB_Edit * e, IEB_Find * f )
|
|
/*---------------------------------------------------------------------------------*/
|
|
{
|
|
switch ( f -> SearchModifiersFound & TimeInUnits )
|
|
{
|
|
case TimeInHour:
|
|
if ( e -> QuadValueFound == 1 )
|
|
e -> QuadValueFound = 3600000;
|
|
else
|
|
return e -> ErrorCode = ErrorTimeOneHour;
|
|
break;
|
|
|
|
case TimeInHours:
|
|
e -> QuadValueFound *= 3600000;
|
|
break;
|
|
|
|
case TimeInMilliseconds:
|
|
break;
|
|
|
|
case TimeInMinutes:
|
|
e -> QuadValueFound *= 60000;
|
|
break;
|
|
|
|
case TimeInSeconds:
|
|
e -> QuadValueFound *= 1000;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return e -> ErrorCode = Okay;
|
|
}
|