227 lines
6.8 KiB
Plaintext
227 lines
6.8 KiB
Plaintext
unit utssvr_tsltoken_c;
|
|
interface
|
|
function get_sys_functions();
|
|
function get_tsl_tokenizeex(s,flg);
|
|
implementation
|
|
uses cstructurelib;
|
|
function get_sys_functions();
|
|
begin
|
|
return static get_tokener().tslL_getfunctions();
|
|
end
|
|
function get_tsl_tokenizeex(s,flg);
|
|
begin
|
|
o := get_tokener();
|
|
o.flags := flg;
|
|
o.source := s;
|
|
return o.result();
|
|
end
|
|
function get_tokener();
|
|
begin
|
|
return static new t_tsltokenex2();
|
|
end
|
|
|
|
type t_tsltokenex2 = class() //脚本解析
|
|
{$ifdef linux}
|
|
static const C_TSSVRAPI="libTSSVRAPI.so";
|
|
static const C_PLUGIN="libTSLPlugin.so";
|
|
static const C_TSLInterp="libTSLInterp.so";
|
|
{$else}
|
|
static const C_TSSVRAPI="TSSVRAPI.dll";
|
|
static const C_PLUGIN="TSLPlugin.dll";
|
|
static const C_TSLInterp="TSLInterp.dll";
|
|
{$endif}
|
|
public
|
|
function create();
|
|
begin
|
|
//TSL_TokenizeEx2(s,flg);
|
|
fsource := array();
|
|
fresult := array();
|
|
skiperror := true;
|
|
fflags := 2^13-1;
|
|
end
|
|
function tslL_getfunctions();//系统函数
|
|
begin
|
|
//return array();
|
|
fs := 0;
|
|
cnt := 0;
|
|
_f_ := static procedure(var fs:pointer;var cnt:integer);cdecl ;external getdlsymaddress(C_PLUGIN,functionname(1));
|
|
##_f_(fs,ct);
|
|
return strs_ptr_to_array(fs,ct-1,1);
|
|
end
|
|
property source read fsource write set_source;
|
|
property result read get_result;
|
|
property flags read fflags write set_lags;
|
|
private
|
|
function strs_ptr_to_array(ps,n,fr); //一维字符串数组
|
|
begin
|
|
mt := get_mem_mgr();
|
|
r := array();
|
|
i := 0;
|
|
if ps=0 then return r;
|
|
while true do
|
|
begin
|
|
if n>0 and i>=n then break;
|
|
p := mt.readptr(ps+8*i);
|
|
if p=0 then
|
|
begin
|
|
n := i-1;
|
|
break;
|
|
end
|
|
r[i] := mt.readstr(p);
|
|
if not fr then
|
|
mt.tfree(p);
|
|
i++;
|
|
end
|
|
return r;
|
|
end
|
|
function strs_ptr_to_array2(ps,n);//二维字符串数组
|
|
begin
|
|
mt := get_mem_mgr();
|
|
r := array();
|
|
if ps=0 then return r;
|
|
i := 0;
|
|
while true do
|
|
begin
|
|
if n>0 and i>=n then break;
|
|
p := mt.readptr(ps+8*i);
|
|
if p=0 then
|
|
begin
|
|
n := i;
|
|
break;
|
|
end
|
|
r[i] := strs_ptr_to_array(p);
|
|
i++;
|
|
end
|
|
mt.tfree(ps);
|
|
return r;
|
|
end
|
|
function ints_ptr_to_array(ps,n,flg);
|
|
begin
|
|
mt := get_mem_mgr();
|
|
r := array();
|
|
if ps=0 then return r;
|
|
i := 0;
|
|
while true do
|
|
begin
|
|
if i>=n then break;
|
|
t := mt.readint(ps+4*i);
|
|
if t=flg then break;
|
|
r[i] := t;
|
|
i++;
|
|
end
|
|
mt.tfree(ps);
|
|
return r;
|
|
end
|
|
function TSL_InterpNewErrorInfo();
|
|
begin
|
|
_f_ := static function():pointer;cdecl;external getdlsymaddress(C_TSLInterp,functionname(1));
|
|
return static ##_f_();
|
|
end
|
|
|
|
function TSL_TokenizeEx2();
|
|
begin
|
|
oResult := TSL_InterpNewErrorInfo();
|
|
_f_ := static function(sc:string;skiperror:integer;
|
|
var sWords:pointer; var sUnits:pointer;
|
|
var sClasses:pointer;var sFunctions:pointer;
|
|
var iLines:pointer;var iBeginEnds:pointer;
|
|
var Dependency:pointer;var retBlocks:pointer;
|
|
var retBlockCount:integer;fflags:integer; oResult:pointer):integer;cdecl;external getdlsymaddress(C_TSLInterp,functionname(1));
|
|
//echo _f_;
|
|
##_f_(fsource,true,sWords,sUnits,sClasses,sFunctions,iLines,iBeginEnds,sDependency,retBlocks,retBlockCount,fflags,oResult);
|
|
fresult := array();
|
|
fresult["words"] :=strs_ptr_to_array(sWords);
|
|
fresult["units"] :=strs_ptr_to_array(sUnits);
|
|
fresult["class"] :=strs_ptr_to_array(sClasses);
|
|
n := 0;
|
|
fresult["functions"] := strs_ptr_to_array2(sFunctions,n);
|
|
fresult["lines"] := ints_ptr_to_array(iLines,n);
|
|
fresult["linebegend"] := ints_ptr_to_array(iBeginEnds,nil,-1);
|
|
fresult["dep"] := strs_ptr_to_array(sDependency);
|
|
fresult["blcks"] := getblicks(retBlocks,retBlockCount);
|
|
end
|
|
function getblicks(ptr,n);
|
|
begin
|
|
r := array();
|
|
if ptr=0 then return r;
|
|
mt := get_mem_mgr();
|
|
for i := 0 to n-1 do
|
|
begin
|
|
p := mt.readptr(ptr+i*8);
|
|
bki := new BlockForEditor(p);
|
|
r[i,"mtype"] := bki._getvalue_("mType");
|
|
r[i,"mbeg"] := bki._getvalue_("mBeg");
|
|
r[i,"mend"] := bki._getvalue_("mEnd");
|
|
ct := bki._getvalue_("mSubs");
|
|
r[i,"msubs"] := ct;
|
|
if ct>0 then
|
|
r[i,"msub"] := getblicks(bki._getvalue_("mSub"),ct);
|
|
end
|
|
return r;
|
|
end
|
|
function get_result();
|
|
begin
|
|
if ifnil(fresult) then
|
|
begin
|
|
TSL_TokenizeEx2();
|
|
end
|
|
return fresult;
|
|
end
|
|
function set_source(s);
|
|
begin
|
|
if fsource<>s and ifstring(s) then
|
|
begin
|
|
fsource := s;
|
|
fresult := nil;
|
|
end
|
|
end
|
|
function set_lags(f);
|
|
begin
|
|
if f>0 and f<>fflags then
|
|
begin
|
|
fflags := f;
|
|
fresult := nil;
|
|
end
|
|
end
|
|
private
|
|
fsource;
|
|
fflags;
|
|
fresult;
|
|
private
|
|
static const Block_TypeClass = 1;
|
|
static const Block_Function = 2;
|
|
static const Block_Statements = 4;
|
|
static const Block_If = 8;
|
|
static const Block_Else = 16;
|
|
static const Block_SubCase = 32;
|
|
static const Block_Goto_Label = 64;
|
|
static const Block_Empty_Begin_End = 128;
|
|
static const Block_Try = 256;
|
|
static const Block_NeedSql = 512;
|
|
static const Block_UnitStruct = 1024;
|
|
static const Block_Propertys = 2048;
|
|
static const Block_Fields = 4096;
|
|
end
|
|
type BlockForEditor=class(tslcstructureobj)
|
|
public
|
|
function create(ptr)
|
|
begin
|
|
inherited create(getstruct(),ptr);
|
|
end
|
|
private
|
|
static SSTRUCT;
|
|
class function getstruct()
|
|
begin
|
|
if not SSTRUCT then SSTRUCT := MemoryAlignmentCalculate(array(
|
|
("mType","int",0),
|
|
("mBeg","int",0),
|
|
("mEnd","int",0),
|
|
("mSubs","int",0),
|
|
("mFolded","int",0), //这个字段什么意思
|
|
("mSub","intptr",0),
|
|
("Clear","intptr",0) //cptr := _getvalue_("Clear"); f := procedure();cdecl;external cptr;
|
|
));
|
|
return SSTRUCT;
|
|
end
|
|
end
|
|
end. |