unit parserch ; {** @explan(说明)c头文件解析对外 接口 %% **} interface function pcstruct(s,f); function parserctokens(str); function chtotslclass(); (* //str := data(); //echo tostn(str22array(str)[:,3]); //for := 0 to length(str) do //return echo tostn(getgdihdata()); s := " typedef struct _GdiplusStartupInput { unsigned int GdiplusVersion; unsigned int DebugEventCallback; BOOL SuppressBackgroundThread; BOOL SuppressExternalCodecs; }GdiplusStartupInput; "; return echo tostn(parsercstruct(parserctokens(s))); rt := parsergdifunction(parserctokens(getgdihdata())); echo tostn(rt); *) Implementation function chtotslclass(); begin parsergdifunction(parserctokens(getgdihdata())); end function pcstruct(s,f); begin {** @explan(说明) 解析c结构体字符串到tsl结构化数据 %% @param(s)(string) c结构体字符串 %% @param(f)(bool) true 转换为小写 %% @return(array) tag字段为名称 field 为字段信息 n : 名称 t : 类型 一个数组如果 array(unsigned,int) l : 如果为数组 数组的长度 p : 如果为指针,指针的*个数 nick 别名 **} return parsercstruct(parserctokens(f?lowercase(s):s)); end function parsercstruct(tokens,indx); begin {** @explan(说明)结构体解析 %% **} //名称 //别名,可能多个 //内容 len := length(tokens); indx := indx ?: 0; ret := array(); while indxlen then return 0; if str[vpos]<> f[i]then begin bud := false; break; end end if bud then begin pos +=(fl-1); end return bud; end function findstringv(str,f,len,pos,zy,hl); begin {** @explan(说明)查找以f结尾的字符串 **} vs := ""; fl := length(f); while pos=",indx,"sym"); end else setvalue(ret,">",indx,"sym"); end else if vi="<" then begin setvalue(ret,vs,indx,"token"); vip := gdis[indx+1]; if vip="=" then begin indx++; setvalue(ret,"<=",indx,"sym"); end else setvalue(ret,"<",indx,"sym"); end else if vi="=" then begin setvalue(ret,vs,indx,"token"); vip := gdis[indx+1]; if vip="=" then begin indx++; setvalue(ret,"==",indx,"sym"); end else setvalue(ret,"=",indx,"sym"); end else if vi="[" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"[",indx,"sym"); end else if vi="]" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"]",indx,"sym"); end else if vi="&" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"&",indx,"sym"); end else if vi="*" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"*",indx,"*"); end else if vi="," then begin setvalue(ret,vs,indx,"token"); setvalue(ret,",",indx,","); end else if vi=";" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,";",indx,";"); end else if vi="(" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"(",indx,"("); end else if vi=")" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,")",indx,")"); end else if vi="{" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"{",indx,"sym"); end else if vi="}" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"}",indx,"sym"); end else if vi="|" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,vi,indx,"sym"); end else if vi="?" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,vi,indx,"sym"); end else if vi=":" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,vi,indx,"sym"); end else if vi="'" then begin setvalue(ret,vs,indx,"token"); vs := findstringv(gdis,"'",len,indx,"\\"); setvalue(ret,vs,indx,"'"); end else if vi='"' then begin setvalue(ret,vs,indx,"token"); vs := findstringv(gdis,'"',len,indx,'\\'); setvalue(ret,vs,indx,'"'); end else if vi="/" then begin setvalue(ret,vs,indx,"token"); vip := gdis[indx+1]; if vip="/" then begin indx += 1; vs := findstringv(gdis,"\n",len,indx,nil,"\r"); setvalue(ret,vs,indx,"//"); end else if vip="*" then begin indx += 1; vs := findstringv(gdis,"*/",len,indx,nil); setvalue(ret,vs,indx,"/*"); end else begin setvalue(ret,"/",indx,"/"); end end else if vi in kg then begin setvalue(ret,vs,indx,"token"); end else if vi="\n" then begin setvalue(ret,vs,indx,"token"); setvalue(ret,"\n",indx,"\n"); end else vs += vi; end setvalue(ret,vs,indx,"token"); return ret; //writetofile("",ret); //parsergdifunction(ret); end function nexttoken(tokens,indx,f); begin if not(f)then indx++; return tokens[indx]; end function backtoken(tokens,indx,f); begin if not(f)then indx--; return tokens[indx]; end function parsergdifunction(tokens); begin {** @explan(说明) 提取头文件函数 **} len := length(tokens)-1; indx :=-1; isyms := array("GDIPCONST","_In_","_Out_"); ret := array(); retl := 0; hst := array(); s := "type TGdiplusflat=class\r\n"; s += "{** @explan(说明)gdi+ 的c接口函数 %% **}\r\n"; zs := ""; while indx1)?"var ":"")+gzhparam(pn); ps += ":"+plx; pn := 0; ps += ";"; plx := 0; havlx := true; ddpoint := 0; end else if plx and(tvi="token")then begin pn := vi; end else if vi="*" then begin ddpoint++; if plx in array("integer","single","hbitmap")then begin ddpoint++; end else if plx="string" then begin end else plx := "pointer"; end else if havlx and lex[vi]then begin havlx := false; plx := lex[vi]; end else if havlx then begin havlx := false; plx := "pointer"; end else if vi="[" {or vi = "]"}or vi="&" then begin plx := "pointer"; end end if plx then begin if not(pn)then pn := dpn+inttostr(i); ps +=((ddpoint>1)?"var ":"")+gzhparam(pn)+":"+plx; end ret += ps; //echo tostn(array(tp,ct,fn)); ret += format(')%s;%s;external "gdiplus.dll" name "%s";',tp,ct,fn); //echo tostn(ret),"\r\n"; return ret; end function gzhparam(p); begin {** @explan(说明) 特殊参数名替换 **} if p="order" then return "order_"; else if p="unit" then return "unit_"; else if p="on" then return "on_"; return p; end function parenthesis(tokens,pos,len,iffunc,isyms); begin {** @explan(说明) 函数参数解析 **} ret := array(); retl := 0; tkv := ""; while pos