|
@@ -78,6 +78,8 @@ interface
|
|
|
|
|
|
tspecialgenerictoken = (ST_LOADSETTINGS,ST_LINE,ST_COLUMN,ST_FILEINDEX);
|
|
tspecialgenerictoken = (ST_LOADSETTINGS,ST_LINE,ST_COLUMN,ST_FILEINDEX);
|
|
|
|
|
|
|
|
+ { tscannerfile }
|
|
|
|
+
|
|
tscannerfile = class
|
|
tscannerfile = class
|
|
private
|
|
private
|
|
procedure do_gettokenpos(out tokenpos: longint; out filepos: tfileposinfo);
|
|
procedure do_gettokenpos(out tokenpos: longint; out filepos: tfileposinfo);
|
|
@@ -85,6 +87,8 @@ interface
|
|
procedure setnexttoken;
|
|
procedure setnexttoken;
|
|
procedure savetokenpos;
|
|
procedure savetokenpos;
|
|
procedure restoretokenpos;
|
|
procedure restoretokenpos;
|
|
|
|
+ procedure writetoken(t: ttoken);
|
|
|
|
+ function readtoken : ttoken;
|
|
public
|
|
public
|
|
inputfile : tinputfile; { current inputfile list }
|
|
inputfile : tinputfile; { current inputfile list }
|
|
inputfilecount : longint;
|
|
inputfilecount : longint;
|
|
@@ -2057,6 +2061,20 @@ In case not, the value returned can be arbitrary.
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ procedure tscannerfile.writetoken(t : ttoken);
|
|
|
|
+ var
|
|
|
|
+ b : byte;
|
|
|
|
+ begin
|
|
|
|
+ if ord(t)>$7f then
|
|
|
|
+ begin
|
|
|
|
+ b:=(ord(t) shr 8) or $80;
|
|
|
|
+ recordtokenbuf.write(b,1);
|
|
|
|
+ end;
|
|
|
|
+ b:=ord(t) and $ff;
|
|
|
|
+ recordtokenbuf.write(b,1);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure tscannerfile.recordtoken;
|
|
procedure tscannerfile.recordtoken;
|
|
var
|
|
var
|
|
t : ttoken;
|
|
t : ttoken;
|
|
@@ -2071,7 +2089,7 @@ In case not, the value returned can be arbitrary.
|
|
begin
|
|
begin
|
|
{ use a special token to record it }
|
|
{ use a special token to record it }
|
|
s:=ST_LOADSETTINGS;
|
|
s:=ST_LOADSETTINGS;
|
|
- recordtokenbuf.write(t,SizeOf(t));
|
|
|
|
|
|
+ writetoken(t);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(current_settings,sizeof(current_settings));
|
|
recordtokenbuf.write(current_settings,sizeof(current_settings));
|
|
last_settings:=current_settings;
|
|
last_settings:=current_settings;
|
|
@@ -2081,7 +2099,7 @@ In case not, the value returned can be arbitrary.
|
|
if current_tokenpos.line<>last_filepos.line then
|
|
if current_tokenpos.line<>last_filepos.line then
|
|
begin
|
|
begin
|
|
s:=ST_LINE;
|
|
s:=ST_LINE;
|
|
- recordtokenbuf.write(t,SizeOf(t));
|
|
|
|
|
|
+ writetoken(t);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(current_tokenpos.line,sizeof(current_tokenpos.line));
|
|
recordtokenbuf.write(current_tokenpos.line,sizeof(current_tokenpos.line));
|
|
last_filepos.line:=current_tokenpos.line;
|
|
last_filepos.line:=current_tokenpos.line;
|
|
@@ -2089,7 +2107,7 @@ In case not, the value returned can be arbitrary.
|
|
if current_tokenpos.column<>last_filepos.column then
|
|
if current_tokenpos.column<>last_filepos.column then
|
|
begin
|
|
begin
|
|
s:=ST_COLUMN;
|
|
s:=ST_COLUMN;
|
|
- recordtokenbuf.write(t,SizeOf(t));
|
|
|
|
|
|
+ writetoken(t);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(current_tokenpos.column,sizeof(current_tokenpos.column));
|
|
recordtokenbuf.write(current_tokenpos.column,sizeof(current_tokenpos.column));
|
|
last_filepos.column:=current_tokenpos.column;
|
|
last_filepos.column:=current_tokenpos.column;
|
|
@@ -2097,15 +2115,15 @@ In case not, the value returned can be arbitrary.
|
|
if current_tokenpos.fileindex<>last_filepos.fileindex then
|
|
if current_tokenpos.fileindex<>last_filepos.fileindex then
|
|
begin
|
|
begin
|
|
s:=ST_FILEINDEX;
|
|
s:=ST_FILEINDEX;
|
|
- recordtokenbuf.write(t,SizeOf(t));
|
|
|
|
|
|
+ writetoken(t);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(s,1);
|
|
recordtokenbuf.write(current_tokenpos.fileindex,sizeof(current_tokenpos.fileindex));
|
|
recordtokenbuf.write(current_tokenpos.fileindex,sizeof(current_tokenpos.fileindex));
|
|
last_filepos.fileindex:=current_tokenpos.fileindex;
|
|
last_filepos.fileindex:=current_tokenpos.fileindex;
|
|
end;
|
|
end;
|
|
|
|
|
|
- recordtokenbuf.write(token,SizeOf(token));
|
|
|
|
|
|
+ writetoken(token);
|
|
if token<>_GENERICSPECIALTOKEN then
|
|
if token<>_GENERICSPECIALTOKEN then
|
|
- recordtokenbuf.write(idtoken,SizeOf(idtoken));
|
|
|
|
|
|
+ writetoken(idtoken);
|
|
case token of
|
|
case token of
|
|
_CWCHAR,
|
|
_CWCHAR,
|
|
_CWSTRING :
|
|
_CWSTRING :
|
|
@@ -2160,6 +2178,21 @@ In case not, the value returned can be arbitrary.
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
+ function tscannerfile.readtoken: ttoken;
|
|
|
|
+ var
|
|
|
|
+ b,b2 : byte;
|
|
|
|
+ begin
|
|
|
|
+ replaytokenbuf.read(b,1);
|
|
|
|
+ if (b and $80)<>0 then
|
|
|
|
+ begin
|
|
|
|
+ replaytokenbuf.read(b2,1);
|
|
|
|
+ result:=ttoken(((b and $7f) shl 8) or b2);
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ result:=ttoken(b);
|
|
|
|
+ end;
|
|
|
|
+
|
|
|
|
+
|
|
procedure tscannerfile.replaytoken;
|
|
procedure tscannerfile.replaytoken;
|
|
var
|
|
var
|
|
wlen : sizeint;
|
|
wlen : sizeint;
|
|
@@ -2184,9 +2217,9 @@ In case not, the value returned can be arbitrary.
|
|
end;
|
|
end;
|
|
repeat
|
|
repeat
|
|
{ load token from the buffer }
|
|
{ load token from the buffer }
|
|
- replaytokenbuf.read(token,SizeOf(token));
|
|
|
|
|
|
+ token:=readtoken;
|
|
if token<>_GENERICSPECIALTOKEN then
|
|
if token<>_GENERICSPECIALTOKEN then
|
|
- replaytokenbuf.read(idtoken,SizeOf(idtoken))
|
|
|
|
|
|
+ idtoken:=readtoken
|
|
else
|
|
else
|
|
idtoken:=_NOID;
|
|
idtoken:=_NOID;
|
|
case token of
|
|
case token of
|